(define $Nat (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (deconstructor {[o [] {[ {[]}] [_ {}] }] [s [Nat] {[ {x}] [_ {}] }] })] [$equal? (lambda [$val $tgt] (match [val tgt] [Nat Nat] {[[ ] ] [[ ] (= n1 n2)] [[_ _] ]}))] })) (define $+ (lambda [$m $n] (match m Nat {[ n] [ ]}))) (define $* (lambda [$m $n] (match m Nat {[ ] [> n] [ (+ n (* m1 n))]}))) (define $fact (lambda [$n] (match n Nat {[ >] [ (* n (fact n1))]}))) (test (fact >>>)) (define $fib (lambda [$n] (match n Nat {[ >] [> >] [> (+ (fib ) (fib n1))]}))) (test (fib >>>>>>)) (define $monus (lambda [$m $n] (match [m n] [Nat Nat] {[[_ ] m] [[ _] ] [[ ] (monus m1 n1)]}))) (test (monus >> >)) (define $mod (lambda [$m $n] (match (monus m n) Nat {[ m] [$m1 (mod m1 n)]}))) (test (mod >>>> >>>))