コルーティングには興味深い問題がいくつかあります。たとえば、未到達の凍結された目標を取り戻したいとします。しかし、巡回項をサポートしない Prolog システムには問題があります。すなわちフリーズ:
?- freeze(V, p(...V...)).
内部データ構造のループにつながります。簡単な回避策は、凍結された目標をカリー化することです。したがって、 predicate を使用する代わりに、次のように定義できるfreeze/2
predicateを使用します。guard/2
guard(V, C) :- freeze(V, call(C, V)).
しかし、どのように定義できますfreeze/2
かguard/2
? 新しい変数を導入しないため、明らかな定義は機能しません。また、クロージャに V が含まれているという問題がまだ残っています ((\)/2
がラムダ抽象化であるラムダ ライブラリを想定)。
freeze(V, G) :- guard(V, V\G).
さよなら