私はで遊んでたプロローグcoroutining述語freeze/2
とfrozen/2
:
?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).
sicstus-prolog(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))
私が期待していたのは、swi-prologバージョン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
3.8.5まで、この問題は存在しません。3.8.6以降には存在します。
—
false
@AntonDanilov。はい。しかし、私は太字の「目標= ...」の違いを実際に言及していました。
—
繰り返す
たぶん@PerMildnerが答えますか?
—
false