2013-03-21 44 views
1

我一直在閱讀本教程的Prolog的列表,以及如何從列表中得到具體的元素,我碰到這個例子就是:正從列表中特定元素的Prolog

?- [_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z]. 

    X = dead(z) 
    Y = [] 
    Z = _9593 

什麼我不明白的是,他們在哪裏得到變量Z的值_9593?

回答

1

下劃線意味着我們不關心變量和int你的榜樣

[_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z]. 

我們第一個下劃線分配給[],然後X被分配到分配給[2. [b.c]]dead(z)然後第二個下劃線,然後Y分配給[]然後尾部是下劃線,這是我們不在乎什麼,但因爲你有Z變量在右側,它分配_Z和Prolog的方式做這是引入任意變量開始_something,在你的情況下它的_9593。畢竟你不應該擔心,因爲你不在乎什麼是下劃線。

2

我對@Timplar的解釋感到擔憂,儘管技術細節是正確的,但我擔心讓術語變得正確。

這裏沒有分配。只有統一。我們要求Prolog在這裏做的是統一[_, X, _, Y|_][[], dead(z), [2, [b, c]], [], Z]。這是沒有結果哪一方有值或變量。而不是想象Prolog走在左邊,然後走到右邊,當它不能繼續時,想象列表被壓縮在一起可能會更安全。

首先,Prolog試圖使用[]來統一_。這個微不足道的成功,因爲_意味着「我不在乎」。這種統一沒有建立任何約束力。

接下來,Prolog嘗試使用dead(z)來統一X.這個微不足道的成功,因爲X是未綁定的,並且這建立了一個綁定,X = dead(z)。因爲這個變量不是以下劃線開頭的,所以Prolog的數字你會對這個綁定感興趣,所以它會把它報告給你。

接下來,Prolog試圖統一_與[2, [b, c]]。再次,這種平凡的成功沒有建立約束力。接下來,Prolog試圖用[]將Y統一,但是這次又成功地建立了它向你報告的綁定Y = []。

在下一步之前,您必須進行符號更改。在Prolog中,[X|T]是以X開始並以T繼續的列表。因此,[X|_]將X與列表的第一個元素相結合並丟棄尾部。所以在這種情況下,|_]基本上說,這個清單可能還有更多,但我不在乎知道它是什麼。 (順便說一下,空列表將匹配。)

接下來,Prolog試圖統一匿名尾部|_與Z.這又一次成功,因爲Z沒有綁定。 Prolog創建了一個匿名變量並將其綁定到Z,所以這建立了一個綁定。

因此,與@Templar相同的信息給出了,但詞彙略有不同,這裏爲您的娛樂。

+0

對不起,我的意思是真正的統一而不是分配 – Templar 2013-03-21 21:05:26

2
Z = _9593 

這只是一個自動生成的唯一變量名。規則和事實中的變量必須(一致地)重命名,以確保唯一性。如果我們在兩個不相關的查詢中使用Z,那麼這兩個變量是不相關的,因此必須有不同的名稱。

你可以看到一個簡單的目標同樣的效果,

1 ?- Z=Z. 

Z = _G213 

Yes 
2 ?- write(Z). 
_G236 

Z = _G236 

2139593只是一個由特定的Prolog實現方式維護一些內部計數器的反射。領先的下劃線通常表示它是一些一次性變量。