如何使用回溯在 Prolog 中无限递增变量

How to use backtrack to increment a variable infinitely in Prolog

我目前正在阅读一本 Prolog 书,但我被困在其中一个挑战练习中。我打算用一个参数创建一个谓词。当此参数为变量时,return后面会回溯,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).

任何关于如何进行的提示都将不胜感激。

提前谢谢你。

您用 'recursion' 标记了您的问题(已删除),但没有实施递归。我假设这个挑战来自递归一章,所以我提出以下提示(后面是解决方案):

提示 1:

基本情况是什么?如果你想要一个递归调用来终止它应该有一个基本情况。

你的基本情况是 X = 0.

提示 2:

什么是递归步骤?您需要对上一次迭代执行什么操作才能生成序列中的下一步?

你的步数是X is OldX + 1.

一个解决方案:

plus(0).
plus(X) :- plus(N), X is N + 1.

附加信息:

这个解决方案对于 plus(-1). 将是无限的(而且,实际上,所有负 X)。
为避免这种情况,您需要更高级的工具(例如 DCGCLP(FD))。

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).