我有一个名为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).
答案 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 )
.