生成整数<限制

时间:2014-04-02 09:50:32

标签: prolog backtracking

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

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

nat10(X) :- nat(X), X =< 10.

这将永远不会终止,因为它会尝试使用nat(X)找到其他解决方案,直到无穷大。

如果一个子目标失败,我需要一个允许我使整个谓词失败的构造。我该怎么做呢?

2 个答案:

答案 0 :(得分:4)

根据要解决的问题,您可能需要考虑有限域上的约束逻辑编程(CLPFD)。

但在这种情况下,如果X > 10,您只需要阻止Prolog回溯。当前谓词nat10/1没有这样的约束,因此我们将其添加:

nat10(X) :- nat(X), ( X > 10 -> !, fail ; true ).

因此,如果X > 10,我们会执行剪切(!)以防止回溯到nat(X)(从而避免无限地生成高于10的自然数),然后简单地fail 1}}。否则,我们成功(true)。

| ?- nat10(X).

X = 1 ? ;

X = 2 ? ;

...

X = 9 ? ;

X = 10 ? ;

(3 ms) no
| ?-

答案 1 :(得分:3)

如果你可以使用,那么这个答案适合你!

:- use_module(library(clpfd)).

只需尝试:

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