1

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 と hi の間のすべての数値から lo と ho の間の結果に至る、加算と乗算の適切なパスを計算する必要があります。加算は文字 A に対応し、乗算は M に対応します。プログラムの最後に、見つけたパスに対応する As と Ms の文字列を取得することになっています。

プログラムはうまく動作しますが、テストケースを試すと:

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

「ERROR: out of global stack」というメッセージが表示されます。

コードの何が問題なのですか?

4

2 に答える 2

0

エラー: グローバル スタックが不足しています

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

入力が非常に大きく見えることを考慮し、より小さな入力をテストして問題が発生しなかったと仮定すると、より多くのメモリが必要であると言えます

スタックのサイズを拡張するか、使用するメモリを減らすことができます。

もちろん、これがチェックのためにどこかに提出されたある種の演習である場合、取得できるメモリ量に制限がある可能性があります:b

于 2011-07-21T18:07:07.613 に答える