[英]Prolog - ERROR: Out of local stack in linux
我在swipl中有一個非常簡單的程序
edge(X,Y) :- edge(X,Z),edge(Z,Y).
edge(a,b).
edge(a,f).
edge(b,c).
edge(c,d).
edge(g,c).
edge(f,g).
edge(f,c).
edge(f,e).
edge(c,e).
edge(e,d).
但是當Ι進行查詢edge(a,c).
我得到本地堆棧外異常。 奇怪的是,當我在Windows中執行相同的查詢時,程序運行完美。
我試圖增加本地堆棧,但是簡單地,該程序需要更長的時間來引發異常。
要實際查看問題所在,請考慮以下故障切片 :
edge(X,Y) :- edge(X,Z), false,edge(Z,Y).edge(a,b) :- false.edge(a,f) :- false.edge(b,c) :- false.edge(c,d) :- false.edge(g,c) :- false.edge(f,g) :- false.edge(f,c) :- false.edge(f,e) :- false.edge(c,e) :- false.edge(e,d) :- false.
如果您的程序片段沒有終止,那么您的原始程序也不會終止。 看看還剩下什么! 單個遞歸,其中參數被忽略( Y
)或傳遞( X
)。 因此,該程序無法終止。 換句話說:您的程序永不終止。
您的謂詞定義了一個可愛的無限循環。 它只是坐在那里自稱,甚至從不嘗試事實,因為謂詞是第一個,並且與事實的名稱相同。
會有所幫助的是:(1)在謂詞之前斷言事實,(2)不要用與事實相同的名稱來定義您的謂詞(從技術上講,它並不意味着相同的事物,所以為什么它應該具有相同的名稱?),以及(3)在遞歸子句中,在遞歸調用之前檢查預定義的邊。
edge(a,b).
edge(a,f).
edge(b,c).
edge(c,d).
edge(g,c).
edge(f,g).
edge(f,c).
edge(f,e).
edge(c,e).
edge(e,d).
connected(X, Y) :-
edge(X, Y).
connected(X, Y) :-
edge(X, Z), connected(Z, Y).
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.