2013-04-11 54 views
0

我不太瞭解,如何理解這個事實p([H|T], H, T)。我知道C/C++/Java等,但這看起來不一樣。所以當我將第一個參數傳遞給「函數」p時,它將它分離爲H和T,並通過這個變量來訪問它?我不知道如何從邏輯上理解這一點。序言 - 如何理解列表

http://www.doc.gold.ac.uk/~mas02gw/prolog_tutorial/prologpages/lists.html

p([H|T], H, T). 


Lets see what happens when we ask some simple queries. 

?- p([a,b,c], X, Y). 

X=a 


Y=[b,c] 


yes 

回答

1

您參考頁說, 「請考慮以下事實。

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 = HY = T和統一處理方程。第一個被進一步轉化爲

a = H       % list's head element 
[b,c] = T      % list's tail 

因爲[A|B]代表名單與A列表元素,B列表的,即所有元素的其餘部分,除了頭。 HT是這些邏輯變量的常見助記符名稱。

所以總體來說,我們得到X = H = aY = T = [b,c]

這個過程是什麼所謂的查詢和規則的頭部統一(兩件事情開始了p「函子」,都具有3「論據」)。由於查詢和規則的「子句」匹配的頭部(具有相同的函數和相同數量的參數)以及它們的參數都成功統一,所以使用上述替換,我們只需要證明該規則的條款(因此被選中)的主體。

由於它是true,我們立即成功,並取得了成功的替代效果。

這就是Prolog的工作原理。

TL; DR:是的,當你調用p(L,H,T)給定的名單L,這將是解構到其頭部H和尾部T。但你可以用給定的清單T,值H和變量L來稱呼它,然後從頭部和尾部構建的新清單將被構建爲。如果還給出L,則會檢查其頭部是否爲H,其尾部是T

這是因爲Prolog的統一是雙向的:A = BB = A相同。與變量統一就像設置變量一樣,並且與值統一就像檢查(結構)與該值的相等性。

調用p(L,H,T)實際上等同於統一L = [H|T]

1

在Prolog中,我們有關係,與關係DB相似。

然後P/3這是一個關係一個列表(第一自變量)中,它的頭部和H尾巴T

適當的教程'作者使用描述性和合成符號作爲變量。

在語法上,變量符號開始大寫,並能得到任何價值,但只有一個時間(即,不能被「重新分配」)。