我正在尝试生成小于限制的所有整数(自然数),比如说 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/