(define $Nat (type {[$var-match (lambda [$tgt] {tgt})] [$inductive-match (deconstructor {[o [] {[ {[]}] [_ {}] }] [s [Nat] {[ {x}] [_ {}] }] })] [$= (lambda [$val $tgt] (match [val tgt] [Nat Nat] {[[ ] ] [[ ] (= n1 n2)] [[_ _] ]}))] })) (test ((type-ref Nat =) )) (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 $val-match-test (lambda [$n] (match n Nat {[,(+ > >>) ] [$n1 n1]}))) (test (val-match-test >>>)) (define $on-pat-test (lambda [$m $n] (match [m n] [Nat Nat] {[[$m1 (on [$m1] )] m1] [[_ _] ]}))) (test (on-pat-test >)) (define $on-pat-test2 (lambda [$m $n] (match [m n] [Nat Nat] {[[$m1 ] m1] [[_ _] ]}))) (test (on-pat-test2 >))