2015-04-16 54 views
0

我想進一步理解Prolog,以及它如何處理列表統一。所以我堅持這個例子,我知道答案,因爲我執行的代碼,但我不明白它是如何工作的。序言列表統一

[X,a,X,f(X,a)|Y] = [Z,Z|Y] 

答案是:

X=Z 
Z=a 
Y=_ 
L=[a,f(a,a)|Y] 

我知道,頭與其他頭相結合,所以如果我做出一些改變,像這樣的:

let C=[X,a,X,f(X,a)] 
let D=[Z,Z] 

和統一,應去這裏:

[C|Y]=[D|L] 

所以Y必須等於L,而不是_,對不對?有人能更好地解釋我並糾正我的錯誤嗎?

+2

在SWI-Prolog上,它給出了'X = Z,Z = a,Y = [a,f(a,a)| Y]'這是我預期的結果。 – hynner

+0

L從哪裏來?在SWI-Prolog上,它給出L = [a,f(a,a)| Y],但我不知道如何提出這個解決方案。 – Teo

+2

正如我所說,在我的SWI-Prolog上沒有L :-) – hynner

回答

0

沒有什麼特別的或獨特的關於名單。列表僅僅是數據結構./2。 Prolog的列表符號僅僅是語法糖。簡而言之:

  • []是一個原子並表示空列表。
  • [a]完全等同於.(a,[])
  • [a,b]完全等同於.(a,.(b,[]))

頭/尾構造[Head|Tail]同樣語法糖:

  • [H|T]是完全等同於.(H,T)

用點符號替換列表符號和您的謂詞將完全相同。只是不方便。

See my answer here for details

0

請說明您與口譯員的實際互動情況。

例如,

$ swipl 
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.1.36-18-ga5e157c) 
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam 
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, 
and you are welcome to redistribute it under certain conditions. 
Please visit http://www.swi-prolog.org for details. 

For help, use ?- help(Topic). or ?- apropos(Word). 

?- [X,a,X,f(X,a)|Y] = [Z,Z|Y]. 
X = Z, Z = a, 
Y = [a, f(a, a)|Y]. 

(請注意,現在Y是一個循環的術語。)

如果你表現出它是什麼,你實際上做,它可能是更容易幫助你。只需編輯你的問題。