2012-03-09 44 views
0

我有一個名爲myfor的迭代器,當我打電話給myfor(3,7,X).時,我希望它返回X = [3, 4, 5, 6, 7]。但是,此代碼僅返回X = [4, 5, 6, 7]。它跳出第一個。誰能告訴我什麼是錯的?Prolog iteration off by 1

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

myfor(Start,End, Z) :- 

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

回答

0

試圖實現在序言/下一個循環是,你在勢在必行編程,你告訴計算機做什麼,而不是在聲明節目,其中的術語來思考一個強烈的信號您描述瞭解決方案並讓Prolog的推理引擎找出答案。

但是,如果你想生成包含數字的有序範圍列表,像下面這樣將「git'er做到」有差異列表的魔力:

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) 
    . 
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). 
+2

你可以把它通過刪除第二個子句中的最後一行並將頭部更改爲myfor(開始,結束,[開始| L]):-'來遞歸尾遞歸。擺脫追加電話。 – twinterer 2012-03-09 07:41:13

+0

@twinterer謝謝! – 2012-03-09 08:21:57

1

順便說一句,如果你使用SWI-序言,當然其他一些prologs,between/3靠近你叫什麼myfor/3和一個或兩個listing/1電話,你可以得到它是如何實現的一個好主意。 findall之間應該做你的謂詞。