[英]Prolog - unifying two lists with/without variables
此Prolog代碼返回:
?- [a,b,c,d] = [a|[b,c,d]].
真正
還有這個
?- [X,Y] = [a|[b,c,d]].
返回false。
我並不完全理解為什么[X, Y]
是錯誤的。 跟蹤在這里沒有幫助。 我希望以下任務能夠舉行
X = a
Y = [b,c,d]
這個說法是正確的。
是什么|
除了在頭和尾巴上劈開呢?
Prolog中的列表被實現為函子的鏈接列表。 如果您編寫類似[a, b, c, d]
。 實際上看起來像:
+-------+
| (|)/2 |
+---+---+ +-------+
| o | o---->| (|)/2 |
+-|-+---+ +---+---+ +-------+
v | o | o---->| (|)/2 |
a +-|-+---+ +---+---+ +-------+
v | o | o---->| (|)/2 |
b +-|-+---+ +---+---+
v | o | o----> []
c +-|-+---+
v
d
或Prolog表示法[a | [b | c | [d | [] ] ] ]
[a | [b | c | [d | [] ] ] ]
[a | [b | c | [d | [] ] ] ]
。 逗號分隔的列表是語法糖 :如果您編寫[a, b, c, d]
,則Prolog解釋器會將其轉換為上述表示形式。
由於[b, c, d]
等於:
[ b | [ c | [ d | [] ] ] ]
因此[ a | [b, c, d] ]
[ a | [b, c, d] ]
因此等於
[a | [b | c | [d | [] ] ] ]
但是列表[X, Y]
等於
[X, Y] == [ X | [ Y | [] ] ]
或以結構方式:
+-------+
| (|)/2 |
+---+---+ +-------+
| o | o---->| (|)/2 |
+-|-+---+ +---+---+
v | o | o----> []
X +-|-+---+
v
Y
如果我們將其與[a | [b | c | [d | [] ] ] ]
[a | [b | c | [d | [] ] ] ]
[a | [b | c | [d | [] ] ] ]
這意味着“外”殼可以被匹配,因此X = a
,但隨后Y = b
,和[] = [ c | [ d | [] ] ]
[] = [ c | [ d | [] ] ]
[] = [ c | [ d | [] ] ]
。 最后一部分不匹配,因此返回false
。 因此, X
和Y
並不是問題。 問題是[]
是一個常數,並且與表示[ c | [d] ]
的函子不匹配[ c | [d] ]
[ c | [d] ]
。
例如,如果我們統一[ X | Y ] == [a, b, c, d]
[ X | Y ] == [a, b, c, d]
我們得到:
?- [ X | Y ] = [a, b, c, d].
X = a,
Y = [b, c, d].
綜上所述,可以說|
本身什么也不做。 就像f(1, 2)
一樣,它是一個函子。 在Lisp中,他們為此使用了cons
[wiki] ,為空列表使用了nil
。 因此[1, 4, 2, 5]
1,4,2,5 [1, 4, 2, 5]
在Lisp中看起來像cons 1 (cons 4 (cons 2 (cons 5 nil)))
,在Prolog中看起來像cons(1, cons(4, cons(2, cons(5, nil))))
。 寫起來有點麻煩。 實際上,逗號分隔的符號更像是“魔術”部分。 Prolog僅對列表執行統一,就像對其他函子和常量一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.