1

私は次のコードを持っています:

internal_generator(List):-
  select(foo, List, MList),
  select(bar, MList, M2List),
  select(baz, M2List, _).

internal_generator2(List):-
  select(sth1, List, MList),
  select(sth2, MList, M2List),
  select(sth3, M2List, _).

external_generator([List1, List2]):-
  internal_generator(List1),
  internal_generator2(List2).

Prolog は、internal_generator によっていくつかの List1 を生成した後、internal_generator2 によって List2 を生成し、結果を表示し始めています。ただし、internal_generator2 がすべての結果をスローすると、prolog は internal_generator に戻り、foo、bar、baz で別の結果を取得し、internal_generator2 ですべての可能な値の生成を再開します。

コードをリファクタリングして、何らかの方法で internal_generator2 からの結果を保存するにはどうすればよいですか?

さらに、exernal_generator の開始時に、可能なすべての結果を生成するために findall を使用したくありません (私の実際の例は大きすぎて、グローバル スタック オーバーフローが発生します)。

4

1 に答える 1

1

したがって、が必要ですzip。一般的に言えば、そのためには再入可能なコルーチンが必要です。組み込みの Prolog メカニズムは、ネストされた方法で動作します。

したがって、ジェネレーターの述語を書き直して、バックトラックではなく、線形のインクリメンタルな方法で結果を生成できる場合は、指定された回数だけそれぞれを呼び出してリストを埋めます。そのような述語は何らかの方法で状態を表し、その状態を使用して新しい値と拡張状態を生成する必要があります。次の呼び出しへの入力として、前の呼び出しから更新された状態を使用して、これらの計算を連鎖させます。

于 2013-05-04T12:33:31.117 に答える