Type Type / | \ / | \ / | \ / | \ Type -> Type Type -> Type / | \ | | / | \ / | \ | | / | \ Type -> Type TVar TVar Type -> Type | | | | | | | | TVar TVar TVar TVar Type Type / | \ / | \ / | \ / | \ Type * Type Type -> Type / | \ | | / | \ / | \ | | / | \ Type -> Type TVar TVar Type * Type | | | | | | | | TVar TVar TVar TVar Type Type / | \ / | \ / | \ / | \ Type * Type Type * Type / | \ | | / | \ / | \ | | / | \ Type * Type TVar TVar Type * Type | | | | | | | | TVar TVar TVar TVar
Type ::= CarType -> Type | CarType CarType ::= CarType * TVar | TVar
datatype 'a tree = emp | nod of 'a * 'a tree list;
fun pre_trav emp = [] | pre_trav (nod(x,L)) = x :: aux L and aux [] = [] | aux (T :: L) = pre_trav T @ aux L;
fun altnfold f g 0 x = x | altnfold f g n x = f(g(altnfold f g (n-1) x));
in(X,nod(_,X,_)). in(X,nod(T,_,_)) :- in(X,T). in(X,nod(_,_,T)) :- in(X,T).
in_trav(emp,[]). in_trav(nod(T1,X,T2),L) :- in_trav(T1,L1), in_trav(T2,L2), append(L1, [X|L2], L).
sum_tree(emp,0). sum_tree(nod(T1,X,T2),N) :- sum_tree(T1,N1), sum_tree(T2,N2), N is N1 + N2 + X.
symmetric(emp,emp). symmetric(nod(T1,X,T2), nod(U2,X,U1)) :- symmetric(T1,U1), symmetric(T2,U2).