2017-09-23 80 views
1

我試圖做這個練習,我應該建立一個prolog程序,當給定一個數字和一個列表時,返回一個沒有數字倍數的列表。現在我做了這個:在Prolog中刪除倍數

removeMultiples([],[]). 
removeMultiples(N, [Head|Tail], Result):- 
    Head mod N =:= 0, 
    removeMultiples(N, Tail, Result). 
removeMultiples(N, [Head|Tail], [Head|Result]):- 
    Head mod N =\= 0, 
    removeMultiples(N, Tail, Result). 

它不起作用,我真的不明白爲什麼。
我希望有人能解釋爲什麼這不起作用。
謝謝

+0

「不起作用「不會讓我們指出問題,請更新您的問題以準確解釋您的意思,例如你是否遇到錯誤,代碼是否失敗,是否給出了意想不到的結果等? – FluffyKitten

回答

3

簡短回答:第一個子句只有兩個參數。

您在removeMultiples/3上進行遞歸調用:每次調用同一個謂詞removeMultiples/3時。這樣你可以枚舉兩個列表。但最終你會達到名單的末尾。

但是第一個子句是關於謂詞removeMultiples/2的謂詞。所以,你需要添加第三個參數

removeMultiples(_,[],[]). % three arguments 
removeMultiples(N, [Head|Tail], Result):- 
    Head mod N =:= 0, 
    removeMultiples(N, Tail, Result). 
removeMultiples(N, [Head|Tail], [Head|Result]):- 
    Head mod N =\= 0, 
    removeMultiples(N, Tail, Result).

現在生產:

?- removeMultiples(3, [1,2,3,4,6,7,8,9,15,3,1], Result). 
Result = [1, 2, 4, 7, 8, 1] ; 
false. 
+1

哦哇......我盯着幾個小時,只是沒有得到它哈哈。非常感謝! – Melanie

2

如果使用SWI-Prolog的,你可以有一個functionnal設計:

:-use_module(library('lambda.pl')). 

removeMultiples(N, In, Out) :- 
    exclude(N+\X^(X mod N =:= 0), In, Out).