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

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

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

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

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

最佳答案

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

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

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

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

X = 1 ? ;

X = 2 ? ;

...

X = 9 ? ;

X = 10 ? ;

(3 ms) no
| ?-

关于prolog - 生成整数 < 限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22807642/

10-11 22:57
查看更多