generic data specification
parameter
elem
using nat
data types tree := leaf
| branch(. .left : tree;. .val : elem;. .right : tree)
;
variables t : tree;
t0 : tree;
t1 : tree;
left : tree;
val : elem;
right : tree;
size functions # . : tree → nat;
end generic data specification