frozen / 2の予期しない動作


11

私はで遊んでた述語freeze/2frozen/2

?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).

(x86_64のバージョン4.5.1)はこれらの答えを出しました:

| ?-freeze(X、a = a)、frozen(X、Goal)。
目標= prolog:freeze(X、user:(a = a))、
prolog:freeze(X、user:(a = a))?;
番号
| ?-freeze(X、a = a)、freeze(Y、b = b)、X = Y、frozen(X、Goal)。
Y = X、
目標=(user:(a = a)、prolog:freeze(X、user:(b = b)))、
prolog:freeze(X、user:(a = a))、
prolog:freeze(X、user:(b = b))?;
番号

今は期待していませんでした!Goal = prolog:freeze(X,user:(a=a))

期待していたのは、バージョン8.0.3で与えられたような答えです。

?-freeze(X、a = a)、frozen(X、Goal)。
目標= user:(a = a)、
freeze(X、a = a)。
?-freeze(X、a = a)、freeze(Y、b = b)、X = Y、frozen(X、Goal)。
X = Y、
目標=(ユーザー:(a = a)、ユーザー:(b = b))、
フリーズ(Y、a = a)、
フリーズ(Y、b = b)。

間違いなく、SICStusの回答 SWIの回答の両方が正しい...

しかし、SICStusによって与えられたいくぶん奇妙な答えに深い理由はありますか?


1
SicstusのAFAIKでは、「最後の障害」をマスキングする機能が実装されていません `?; no`
アントンダニロフ

1つは、明示的な修飾が​​推奨されます。
false

1
3.8.5まで、この問題は存在しません。3.8.6以降には存在します。
false

@AntonDanilov。はい。しかし、私は太字の「目標= ...」の違いを実際に言及していました。
繰り返す

1
たぶん@PerMildnerが答えますか?
false

回答:


6

違いに「深い」理由があるかどうかはわかりません。frozen/2は属性付き変数への一般的なインターフェースなので、特別な場合のfreeze/2目標ではないのは理にかなっています。

実際、4.5.1までは、SICStusは特別なケースのfreeze/2目標を達成しようとしましたが、失敗することもありました。これがuser:(a=a)、最初のサブゴールに表示される理由です。次のリリースでは、これを変更して、結果が代わりになるようにしましたGoal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))(また、他にもいくつかの改良を加えましたfrozen/2)。


4,5,1までと3.8.5の後
偽の
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.