Prolog 生成整数<;限制

Prolog 生成整数<;限制,prolog,backtracking,clpfd,Prolog,Backtracking,Clpfd,我试图生成所有小于极限的整数(自然数),比如说10。 我有一个谓词nat(X),它产生从0到无穷大的所有数字 现在我的问题是,如果我这样做: nat10(X) :- nat(X), X =< 10. nat10(X):-nat(X),X= < P>根据所解决的问题,你可能需要考虑有限域上的约束逻辑编程(CPLFD)。 但是在这种情况下,如果X>10,您只需要防止Prolog回溯。当前谓词nat10/1没有此类约束,因此我们将添加它: nat10(X) :- nat(X), ( X >

我试图生成所有小于极限的整数(自然数),比如说10。 我有一个谓词
nat(X)
,它产生从0到无穷大的所有数字

现在我的问题是,如果我这样做:

nat10(X) :- nat(X), X =< 10.
nat10(X):-nat(X),X=<10。
这将永远不会终止,因为它试图使用
nat(X)
找到其他解决方案,直到无穷大


我需要一个构造,如果一个子目标失败,让我使整个谓词失败。如何解决这个问题?< /P> < P>根据所解决的问题,你可能需要考虑有限域上的约束逻辑编程(CPLFD)。 但是在这种情况下,如果
X>10
,您只需要防止Prolog回溯。当前谓词
nat10/1
没有此类约束,因此我们将添加它:

nat10(X) :- nat(X), ( X > 10 -> !, fail ; true ).
因此,如果
X>10
,我们做一个切割(
)来防止回溯到
nat(X)
(从而避免无限地在
10
上方生成自然数),然后简单地
失败。否则,我们将成功(
true

如果你能用,那么这个答案就是给你的

:- use_module(library(clpfd)).
只需尝试:

nat10(X) :-
   X in 0..10,
   indomain(X).

你能解释一下为什么这里需要明确的削减吗
->
已经是一个“软”切割。@gniourf\u gniourf该切割对于防止prolog在通过
10
后无限尝试进一步的解决方案是必要的。如果您不使用它,它将无限期地继续。您需要剪切,但您可以用逗号替换
->
。另一个小改进是更早地剪切,即在返回10:
nat10(X):-nat(X),(X>=10,!,X=两个不错的建议,@jsf。谢谢。
nat10(X) :-
   X in 0..10,
   indomain(X).