1

接頭辞表記の数学問題の文字/整数のリストの入力を取得し、入力が間違っている場合は結果またはエラーを出力する割り当てがあります。入力は main([list], X) になり、出力は結果になるはずです。

私の問題は、私が知っているがそれを実装する方法がわからない接頭辞の方法論を使用できるように、C で行う方法でスタックを使用しようとしていることです。

現在、OStack([]) を使用しようとするとエラーが発生します。宣言として、誰かがグローバルリスト/配列を使用する基本的なセットアップを説明または表示できるかどうか、またはメインから渡されたリストを使用して複数のメソッドを作成する必要があるかどうか疑問に思っていました.

具体的には、OpStack と OStack を現在と同じように使用できるかどうか、およびその方法を知りたいです。

ありがとうございました。

/* Used to imitate a stack */
pop(E, [E|Es],Es).
push(E, Es, [E|Es]).
seehead([X|TAIL],X).


OpStack([]).
OStack([]).

loop(Y,[X|TAIL]) :- integer(X), !,
                 pop(Popped, OStack, OStack),
             pop(Marker, OpStack, OpStack),
             pop(Operator, OpStack, OpStack),
         Z is Y + Operator + Popped,
         ( integer(seehead([TAIL],Z)) ->
          loop(Y, [Pop2|OStack]);
          push(Z, OStack, OStack), main(TAIL,X)
         ).


main([X |[]], X):-write(X).

main([X| TAIL],Z):- X == +, !, push(+, OpStack, OpStack), push("X", OStack, OStack),           main(TAIL, Z).
main([X| TAIL],Z):- X == *, !, push(*, OpStack, OpStack), push("X", OStack, OStack),     main(TAIL, Z).
main([X| TAIL],Z):- X == -, !, push(-, OpStack, OpStack), push("X", OStack, OStack), main(TAIL, Z).
main([X| TAIL],Z):- X == /, !, push(/, OpStack, OpStack), push("X", OStack, OStack), main(TAIL, Z).

main([X|TAIL], Z):-  integer(X),!,
         ( seehead([TAIL],Z) == "X" ->
          push(X, OStack, OStack), main(TAIL,X);
           loop(Y,OStack)
        ).
4

1 に答える 1

0

あなたのコードにはいくつかの構文上の問題が含まれており、SWI-Prolog はそれを強調しています。

...
seehead([X|TAIL],X).  % use _TAIL. Note that usuall this is named peek
...
OpStack([]).  % first letter MUST be lowercase!
OStack([]).   % ditto
...
pop(Marker, OpStack, OpStack), % Marker is singleton!
...
loop(Y, [Pop2|OStack]);  % Pop2 is singleton!
...
loop(Y,OStack) % Y is singleton!
...

シングルトンは役に立たず、通常はタイプミスを示します。

しかし、一般的に、あなたは間違った視点から問題に取り組んでいると思います。Prolog には宣言型プログラミングの特徴があり、通常、これは手続き型プログラミングよりもコードが単純であることを意味します。また、スタックは評価で暗黙的です。Prolog再帰ベースの言語です。スタックをシミュレートする必要はありません (実際には、この例でも C はシミュレートされたスタックよりも再帰を使用する方が適切です)。

したがって、単純化を目指して、仕様を実装します。

main(List, X) :- loop(List, [], X).

loop([+|R], R2, N) :- !,
   loop(R, R1, T1),
   loop(R1, R2, T2),
   N is T1+T2.
...
loop([N|R], R, N) :-
   integer(N), !. % you will need to translate the character to number, I've simplified here

loop(Spec, _, _) :- % catchall rule 
   write(error_here(Spec)), nl,
   fail. % no error recovery, just print
于 2012-11-06T07:56:52.350 に答える