簡體   English   中英

使用管道(|)時列表中的統一順序

[英]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] 

如果該映射是可能的(即,如果變量IYXZ綁定到允許統一成功的術語)

在這種情況下,假設所有變量都是unbound ,那么:

  • 變量IX將成為“同一個變量”(更明確地說,變量名IX將指定同一個空存儲單元)

  • 變量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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM