Prolog迭代1

时间:2012-03-09 00:53:58

标签: list prolog iteration

我有一个名为myfor的迭代器,当我调用myfor(3,7,X).时,我希望它返回X = [3, 4, 5, 6, 7]。但是,此代码仅返回X = [4, 5, 6, 7]。它跳过了第一个。谁能告诉我什么是错的?

myfor(A, A, []) :- !.

myfor(Start,End, Z) :-

    End > Start,
    NewValue is Start+1,
    myfor(NewValue,End, L),
    append([NewValue], L, Z).

3 个答案:

答案 0 :(得分:1)

无法在Prolog中检查此内容(因为我的工作机器上没有它)。这是我的2位

myfor(A, A, [A]) :- !.

myfor(Start,End, Z) :-
End > Start,
NewValue is Start+1,
myfor(NewValue,End, L),
append([Start], L, Z).

答案 1 :(得分:1)

顺便说一句,如果您使用swi-prolog,当然还有其他一些序言,between/3接近您所谓的myfor/3,并且通过一个或两个listing/1来电,您可以很好地了解它是如何实现的。中间的findall应该做你的谓词所做的事。

答案 2 :(得分:0)

尝试在prolog中实现for / next循环是一个强有力的迹象,表明你正在考虑命令式编程,你告诉计算机该做什么,而不是用声明性编程,您可以在其中描述解决方案并让Prolog的推理引擎弄明白。

但是,如果你想要生成一个包含有序数字范围的列表,那么像下面这样的“git'er done”将带有差异列表的魔力:

range( X , X , [X] )
  .
range( X , Y , [X|Z] ) :-
  X < Y ,
  X1 is X + 1 ,
  range( X1 , Y , Z )
  .
range( X , Y , [X|Z] ) :-
  X > Y ,
  X1 is X - 1 ,
  range( X1 , Y , Z )
  .