kprolog K-Prolog Compiler Version 6.0

循環する項の扱い

循環する項とは、複合項が木の形でなく内部に自分自身と単一化された変数を持つような項で、version6以前ではサポートしておりませんでしたので循環する項同士の単一化が無限ループに入るなどの問題がありました。国際標準では循環する項を扱うことはオプションですが、性能上の不利益をほとんど発生しないことがわかりましたので、K-Prologではversion6から採用することにいたしました。
各種Prologの処理系では、循環する項の扱いが3種類規定されています。

K-Prologは、version5 まで、unsafe でしたが、version6 から cyclic になるよう仕様を変更しました。

循環する項を生成する場面としては、次のような単一化が考えられます。

[例]
 ?- X = f(X), Y = f(Y), X = Y.
 ?- g(X,Y,X) = g(f(X),f(Y),Y).
循環する項は、項としての比較をすることができます。
[例]
 ?- X = f(X), Y = f(Y), X == Y.
 ?- X = f(X,1), Y = f(Y,2), X @< Y.
循環する項は、項として記録することができます。
[例]
 ?- X = f(X), asserta(p(X)). 
 ?- X = [1,2,3|X], setval(x123,X).
項が循環する項であるかどうか、次の述語で判定できます。
 cyclic_term(Term): Term が循環する項であるときに限り成功します。
 cyclic(Term): cyclic_term/1 と同じです。
 acyclic_term(Term): Term が循環しない項であるときに限り成功します。


一つ上に戻る 目次に戻る