如何在Prolog中使用回溯无限递增变量
我目前正在读一本序言书,我被困在其中一个挑战练习中。我打算用一个参数创建一个谓词。当这个参数是一个变量时,它将返回以下带有回溯的值,并且X将继续无限制地递增 X=0,X=1,X=2,X=3,X= 我在下面做了一个简单的谓词,它回溯到0-2,但是我想不出一个方法使它无限继续下去如何在Prolog中使用回溯无限递增变量,prolog,backtracking,Prolog,Backtracking,我目前正在读一本序言书,我被困在其中一个挑战练习中。我打算用一个参数创建一个谓词。当这个参数是一个变量时,它将返回以下带有回溯的值,并且X将继续无限制地递增 X=0,X=1,X=2,X=3,X= 我在下面做了一个简单的谓词,它回溯到0-2,但是我想不出一个方法使它无限继续下去 backtracking_exercise(X) :- X = 0; X = 1; X = 2. 我曾考虑使用between/3谓词,但这只能给出有限数量的数字。我还尝试了加号/3谓词和递归,但没
backtracking_exercise(X) :-
X = 0;
X = 1;
X = 2.
我曾考虑使用between/3谓词,但这只能给出有限数量的数字。我还尝试了加号/3谓词和递归,但没有成功。这是我提出的,但正如你所知,它目前毫无用处
backtracking_excercise2(X) :-
X = 0,
plus(X,1,Y),
backtracking_excercise2(Y).
任何关于如何进行的提示都将不胜感激
先谢谢你 您已将问题标记为“递归”(自删除后),但尚未实现任何递归。我假设这个挑战来自递归一章,因此我给出以下提示(后面是解决方案): 提示1: 基本情况是什么?如果希望递归调用终止,它应该有一个基本情况 您的基本情况是
X=0。
提示2:
什么是递归步骤?为了生成序列中的下一步,您需要对上一次迭代做什么
您的步骤是X是OldX+1。
解决方案:
plus(0)。
plus(X):-plus(N),X是N+1。
其他信息:
对于加号(-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).
length(ux)
是一种快速算法way@false使用length/1
也是一种糟糕的方法,因为它会生成最终需要进行垃圾收集的列表。@PauloMoura:您测量过实际的“开销”吗?这是完全可以忽略的。它比公认的答案快得多…@false这是一种可怕的方法,因为当整数太大(100000000
足够小)时,它会崩溃,即使解决的任务看起来很琐碎。@false我不是说公认的解决方案是好的,我是说使用length
也不好。如果plus(N)失败,N=1
肯定是不正确的。