Parsowanie wyrażenia w Prologu i zwracanie abstrakcyjnej składni

Muszę napisać parsowanie (Tkns, T), które przyjmuje wyrażenie matematyczne w postaci listy tokenów i znajduje T, i zwraca instrukcję reprezentującą składnię abstrakcyjną, z zachowaniem kolejności operacji i skojarzeń.

Na przykład,

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

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

Próbowałem zaimplementować + i * w następujący sposób

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)
  ).

Który znajduje poprawną odpowiedź, ale zwraca również odpowiedzi, które nie są zgodne z kolejnością operacji lub kolejnością operacji.

dawny)

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

również wraca

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

i

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

zwraca ekwiwalent 1 + 2 + 3 i 1+ (2 + 3), kiedy powinien zwrócić tylko pierwszy.

Czy jest jakiś sposób, żeby to zadziałało?

Edycja: więcej informacji: muszę zaimplementować tylko +, -, *, /, negate (-1, -2, itd.), A wszystkie liczby są liczbami całkowitymi. Podano wskazówkę, że kod będzie miał strukturę podobną do gramatyki

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

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

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

Zaimplementowano tylko z negacją.

Edit2: Znalazłem parser gramatyki napisany w Prologu (http://www.cs.sunysb.edu/~warren/xsbbook/node10.html). Czy jest sposób, w jaki mogę go zmodyfikować, aby wydrukować lewą rękę gramatyki („drukuj” w tym sensie, że interpreter Prologu wyśle ​​„T = [poprawna odpowiedź]”)

questionAnswers(3)

yourAnswerToTheQuestion