
Prima possibilita':

max(N1,N2,N1):- N1>N2.

max(N1,N2,N2):- N1=<N2. 

altezza(X,1):- atom(X).

altezza(node(_,Subtree1,Subtree2),N):- altezza(Subtree1,N1),
                                      altezza(Subtree2,N2),
                                      max(N1,N2,M),
                                      N is M+1.

Il problema di max, come implementato nel testo dell'esercizio,
e' che produce due possibili risultati quando N1 e' maggiore di N2.
Nella ricerca di una soluzione per 'altezza', l'interprete prolog
utilizza infatti entrambi i possibili valori.
In questa prima soluzione 'max' produce invece un solo possibile risultato.

Un'altra possibilita' e' quella di fare in modo che 
l'interprete prolog, nella ricerca di una soluzione per 'altezza',
non possa andare ad utilizzare l'eventuale seconda soluzione per 'max'.
(Da notare che il problema nel nostro esempio non si presenta con
il primo uso della clausola, ma quanto andiamo a cercare la soluzione
del nostro problema per il sottoalbero sinistro.)

Questo si puo' fare utilizzando il cut nel seguente modo:

max(N1,N2,N1):- N1>N2.

max(_,N2,N2).


altezza(X,1):- atom(X).

altezza(node(_,Subtree1,Subtree2),N):- altezza(Subtree1,N1),
                                      altezza(Subtree2,N2),
                                      max(N1,N2,M),
                                      !, 
                                      N is M+1.

Altre possibilita':

max(N1,N2,N1):- N1>N2,!.

max(N1,N2,N2).

altezza(X,1):- atom(X).

altezza(node(_,Subtree1,Subtree2),N):- altezza(Subtree1,N1),
                                      altezza(Subtree2,N2),
                                      max(N1,N2,M),
                                      N is M+1.


