如何使用回溯在 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)。
为避免这种情况,您需要更高级的工具(例如 DCG
或 CLP(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).
我目前正在阅读一本 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)。
为避免这种情况,您需要更高级的工具(例如DCG
或CLP(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).