2011-07-20 3 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). 

プログラムは、LOとHOの間の結果にLiとHIとの間のすべての数から主要加算および乗算の適切な経路を計算する必要があります。加算は文字Aに対応し、乗算はMに対応する。プログラムの最後に、我々が見つけた経路に対応するAsおよびMsの文字列を得るはずである。

プログラムがうまく動作しますが、テストケースしようとしたとき:メッセージ:

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

を私は「グローバルスタックのうちERROR」を取得します。

コードに問題がありますか?

答えて

0

ERROR: out of global stack

メッセージは、プログラムがより多くのメモリを必要とすることを意味します。いずれかの無限ループに詰まって、すべてのメモリを消費するか、何も問題はなく、入力が大きすぎるためにメモリが必要です。

あなたの入力は非常に大きく見えることを考えると、あなたは小さな入力と何の問題をテストしていると仮定し、私はあなただけあなたがstackのサイズを拡張することができたり、使用しようとすることができ、より多くのメモリ

が必要であることを言うだろう起こりました少ないメモリ。これがチェックされるようにどこかに提出した運動のいくつかの並べ替えであれば、あなたが得ることができるどのくらいのメモリ内に限界があるかもしれません。もちろん、

、:B

+0

は、あなたの答えをいただき、ありがとうございます。問題は、上記の入力がそれほど多くのメモリを消費すべきではないということです...私はより大きな入力をテストして、完全に正常に動作します。 また、エラーメッセージが早すぎますが、実行時間の長いテストケースではエラーメッセージが表示されません。 – chryssa

関連する問題