Auswertung der Postfix-Ausdrucksliste

Ich habe ein Programm geschrieben, um einen Postfix-Ausdruck in einem Prolog anhand einer Ausdrucksliste rekursiv auszuwerten. Zum Beispiel mit der folgenden Liste:

[+,1,2]

Es sollte 3 zurückgeben. Die Art und Weise, wie ich mein Prädikat konstruiert habe, besteht darin, sich selbst rekursiv aufzurufen, bis es das Ende der Liste erreicht, sodass es Werte rückwärts liest. (das gleiche wie das Lesen dieser Liste von links nach rechts: [2,1, +]).

Mein Problem ist, dass, wenn ich versuche, mehr als einen Wert durch die rekursiven Aufrufe zurückzugeben, alle Werte plötzlich verschwinden.

Hier ist der Code:

eval_list([Head|Tail],_,Result):-
   Tail==[], % last element of list
   Result=Head,
   write(Head),
   write(' was stored in Result!\n').

eval_list([Head|Tail],Store1,Result):-
      eval_list(Tail,Store2, NewResult),
      (\+integer(Store2))
   ->
      % if no integer is bound to Store2, bind Store1 to Head
      Store1=Head,
      Result is NewResult,
      write(Head),
      write(' is stored value!\n')
   ;  (integer(Store2)) ->
    % if an integer is bound to store2, we perform operation specified by the Head with the stored number
      X is Store2+NewResult,
      Result is X,
      write('performed operation!\n')
   ;
      % if doesnt catch either of these states the program is broken
      (  print('something broke\n'),
         print(Store1),
         nl,
         print(Store2),
         nl,
         print(Head),
         nl,
         print(Result),
         nl
      ).

Ich erhalte folgende Ausgabe:

?- eval_list([+,1,2],X,Result).
2 was stored in Result!
1 is stored value!
something broke
_G1162
_L147
+
_G1163
true.

Ich verstehe nicht, warum meine Werte verschwinden oder ob es einen besseren Weg gibt, die Liste auszuwerten.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage