% Gesucht ist ein Prolog-Programm, das arithmetische Ausdrücke, die in
% Postfix-Notation übergeben werden, auswertet.

% HINWEIS: Ihr müsst nicht in der Lage sein, ein vergleichbares Programm zu
% schreiben - ich wollte hiermit an einem vergleichsweise einfachen Beispiel
% nur mal demonstrieren, dass man mit Prolog auch mehr machen kann, als
% Verwandtschaftsbeziehungen zu modellieren.


% Hilfsfunktion, die eine Liste umdreht (vorderstes Element nach hinten usw).

reverse(List, Reversed) :- reverse(List, [], Reversed).

reverse([], Reversed, Reversed).
reverse([Head|Tail], SoFar, Reversed) :- reverse(Tail, [Head|SoFar], Reversed).


% Unterstützung für folgende Operatoren ist implementiert: +, -, *, /

operator(+).
operator(*).
operator(-).
operator(/).

operate(V1, V2, +, Res) :- Res is V1 + V2.
operate(V1, V2, -, Res) :- Res is V1 - V2.
operate(V1, V2, *, Res) :- Res is V1 * V2.
operate(V1, V2, /, Res) :- Res is V1 / V2.

eval([Op|Tail], NewList2, Result) :- operator(Op),
                                     eval(Tail, NewList1, Res1),
                                     eval(NewList1, NewList2, Res2),
                                     operate(Res2, Res1, Op, Result), !.
eval([Val|Tail], Tail, Val).


% Das folgende Prädikat ist das "front-end" des Programms.

eval(Expr, Result) :- reverse(Expr, RevExpr), eval(RevExpr, _, Result).


% Ein Aufruf erfolgt z.B. so:
% ?- eval([1,2,/,3,*,4,+], Result).
