2013-11-25 42 views
2

所以我想弄清楚一些從Prolog的東西,但我不知道爲什麼我得到我得到的結果。鑑於這樣的定義:Prolog查詢 - 試圖瞭解這個結果如何發生

families(_, Smith, lucy, _, jeff, Smith). 

與此查詢:

?- families(Ford, nancy, Ford, jeff, Smith, White). 

爲什麼是這樣的結果?:

Ford = lucy, 
Smith = jeff, 
White = nancy. 

謝謝!

+1

常量(所謂的原子)以小寫字母開頭。但有些名字以大寫字母開頭。把這些名字放在引號內。就像'史密斯' – false

+0

哦,我不想得到不同的結果或任何東西。這是一個我們給定義和查詢的類的一個老例子,我們假設在紙上找出結果。我輸入它來查看結果會是什麼,但我不確定結果是什麼。 –

+0

失敗....... – false

回答

3

(A注:無需開通後和右括號前留有空格此外,如果這是家庭作業,你應該這麼說。)

families/6定義,

families(_, Smith, lucy, _, jeff, Smith). 

說:

  1. 忽略第一個參數和第四個參數(下劃線);
  2. 統一第二個和最後一個參數(兩個參數由相同的變量名稱,Smith);
  3. 統一第三個參數與原子lucy;
  4. 統一第五個參數與原子jeff

現在您的查詢,

?- families(Ford, nancy, Ford, jeff, Smith, White). 

問:

  • 你可以統一的第一和第三個參數使用同一個變量,福特
    • 是的,你可以,現在Ford = lucy(從3.定義)。
  • 第二個參數可以是原子nancy
    • 肯定的,和White = nancy(在定義從2)
  • 第四參數可以是所述原子jeff
    • 是的,但是這並沒有(在定義從1)任何影響
  • 你可以統一用變量史密斯第五個參數?
    • 是和Smith = jeff(來自定義中的4.)。

這個現在應該是明確的,假設你知道如何統一的作品。重要的是,在定義和查詢變量名是在不同的上下文和具有相同名字的意思(在查詢中史密斯在位置2和6中的定義和史密斯在位置5)什麼都沒有。

總而言之,這是一個令人費解的例子,它使用變量和原子名稱試圖混淆讀者。它強制你注意,但可以作爲糟糕的編程風格的一個例子。

+0

太棒了,謝謝。這不是作業,只是考試複習的一個例子:) –

2

至於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=AA=nancy後果。 A本身沒有被報告,因爲它不是查詢的邏輯變量之一。