接頭辞表記の数学問題の文字/整数のリストの入力を取得し、入力が間違っている場合は結果またはエラーを出力する割り当てがあります。入力は 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)
).