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 回答