請參閱此代碼剪斷:如果滿足的,切之前,否則失敗
...,
findall(X, predicate(Input1, X), XS),
XS \== [],
!,
member(X, XS),
...
這將找到predicate(_, X)
所有的解決方案在XS
,切,然後在「迭代」過的XS的X.
是否可以在這裏替換findall/3
?很可能我不會對全部解決方案感興趣。我需要知道它對於Input1是否可以滿足,如果是,繼續使用它的解決方案。
請注意,這是當然的,不是我在尋找:
predicate(Input1, X), % Uses other values for Input1
也不是這樣的:
!, predicate(Input1, X), % I could need another value for Input1
和ESP。不是這個:
predicate(Input1, X), !, % I want further solutions for X
*爲什麼*不是謂詞(輸入1,X)'你在找什麼?通常在Prolog中,如果你不想要所有的答案,你根本就不會在列表中生成它們。如果你想要一個答案的一個子集,你可以做出更多的選擇性謂詞,然後使用'findall/3'中的那個。人。爲什麼這些方法不適合你? – 2013-04-26 16:16:31
@DanielLyons在我的實際代碼中,'predicate(...)'是'call(Fun,...)',樂趣來自'member(Fun,(foo,bar,baz,qux))'。如果'bar(Input1,X)'有解決方案,那麼我不在乎'bar(Input1,X)'或'qux(Input1,X)'。隨着findall我的代碼運行良好,但我不認爲這是我的問題的最佳™實施。 :-) – kay 2013-04-26 16:24:24
我會期待'一次(謂詞(...))'會做你想做的事情,或者提取那些對自己的謂詞有困難的部分,然後在那裏使用'once'。但我無法理解你的問題。 – 2013-04-26 16:28:17