:- op(800,xfx,=>).
:- op(800,xfx,==>).
:- op(800,xfx,==>*).

A+(B+C) => (A+B)+C.

A ==> B :-
    A => B.
A+C ==> B+C :-
    A ==> B.
A+B ==> A+C :-
    B ==> C.

A ==>* C :-
    A ==> B,
    !,        %Der Cut loescht alle Backtracking Points seit Aufruf von ==>* 
    B ==>* C.
A ==>* A.

% ?- a+(b+c+a)+(c+d)+(a+(b+c)) ==>* X.
% Hier gibt es nur eine Loesung.

% Aufruf des Cut (!) bewirkt, dass Prolog keine weiteren Loesungen fuer
% A ==> B mehr sucht und auch die Klausel A ==>* A. ignoriert.
% Dies garantiert, dass ==>* nur eine Loesung liefert, und zwar eine
% Loesung, auf die keine Umklammerung mit ==> mehr anwendbar ist,
% die also links geklammert ist.
