簡體   English   中英

Prolog-錯誤:在Linux中超出本地堆棧

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM