您參考頁說, 「請考慮以下事實。
p([H|T], H, T).
」
因此,我們必須把它當作一個事實。這意味着,它就像具有判定
p([H|T], H, T):- true. % or, p(L,H,T) :- L=[H|T].
現在,當你查詢p([a,b,c], X, Y).
,一個是把除了其他:
p([a,b,c], X, Y). % a query
p([H|T], H, T) :- true. % a rule's clause: _head_ :- _body_.
的等價都指出:[a,b,c] = [H|T]
,X = H
,Y = T
和統一處理方程。第一個被進一步轉化爲
a = H % list's head element
[b,c] = T % list's tail
因爲[A|B]
代表名單與A
列表頭元素,B
列表的尾,即所有元素的其餘部分,除了頭。 H
和T
是這些邏輯變量的常見助記符名稱。
所以總體來說,我們得到X = H = a
,Y = T = [b,c]
。
這個過程是什麼所謂的查詢和規則的頭部統一(兩件事情開始了p
「函子」,都具有3「論據」)。由於查詢和規則的「子句」匹配的頭部(具有相同的函數和相同數量的參數)以及它們的參數都成功統一,所以使用上述替換,我們只需要證明該規則的條款(因此被選中)的主體。
由於它是true
,我們立即成功,並取得了成功的替代效果。
這就是Prolog的工作原理。
TL; DR:是的,當你調用p(L,H,T)
給定的名單L
,這將是解構到其頭部H
和尾部T
。但你可以用給定的清單T
,值H
和變量L
來稱呼它,然後從頭部和尾部構建的新清單將被構建爲。如果還給出L
,則會檢查其頭部是否爲H
,其尾部是T
。
這是因爲Prolog的統一是雙向的:A = B
與B = A
相同。與變量統一就像設置變量一樣,並且與值統一就像檢查(結構)與該值的相等性。
調用p(L,H,T)
實際上等同於統一L = [H|T]
。