Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Prolog中使用回溯无限递增变量_Prolog_Backtracking - Fatal编程技术网

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

如何在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谓词和递归,但没

我目前正在读一本序言书,我被困在其中一个挑战练习中。我打算用一个参数创建一个谓词。当这个参数是一个变量时,它将返回以下带有回溯的值,并且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_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
肯定是不正确的。