我目前正在阅读一本Prolog书,我仍然坚持其中一项挑战练习。我的意思是用一个参数创建一个谓词。当这个参数是一个变量时,它将返回以下回溯,并且X将继续增加而没有限制。
X = 0,X = 1,X = 2,X = 3,X = ......
我在下面做了一个简单的谓词,它回溯到0-2,但我无法找到让它继续无限的方法。
backtracking_exercise(X) :-
X = 0;
X = 1;
X = 2.
我正在考虑使用between / 3谓词,但这只会给出有限数量的数字。我还尝试了plus / 3谓词和递归,但没有运气。这就是我想出的,但正如你所知,它目前是无用的。
backtracking_excercise2(X) :-
X = 0,
plus(X,1,Y),
backtracking_excercise2(Y).
非常感谢任何有关如何进行的提示。
提前谢谢你。
答案 0 :(得分:1)
您已使用'递归'标记了您的问题(自从删除)但尚未实现递归。我假设这个挑战来自关于递归的章节,所以我提出以下提示(后面是解决方案):
提示1:
什么是基本情况?如果你想要一个递归调用来终止它应该有一个基本情况。
您的基本案例是
X = 0.
提示2:
什么是递归步骤?为了生成序列中的下一步,您需要对上一次迭代做什么?
您的步骤为
X is OldX + 1.
解决方案:
plus(0).
plus(X) :- plus(N), X is N + 1.
其他信息:
这个解决方案对于
plus(-1).
(实际上是所有负X)都是无限的。
为避免这种情况,您需要更多高级工具(例如DCG
或CLP(FD)
)。
答案 1 :(得分:1)
Jim解决方案的尾递归变体:
plus(N) :-
next_integer(1, N).
next_integer(I, I).
next_integer(I, K) :-
J is I + 1,
next_integer(J, K).
为了防止在使用实例化参数调用plus/1
谓词时进入无限循环,即为了使谓词只是一个生成器,可以将第一个子句修改为:
plus(N) :-
var(N),
next_integer(1, N).