2015-05-11 25 views
0

我試圖創建一個具有以下規格的程序:序言 - 從本地堆棧錯誤

N=int 
X=int 
R=list containing N copies of X 
• R=[] if N=0 
• N will always be given 
• Either X or R will be given 

示例結果:

?- fill(4,2,R). 
R=[2,2,2,2]. 
?- fill(4,X,[2,2,2,2]). 
X=2. 

我有下面的代碼,讓我「出來的本地堆棧錯誤'當我運行第一個填充語句。是什麼造成的?

fill(0,_,[]). 
fill(N,X,R) :- N1 is N-1, fill(N1,X,R), append(R,[X], R). 

回答

2

原因是:即使N = 0也使用第二個子句。 (0,...)=> fill(-1,....)=> fill(-2,....)=> ......

補救措施:在第一個子句中添加一個切口應該避免這種情況。

+0

謝謝。我在第二個子句中增加了N> 0。但是,如何讓R在最後返回?當我運行它時,我只是'虛假'。 – rightDrop

+0

在append(R,[X],R] .'中作爲輸入和輸出數據使用兩次'R'似乎是不恰當的,不是'fill(N,X,R): - N1是N- 1,填充(N1,X,R1),追加(R1,[X],R)。?? –

+0

是的,這樣做更有意義,現在它給了我正確的輸出。 – rightDrop