簡體   English   中英

Prolog-統一兩個有/無變量的列表

[英]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 因此, XY並不是問題。 問題是[]是一個常數,並且與表示[ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM