我從99 Prolog Problems工作問題26:Prolog的出棧錯誤的
P26 (**) Generate the combinations of K distinct objects chosen from the N elements of a list
Example:
?- combination(3,[a,b,c,d,e,f],L). L = [a,b,c] ; L = [a,b,d] ; L = [a,b,e] ;
所以我的計劃是:
:- use_module(library(clpfd)).
combination(0, _, []).
combination(Tot, List, [H|T]) :-
length(List, Length), Tot in 1..Length,
append(Prefix, [H], Stem),
append(Stem, Suffix, List),
append(Prefix, Suffix, SubList),
SubTot #= Tot-1,
combination(SubTot, SubList, T).
我的查詢結果,開始很好,但隨後會返回一個全球出棧錯誤:
?- combination(3,[a,b,c,d,e,f],L).
L = [a, b, c] ;
L = [a, b, d] ;
L = [a, b, e] ;
L = [a, b, f] ;
Out of global stack
我不明白爲什麼它工作在第一,但然後掛起,直到它給出了全球堆棧錯誤的。終端上的SWISH和swi-prolog都適用。
你有沒有試過做'追蹤'?您可能會發現,一旦您的程序找到了解決方案,它就會不斷使用append來創建不斷增長的新列表,以嘗試尋找其他永遠不會滿足的解決方案。你的第一個'append(Prefix,[H],Stem)'有兩個變量,所以這些變量將不斷增長。 – lurker
@lurker,是的,我似乎有'trace'd,'debug'ged,'guitrace'd所有東西,程序總是在生成'L = [a,b,f];後掛起直到Out of堆棧錯誤(實際上用'debug'作爲查詢的第一個子句,那麼這個錯誤就不會出現,並且會永久掛起)。如果我在append(前綴,[H],Stem)之前加上'trace',我會得到以下輸出:'Call:lists:append(_14580,[_14486],_14584)' '調用:lists:append(_14592 ,[_14498],_14596)' 'Call:lists:append(_14604,[_14510],_14608)' 'L = [a,b,c]' 'L = [a,b,d]' 'L = [a,b,e]' 'L = [a,b,f]' '全局堆棧' –