1

我有一个任务以前缀表示法输入数学问题的字符/整数列表,并在输入错误时输出结果或错误。输入将是 main([list], X),输出应该是结果。

我的问题是尝试以我在 C 中的方式使用堆栈,以便我可以使用我知道但不知道如何实现它的前缀方法。

我目前在尝试使用 OStack([]) 时遇到错误。作为声明,想知道是否有人可以解释或显示使用全局列表/数组的基本设置,或者我是否必须使用 main 传递的列表并创建多个方法。

具体来说,我想知道我是否可以像现在这样使用 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 回答