【问题标题】:Prolog avoid generating same lists twiceProlog 避免两次生成相同的列表
【发布时间】:2013-04-28 17:34:37
【问题描述】:

我有以下代码:

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来生成所有可能的结果(我的真实例子太大了,我得到了全局堆栈溢出)。

【问题讨论】:

    标签: list prolog


    【解决方案1】:

    所以你需要一个zip。一般来说,您需要可重入的协程。内置的 Prolog 机制以嵌套方式工作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多