[英]Order of unification in lists when using pipe(|)
我很難弄清楚統一的順序是什么。 我有以下查詢:
[X, like | Z] = [I, Y, Prolog, language].
這給了我以下結果:
X = I,
Z = [Prolog, language],
Y = like.
然而,我所期待的是:
X = I,
Y = like,
Z = [Prolog, language].
Prolog 統一條款是否有任何特定順序?
編輯:我有一種感覺,Prolog an atom with a variable
a variable with an atom
。 是這樣嗎?
沒有順序。 這是執行的映射:
[I, Y , Prolog, language].
| | +--------------+
| | |
[X, like | Z]
如果該映射是可能的(即,如果變量I
, Y
, X
, Z
綁定到允許統一成功的術語)
在這種情況下,假設所有變量都是unbound ,那么:
變量I
和X
將成為“同一個變量”(更明確地說,變量名I
和X
將指定同一個空存儲單元)
變量Y
會變成 atom like' (more clearly, the storage cell designated by variable name
will be set to
like`)
變量Z
占據了“列表的其余部分(或后綴)”( |
后面的所有內容),並將成為復雜的術語“[Prolog,語言]”。
變量Prolog
未更改並保持原樣。
Prolog 頂層可以隨意訂購答案替換。 並且答案替換的順序並不能告訴您統一完成的順序。 您可以通過使用 freeze/2 來了解統一順序:
Welcome to SWI-Prolog (threaded, 64 bits, version 8.3.17)
?- freeze(X, (write('X='), write(X), nl)),
freeze(Y, (write('Y='), write(Y), nl)),
[X|Y] = [foo|bar].
X=foo
Y=bar
X = foo,
Y = bar.
?- freeze(Y, (write('Y='), write(Y), nl)),
freeze(X, (write('X='), write(X), nl)),
[X|Y] = [foo|bar].
X=foo
Y=bar
Y = bar,
X = foo.
至少你看到 freeze 協程是在統一模式之后而不是在它們被引入的方式之后被調度的,頂層也是如此。 最有可能在 SWI-Prolog 中, freeze/2 結果告訴您如何執行統一的順序。
但據我所知,ISO 核心標准不需要特定的順序。 在這方面,其他 Prolog 系統可能具有除 SWI-Prolog 之外的其他偏好。 但我欠你一份支持這一說法的參考資料。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.