【问题标题】:If satisfiable, cut before, otherwise fail如果满足则先切,否则失败
【发布时间】:2013-04-26 15:49:57
【问题描述】:

请看这段代码被剪断:

...,
findall(X, predicate(Input1, X), XS),
XS \== [],
!,
member(X, XS),
...

这将找到XSpredicate(_, 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


【解决方案1】:

这个怎么样:

predicate(Input1,X), !, (Y=X ; predicate(Input1,Y), Y \= X).

我认为这与软剪辑predicate(Input1,X) *-> ... 非常相似(不是说完全一样)。它也是CONDa from the "Reasoned Schemer" book。我想。

其实,这和你想要的并不完全一样。我认为以下更接近:

predicate(Input1,_), !, predicate(Input1,X).

【讨论】:

  • 谢谢!我真的很喜欢最后一行。
  • 是的,就像在 Prolog 中一样,只要写下你的意思就可以解决问题。 (仍然为第一个成功值运行两次...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 2022-06-15
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多