2

コルーティングには興味深い問題がいくつかあります。たとえば、未到達の凍結された目標を取り戻したいとします。しかし、巡回項をサポートしない Prolog システムには問題があります。すなわちフリーズ:

 ?- freeze(V, p(...V...)).

内部データ構造のループにつながります。簡単な回避策は、凍結された目標をカリー化することです。したがって、 predicate を使用する代わりに、次のように定義できるfreeze/2predicateを使用します。guard/2

 guard(V, C) :- freeze(V, call(C, V)).

しかし、どのように定義できますfreeze/2guard/2? 新しい変数を導入しないため、明らかな定義は機能しません。また、クロージャに V が含まれているという問題がまだ残っています ((\)/2がラムダ抽象化であるラムダ ライブラリを想定)。

 freeze(V, G) :- guard(V, V\G).

さよなら

4

0 に答える 0