我是 Prolog 的新手。從字面上看,這周。我正在尋找一個遞回 Prolog 謂詞,它接受兩個數字 X,Y 作為輸入。它應該輸出到篩選所有小于或等于 X 且可被 Y 整除的數字的串列。
在過去的幾天里,我一直在研究這個問題,并且非常困惑。我首先嘗試將 Y 分為 1,在螢屏上顯示它,然后重復該程序。任何人都可以提供有關使其正常作業的提示。一旦我明白了,我將嘗試確保這些小于或等于 X。
到目前為止,我有以下內容,這可能是完全錯誤的。任何幫助表示贊賞。如果格式不好,請道歉。
divide(X, Y) :-
S is 1,
Z is Y / S,
S is S 1,
write(Z),
divide(X, Y).
uj5u.com熱心網友回復:
除以 3 的小于 20 的數字從 3、6、9... 開始,即從除數 3 開始,然后每次加 3,直到超過分界線。
例如
countup(X, Y, Counter) :- % if the counter is below the limit,
Counter =< X,
writeln(Counter), % print it.
Next is Counter Y, % count up by Y, e.g. 3
countup(X, Y, Next). % loop.
countup(X, _, Counter) :- % if the counter is past the limit,
Counter > X. % stop.
divide(X, Y) :- % start counting from Y, e.g. 3
countup(X, Y, Y).
在您的代碼中,這一行:
S is S 1
您是在說“如果 2 是 3,請繼續”,Prolog 會說“不是,案例關閉,停在這里”并結束您的程式。當您執行 S 1 時,您需要為結果使用一個新變數。只有 Prolog 系統可以改變變數,你不能(簡化)。
這是一個無限回圈的形狀:
divide(X, Y) :-
____,
____,
divide(X, Y).
X 和 Y 永遠不會改變,所以每次都是同一個呼叫;如果它超過了 S=S 1,那么它將永遠回圈下去。
這個形狀:
divide(X, Y) :-
S is 1,
____,
divide(X, Y).
如果它按照您的嘗試作業,它將每次將 S 重置為 1。
由于您需要一些案例來處理回圈和一些案例來處理停止,以及一些通過限制的測驗以及通過回圈傳遞 S 的東西,并且我想要單詞作為變數名,所以您的短代碼很快就會變成我更長的代碼即使它沒有做更多的事情。
(我沒有從 X 開始除以,因為這意味著 X 必須是 Y 的倍數。我認為您應該能夠要求小于 10 且可被 9 整除的數字并得到 9 而無需處理10/9=1.11...)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/486352.html
下一篇:鏈接到嵌套字典的元組串列
