我一直在閱讀本教程的Prolog的列表,以及如何從列表中得到具體的元素,我碰到這個例子就是:正從列表中特定元素的Prolog
?- [_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z].
X = dead(z)
Y = []
Z = _9593
什麼我不明白的是,他們在哪裏得到變量Z的值_9593?
我一直在閱讀本教程的Prolog的列表,以及如何從列表中得到具體的元素,我碰到這個例子就是:正從列表中特定元素的Prolog
?- [_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z].
X = dead(z)
Y = []
Z = _9593
什麼我不明白的是,他們在哪裏得到變量Z的值_9593?
下劃線意味着我們不關心變量和int你的榜樣
[_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z].
我們第一個下劃線分配給[]
,然後X
被分配到分配給[2. [b.c]]
dead(z)
然後第二個下劃線,然後Y
分配給[]
然後尾部是下劃線,這是我們不在乎什麼,但因爲你有Z
變量在右側,它分配_
到Z
和Prolog的方式做這是引入任意變量開始_something
,在你的情況下它的_9593
。畢竟你不應該擔心,因爲你不在乎什麼是下劃線。
我對@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相同的信息給出了,但詞彙略有不同,這裏爲您的娛樂。
Z = _9593
這只是一個自動生成的唯一變量名。規則和事實中的變量必須(一致地)重命名,以確保唯一性。如果我們在兩個不相關的查詢中使用Z
,那麼這兩個變量是不相關的,因此必須有不同的名稱。
你可以看到一個簡單的目標同樣的效果,
1 ?- Z=Z.
Z = _G213
Yes
2 ?- write(Z).
_G236
Z = _G236
213
,9593
只是一個由特定的Prolog實現方式維護一些內部計數器的反射。領先的下劃線通常表示它是一些一次性變量。
對不起,我的意思是真正的統一而不是分配 – Templar 2013-03-21 21:05:26