2
このクエリの場合に置換X = Y, Y = [Y]
が保持されるのはなぜですか[f(X)|Y] = [f(Y),X]
? X
はどのようにしてY
と[Y]
と同時にできますか?なぜこの置換はPrologで保持されますか?
このクエリの場合に置換X = Y, Y = [Y]
が保持されるのはなぜですか[f(X)|Y] = [f(Y),X]
? X
はどのようにしてY
と[Y]
と同時にできますか?なぜこの置換はPrologで保持されますか?
この「通常」の場合は完全に正しいといえます。
しかしながら、効率の理由ため、Prologの実装は、典型的には、チェックを発生し、従って環状 用語いわゆる合理 ツリー統一によってを可能にする、そのような場合には幾分予想外の結果をもたらすことができる省きます。
?- unify_with_occurs_check(X, f(X)). false.
特に、SWI-Prologで、そこにある:あなたはおそらくそれを知っているよう
?- X = f(X). X = f(X).
あなたは構文の統一を実行するためにISO述語unify_with_occurs_check/2
を使用することができます。
は、より単純なケースを参照してください。フラグoccurs_check
をtrue
に設定して、すべてのの一致チェックを有効にすることができます。この非常に強力かつ貴重な機能です:
?- set_prolog_flag(occurs_check, error). true. ?- X = f(X). ERROR: =/2: Cannot unify _G937 with f(_G937): would create an infinite tree:あなたもチェックを発生する対象、あなたのプログラムが STOある場合をキャッチするために
error
にフラグを設定することができます
?- set_prolog_flag(occurs_check, true). true. ?- X = f(X). false.