2016-07-29 243 views
0

我正在進行一項練習,藉此我試圖使用= ..謂詞編寫一個過程,該過程刪除列表中PredName(X)失敗的所有元素並返回其餘列表作爲結果:使用Prolog = ..謂詞

filter(List, PredName, Result) 

在這種情況下與PredName被定義爲:

test(N) :- atom(N). 

例如:

?- filter([a,b,-6,7,A,-1,0,B], test, L). 
L = [a,b,-6,7,-1,0], 

我有以下,但我不知道爲什麼我一直結果與上面的例子中進行測試時得到錯誤:

test(N):- 
    atomic(N). 
filter([], _, []). 
filter2([H|T], PredName, [H|S]):- 
    Goal =.. [PredName, H],Goal,filter(T, PredName, S),!. 
filter([H|T], PredName, S) :- 
    filter2(T, PredName, S). 

我從here得到了上面的代碼。

+2

切割錯位。 – false

+0

你從另一個答案中得到了代碼,但是你沒有閱讀我下面的評論。 – false

回答

4

您是否嘗試過編譯的代碼?

我得到:

 
Clauses of filter/3 are not together in the source-file 

爲什麼?因爲你需要決定如何調用謂詞:要麼filter2/3filter/3。您目前正在使用兩個名稱。

而且,當你有這樣的代碼:

 
Goal =.. [PredName, H], 
Goal 

只需使用call/2代替。例如,上面可以等效寫成:

 
call(PredName, H) 

總結:

  • 決定謂語名稱,並堅持下去
  • 使用(=..)/2這樣案例
  • 使用call/2
+0

是的,編譯它。知道了,直到我第二次編譯它 - 沒有再次得到它。此外,我會使用call/2,但練習的目的是嘗試使用= .. –

+1

我知道你必須使用'(= ..)/ 2',但我仍然想提及'在這種情況下,call/2'更合適,因此閱讀這些內容的教師有機會在將來進行更有用的練習。有很多很好的練習,使用'(= ..)/ 2'確實有意義,但這絕對不是其中之一。 – mat

+0

公平點。無論如何,謝謝你提出的改變。 –

0

修正了它。有一個我之前沒有注意到的命名問題。 將過濾器2重命名爲過濾器並工作。

+1

與其將此添加爲答案,您應該接受mat的答案,因爲他指出了命名問題。 – lurker