所以我想弄清楚一些從Prolog的東西,但我不知道爲什麼我得到我得到的結果。鑑於這樣的定義:Prolog查詢 - 試圖瞭解這個結果如何發生
families(_, Smith, lucy, _, jeff, Smith).
與此查詢:
?- families(Ford, nancy, Ford, jeff, Smith, White).
爲什麼是這樣的結果?:
Ford = lucy,
Smith = jeff,
White = nancy.
謝謝!
所以我想弄清楚一些從Prolog的東西,但我不知道爲什麼我得到我得到的結果。鑑於這樣的定義:Prolog查詢 - 試圖瞭解這個結果如何發生
families(_, Smith, lucy, _, jeff, Smith).
與此查詢:
?- families(Ford, nancy, Ford, jeff, Smith, White).
爲什麼是這樣的結果?:
Ford = lucy,
Smith = jeff,
White = nancy.
謝謝!
(A注:無需開通後和右括號前留有空格此外,如果這是家庭作業,你應該這麼說。)
的families/6
定義,
families(_, Smith, lucy, _, jeff, Smith).
說:
lucy
;jeff
。現在您的查詢,
?- families(Ford, nancy, Ford, jeff, Smith, White).
問:
Ford = lucy
(從3.定義)。nancy
?
White = nancy
(在定義從2)jeff
?
Smith = jeff
(來自定義中的4.)。這個現在應該是明確的,假設你知道如何統一的作品。重要的是,在定義和查詢變量名是在不同的上下文和具有相同名字的意思(在查詢中史密斯在位置2和6中的定義和史密斯在位置5)什麼都沒有。
總而言之,這是一個令人費解的例子,它使用變量和原子名稱試圖混淆讀者。它強制你注意,但可以作爲糟糕的編程風格的一個例子。
太棒了,謝謝。這不是作業,只是考試複習的一個例子:) –
至於the answer by Boris助視器,我們可以寫謂詞和查詢一個接一個的旁邊,
families(_ , Smith, lucy, _ , jeff , Smith).
?- families(Ford, nancy, Ford, jeff, Smith, White).
現在,Smith
的定義和查詢Smith
是不一樣!每個謂詞都有自己的「命名空間」,因爲謂詞的變量在謂詞的使用中被重命名。所以我們實際上這裏有
families(_ , A , lucy, _ , jeff , A ).
?- families(Ford, nancy, Ford, jeff, Smith, White).
相匹配,生產替代
_=Ford, A=nancy, lucy=Ford, _=jeff, jeff=Smith, A=White.
即
Ford=lucy, Smith=jeff, White=nancy.
最後一個是White=A
和A=nancy
後果。 A
本身沒有被報告,因爲它不是查詢的邏輯變量之一。
常量(所謂的原子)以小寫字母開頭。但有些名字以大寫字母開頭。把這些名字放在引號內。就像'史密斯' – false
哦,我不想得到不同的結果或任何東西。這是一個我們給定義和查詢的類的一個老例子,我們假設在紙上找出結果。我輸入它來查看結果會是什麼,但我不確定結果是什麼。 –
失敗....... – false