2013-10-29 55 views
0

我是序言新手。 我在我的大學參加AI課程,所以我們不能使用先進的Prolog功能:只需簡單的事實和超簡單的規則。基本序言規則創建

我有一些麻煩,這兩個句子轉換爲Prolog的條款:

  1. 大家誰愛所有的動物是由人的喜愛。
  2. 任何殺死動物的人都不會被任何人所喜愛。

我總算寫第二個這樣的:

loves(X, Y) :- animal(A), \+killed(Y, A).

但即使是這一個,我肯定這是不完全正確:這個規則告訴大家誰沒有殺死動物,每個人都喜歡,這與我想表達的相反。

任何幫助?

+1

什麼是** **事實(正的知識),你有嗎? – CapelliC

回答

1

你研究過謂詞演算,量詞的邏輯嗎?

這兩個陳述在Prolog中表達的真值有問題。第一個假設對於所有熱愛「所有動物」的Y而言,存在着一個愛X的人,但卻沒有告訴我們如何「構造」X.第二個人表達了對否定性聲明的理解:「任何殺死動物的人沒有人愛過。「

潛在地,你可能擁有表達所有人的知識,誰愛誰,誰愛所有動物,誰殺死動物。然後你可以寫查詢,檢查1,2是否成立。這與試圖用規則和事實來斷言1,2的真相不同。

1

你重寫了你的問題與對手。好。

  1. X愛Y意味着B沒有殺死C,C是動物。

但你表達了它作爲所有其他條件的分離。而應該定義

killed_no_animal(Y) :- forall(animal(A), \+killed(Y, A)). 

並使用killed_no_animal作爲必要條件的所有其他謂詞:

loves(X, Y) :- killed_no_animal(Y), other predicate. 
loves(X, Y) :- killed_no_animal(Y), other predicate. 
+0

請注意,如果存在*一些動物'A','Y'沒有殺死,'killed_no_animal/1'成功,可能不是意圖。量詞在Prolog中很棘手,部分原因是它們被隱式表達。 – hardmath

+0

對,我忘了。自從我上次使用Prolog以來已經很長時間了。更正了'forall'。 –

+0

啊,這很好(使量化明確)。 – hardmath