Analysiert einen Ausdruck in Prolog und gibt eine abstrakte Syntax zurück

Ich muss parse (Tkns, T) schreiben, das einen mathematischen Ausdruck in Form einer Liste von Token aufnimmt und T findet, und eine Anweisung zurückgeben, die die abstrakte Syntax darstellt, wobei die Reihenfolge der Operationen und die Assoziativität beachtet werden.

Zum Beispiel,

?- parse( [ num(3), plus, num(2), star, num(1) ], T ).

T = add(integer(3), multiply(integer(2), integer(1))) ;
No

Ich habe versucht, + und * wie folgt zu implementieren

parse([num(X)], integer(X)).
parse(Tkns, T) :-
  (  append(E1, [plus|E2], Tkns),
     parse(E1, T1),
     parse(E2, T2),
     T = add(T1,T2)
  ;  append(E1, [star|E2], Tkns),
     parse(E1, T1),
     parse(E2, T2),
     T = multiply(T1,T2)
  ).

Welche findet die richtige Antwort, sondern gibt auch Antworten, die nicht Assoziativität oder Reihenfolge der Operationen folgen.

Ex)

parse( [ num(3), plus, num(2), star, num(1) ], T ). 

kehrt auch zurück

mult(add(integer(3), integer(2)), integer(1))

und

parse([num(1), plus, num(2), plus, num(3)], T)

Gibt das Äquivalent von 1 + 2 + 3 und 1+ (2 + 3) zurück, wenn nur das erstere zurückgegeben werden soll.

Gibt es eine Möglichkeit, dies zum Laufen zu bringen?

Edit: Weitere Informationen: Ich muss nur +, -, *, /, negieren (-1, -2 usw.) und alle Zahlen sind ganze Zahlen. Es wurde ein Hinweis gegeben, dass der Code ähnlich wie der des Grammatikers aufgebaut sein wird

<expression> ::= <expression> + <term>
              |  <expression> - <term>
              |  <term>

      <term> ::= <term> * <factor>
              |  <term> / <factor>
              |  <factor>

    <factor> ::= num
              |  ( <expression> )

Nur mit negate auch implementiert.

Edit2: Ich habe einen Grammatik-Parser in Prolog gefunden (http://www.cs.sunysb.edu/~warren/xsbbook/node10.html). Gibt es eine Möglichkeit, es zu ändern, um eine linke Ableitung einer Grammatik auszudrucken ("print" in dem Sinne, dass der Prolog-Interpreter "T = [die richtige Antwort]" ausgibt)?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage