我有一个赋值,用于在前缀表示法中输入数学问题的字符/整数列表,如果输入错误则输出结果或错误。输入将是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)
).
答案 0 :(得分: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