datatype gtree (a:t@ype) =
| E (a) of () | B (a) of (a -<cloref1> gtree a)
fun gt (n: int): gtree int = B {int} (lam i => if 0 <= i andalso i <= n then gt (n+1) else E ())
val gt0 = gt (0)
abst@ype I
typedef E (X:type) = X
typedef B (X:type) = (I -<cloref> X) -<cloref> X
typedef gtree_ = {X:type} (E X, B X) -<cloref> X
val E = (lam (e, b) => e): E gtree_
val B = (lam (f) => (lam (e, b) => b (lam i => f (i) (e, b)))): B gtree_
assume I = bool
fn leftGtree (t: gtree_): gtree_ = let
typedef gtree2_ = '(gtree_, gtree_) val e: gtree2_ = '(E, E)
val b = lam (x: I -<cloref> gtree2_): gtree2_ =<cloref>
'((x false).1, B (lam i => if i = false then (x false).1 else (x true).1))
in
(t {gtree2_} (e, b)).0
end