我试图生成小于限制的所有整数(自然数),让我们说10。
我有一个谓词nat(X)
,它产生从0到无穷大的所有数字。
现在我的问题是,如果我这样做:
nat10(X) :- nat(X), X =< 10.
这将永远不会终止,因为它会尝试使用nat(X)
找到其他解决方案,直到无穷大。
如果一个子目标失败,我需要一个允许我使整个谓词失败的构造。我该怎么做呢?
答案 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)