【发布时间】:2013-04-26 15:49:57
【问题描述】:
请看这段代码被剪断:
...,
findall(X, predicate(Input1, X), XS),
XS \== [],
!,
member(X, XS),
...
这将找到XS 中predicate(_, X) 的所有解决方案,剪切,然后“迭代”XS 中的X。
这里可以替换findall/3吗?很可能我不会对 X 的所有解决方案感兴趣。我需要知道 Input1 是否可以满足,如果可以,请继续使用它的解决方案。
请注意,这当然不是我想要的:
predicate(Input1, X), % Uses other values for Input1
这也不是:
!, predicate(Input1, X), % I could need another value for Input1
尤其是。不是这个:
predicate(Input1, X), !, % I want further solutions for X
【问题讨论】:
-
为什么
predicate(Input1,X)不是您想要的?如果您不想要所有答案,通常使用 Prolog,您根本不会在列表中生成它们。如果你想要答案的一个子集,你可以做一个更有选择性的谓词,然后使用来自findall/3等的谓词。人。为什么你不能接受这些方法? -
@DanielLyons 在我的实际代码
predicate(...)中是call(Fun, ...),乐趣来自member(Fun, (foo, bar, baz, qux))。如果bar(Input1, X)有解决方案,那么我不关心bar(Input1, X)或qux(Input1, X)。使用 findall 我的代码运行良好,但我不认为它是解决我的问题的最佳™ 实现。 :-) -
我希望
once(predicate(...))会做你想做的事,或者将有困难的部分提取到它自己的谓词中,然后在它周围使用once。但我无法从摘要中理解您的问题。 -
你的意思是你需要为第一个成功的
Input1值提供所有解决方案吗?
标签: prolog