2013-04-26 26 views
3

請參閱此代碼剪斷:如果滿足的,切之前,否則失敗

..., 
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

*爲什麼*不是謂詞(輸入1,X)'你在找什麼?通常在Prolog中,如果你不想要所有的答案,你根本就不會在列表中生成它們。如果你想要一個答案的一個子集,你可以做出更多的選擇性謂詞,然後使用'findall/3'中的那個。人。爲什麼這些方法不適合你? – 2013-04-26 16:16:31

+0

@DanielLyons在我的實際代碼中,'p​​redicate(...)'是'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

+1

我會期待'一次(謂詞(...))'會做你想做的事情,或者提取那些對自己的謂詞有困難的部分,然後在那裏使用'once'。但我無法理解你的問題。 – 2013-04-26 16:28:17

回答

2

如何:

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

我認爲這是非常相似的(不說了,完全一樣)軟阻斷,predicate(Input1,X) *-> ...。它也是CONDa from the "Reasoned Schemer" book。我認爲。

其實,這跟你想要的不完全一樣。以下更接近,我認爲:

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

謝謝!我真的很喜歡最後一行。 – kay 2013-04-26 16:58:57

+1

是的,像普羅羅姆一樣,只要寫下你的意思就可以解決它。 (對於第一個成功的價值,它仍然運行兩次......) – 2013-04-26 16:59:36

相關問題