Prolog避免两次生成相同的列表

时间:2013-05-04 11:25:44

标签: list prolog

我有以下代码:

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的结果?

此外,我不想使用findall在exernal_generator的开头生成所有可能的结果(我的实例太大了,我得到全局堆栈溢出)。

1 个答案:

答案 0 :(得分:1)

所以你需要一个zip。一般而言,您需要可重复使用的协同程序。内置的Prolog机制以嵌套方式工作。

因此,如果您可以重新编写生成器谓词以线性,增量方式生成结果,而不是通过回溯,则只需调用每个给定次数来填充列表。这样的谓词必须以某种方式表示它们的状态,并继续使用该状态来产生新值和增强状态。您可以使用上次调用中的更新状态作为下一次调用的输入来链接这些计算。