2011-07-20 37 views
0

我正在嘗試在Prolog中運行以下程序。在Prolog中出現全局堆棧錯誤

mama_mia1(A,M,LI,HI,LO,HO,AA) :- 
    p1(A,M,LI,HI,LO,HO,PROGS), 
    reverse(PROGS,PROG), 
    atom_chars(AA,PROG), 
    !. 

p1(_,_,LO,LO,LO,_,[]). 
p1(_,_,HO,HO,_,HO,[]). 
p1(_,_,LO,HO,LO,HO,[]). 
p1(_,_,X,LO,LO,HO,[]) :- X>LO,X<HO. 
p1(_,_,X,HO,LO,HO,[]) :- X>LO,X<HO. 
p1(_,_,LO,Y,LO,HO,[]) :- Y>LO,Y<HO. 
p1(_,_,HO,Y,LO,HO,[]) :- Y>LO,Y<HO. 
p1(_,_,X,Y,LO,HO,[]) :- X>LO,X<HO,Y>LO,Y<HO. 
p1(A,M,X,Y,LO,HO,PROG) :- 
    ( (X1 is X+A, H1 is HO+1, X1<H1, Y1 is Y+A, Y1<H1) 
    -> append(PROG1,['A'],PROG), 
     p1(A,M,X1,Y1,LO,HO,PROG1) 
    ; false). 
p1(A,M,X,Y,LO,HO,PROG) :- 
    ( (X2 is X * M, H1 is HO+1, X2<H1, Y2 is Y * M, Y2<H1) 
    -> append(PROG2,['M'],PROG), 
     p1(A,M,X2,Y2,LO,HO,PROG2) 
    ; false). 

方案應計算的加法和乘法選自Li和喜之間的每一個號碼,導致LO和HO之間的結果的適當的路徑。一個加法對應於字母A,乘法對應於M.在程序結束時,我們應該得到一串As和Ms對應於我們找到的路徑。

程序運行良好,但嘗試的測試用例時:

mama_mia1(70000,17,2,5,89000,89900,P) 

我得到一個「錯誤:出全球棧」的消息。

任何想法有什麼問題的代碼?

回答

0

ERROR: out of global stack

消息意味着你的程序需要更多的內存。要麼它陷入消耗所有內存的無限循環,要麼沒有錯,輸入太大,所以需要更多的內存。

考慮到您的輸入看起來相當大,假設你已經測試過小的投入並沒有什麼問題發生,我會說,你只是需要更多的內存

可以展開stack的大小或者你可以嘗試使用內存較少。

當然,如果這是某種需要檢查的練習,可能會限制您可以獲得多少內存:b

+0

謝謝您的回答。問題是,上面的輸入不應該佔用太多的內存......我測試了更大的輸入,它們工作得很好。 另外,我很快得到錯誤消息,而在其他長時間運行的測試用例中,我沒有收到任何錯誤消息。 – chryssa