2014-05-16 73 views
1

我想在Prolog中正確接受一個項目,一個列表和一個數字,並檢查項目是否在列表中的次數。例如在Prolog中遇到謂詞問題

count(7,[3,7],X). 

將返回X=1

count(7,[3,7],1). 

將返回true

這是我迄今爲止

count_occur(A,[0|B],D). 
count_occur(A,[A|C],D) :- count_occur(A,C,D1), D is D1+1. 
count_occur(A,[B|C],D) :- count_occur(A,C,D). 

我很新的序言和真正努力理解這種編程範式。

我想要做的是查看列表中的第一個項目是否與傳入值(A)匹配,如果確實增加了D並且再次檢查列表的其餘部分。無論如何,這是我在lisp或其他語言中的做法。真的可以使用一些幫助,一直在這一段時間,它只是不點擊我。

+0

第一行的目的是什麼?而且你必須處理有空列表的情況。 –

回答

1

我沒有序言,現在來測試它,但我會嘗試這樣的:

count_occur(A, [], 0). 
count_occur(A, [A|T], D):- count_occur(A, T, D1), D is D1 + 1. 
count_occur(A, [B|T], D):- A \= B, count_occur(A, T, D). 

的想法是,如果列表爲空,則是0次出現的每個元素。剩下的幾乎和你的一樣,因爲我認爲它是正確的。

唯一的區別是我添加了A \= B,這應該意味着A \neq B。我認爲否則它會接受A == B,這可能導致count_occur(3, [3], 0).成立。你應該檢查一下。

我希望這有助於!

+0

嘿非常感謝你的工作! A/= B部分雖然沒有必要,所以這意味着我需要改變我的第一個事實才能使其工作。我現在可以看到如何在基本情況下將D改爲0,但我很好奇prolog如何解決列表中只有一個項目的情況。是不是像count_occur(7,[7],X)這樣的調用沒有適用於它的規則,因爲列表中不會有兩個值綁定到B和T或A和T?它有效,但我不太明白怎麼來。 – user3538411

+0

那麼,據我記憶[7]相當於[7 | []],所以它是這個第二條規則。至於'A/= B',至少我給出的實現是 ? - count_occur(3,[3],0)。 爲真。 我認爲這是不正確的。 –