2013-07-10 63 views
2

如果我的術語是關閉的,我已經提前申請了一個術語,從我接觸Prolog開始已經有幾年了,我決定嘗試清除我的序列帽,並再次探索的。將術語的值轉換爲原子

我會直接進入代碼,然後通過事後描述問題。此代碼不是我的情況的確切主題。

mammal :- true. 
reptile :- true. 

animals_that_are(_,_) :- 
    write('Not found!'), 
    nl, 
    false. 

animals_that_are(mammal, L) :- 
    L = [lion, elephant, dog]. 

animals_that_are(reptile, L) :- 
    L = [lizard, turtle]. 

does_animal_belong_to_group(Species, Group) :- 
    animals_that_are(Group, Animals), 
    member(Species, Animals). 

所以基本問題是,當調用does_animal_belong_to_group(lion, mammal)時,文本Not Found!被顯示並失敗,向我暗示,原子哺乳動物和獅子正在轉化爲術語,因此不會與他們各自的規則相關聯。

當我直接調用兩個規則,我得到預期的結果

animals_that_are(reptile, L). 
L = [lizard, turtle]. 

有沒有一種方法,一個原子可以通過一個學期獲得通過,在這種情況下,則原子重新提取或很我解決這個錯誤的方式?

回答

1

我想你是不是有必要做更復雜:

animals_that_are(mammal, [lion, elephant, dog]). 
animals_that_are(reptile, [lizard, turtle]). 

does_animal_belong_to_group(Animal, Group) :- 
    animals_that_are(Group, Animals), 
    member(Animal, Animals). 

?- does_animal_belong_to_group(lion, mammal). 
true ; 
false. 

另外,我會改變風格這些事實,試探,謂詞命名應該反映參數的位置:

animals_group([lion, elephant, dog], mammal). 
+0

當然,這是有道理的。我所做的事情看起來很複雜,並且知道我已經把事情搞糟了,因爲它曾經有一段時間,因爲我甚至觸及了一種沒有程序的語言。感謝您的建議和解釋! –

+1

那些縮寫「哺乳動物: - 真實」表明你正在嘗試一些*更復雜的事情。最終,隨時跟進這個問題...... – CapelliC

+0

當然。我不確定它是否有必要,但我實際上是用它來作爲原子的*聲明。然而,正如我在閱讀我的一些舊的uni筆記,似乎我實際上並不需要預先聲明事情。 –