2016-09-05 6 views

答えて

1

この「通常」の場合は完全に正しいといえます。

しかしながら、効率の理由ため、Prologの実装は、典型的には、チェックを発生し、従って環状 用語いわゆる合理 ツリー統一によってを可能にする、そのような場合には幾分予想外の結果をもたらすことができる省きます。

 
?- unify_with_occurs_check(X, f(X)). 
false. 

特に、SWI-Prologで、そこにある:あなたはおそらくそれを知っているよう

 
?- X = f(X). 
X = f(X). 

あなたは構文の統一を実行するためにISO述語unify_with_occurs_check/2を使用することができます。

は、より単純なケースを参照してください。フラグoccurs_checktrueに設定して、すべてのの一致チェックを有効にすることができます。この非常に強力かつ貴重な機能です:

 
?- 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. 

関連する問題