Prolog 如果满意,则在之前剪切,否则失败

Prolog 如果满意,则在之前剪切,否则失败,prolog,Prolog,请查看此代码被截取: ..., findall(X, predicate(Input1, X), XS), XS \== [], !, member(X, XS), ... 这将找到谓词(ux)在XS中的所有解决方案,剪切,然后在XS中的X上“迭代” 是否可以在此处替换findall/3?很可能我对X的所有解决方案都不感兴趣。我需要知道输入1是否可以满足,如果可以,继续使用它的解决方案 请注意,这当然不是我想要的: predicate(Input1, X), % Uses other

请查看此代码被截取:

...,
findall(X, predicate(Input1, X), XS),
XS \== [],
!,
member(X, XS),
...
这将找到
谓词(ux)
XS
中的所有解决方案,剪切,然后在XS中的X上“迭代”

是否可以在此处替换
findall/3
?很可能我对X的所有解决方案都不感兴趣。我需要知道输入1是否可以满足,如果可以,继续使用它的解决方案


请注意,这当然不是我想要的:

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), !, (Y=X ; predicate(Input1,Y), Y \= X).
我认为这与软切割非常相似(更不用说完全相同),
谓词(Input1,X)*->…
。也是。我想

事实上,这和你想要的不完全一样。我认为以下几点比较接近:

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

为什么
谓词(Input1,X)
不是您想要的?通常使用Prolog,如果您不需要所有答案,您只需不在列表中生成所有答案即可。如果你想要答案的子集,你可以做一个更具选择性的谓词,然后使用
findall/3
等。为什么这些方法不被你接受?@DanielLyons在我的实际代码
谓词(…)
中是
调用(Fun…)
,Fun来自
成员(Fun,(foo,bar,baz,qux))
。如果
bar(Input1,X)
有解决方案,那么我不关心
bar(Input1,X)
qux(Input1,X)
。对于findall,我的代码运行得很好,但我不认为它是最好的™ 我的问题的实现::-)我希望
一次(谓词(…)
能做你想做的事,或者将困难的部分提取到它自己的谓词中,然后使用
一次
。但是我在抽象地理解您的问题时遇到了困难。您的意思是您需要第一个成功的
Input1
值的所有解决方案吗?谢谢!我真的很喜欢最后一行。是的,就像在序言中一样,写下你的意思。(对于第一个成功的值,它仍然会运行两次…)