nat : type.
z : nat.
succ : natnat.

rec add : ( ⊢ nat) → ( ⊢ nat) → ( ⊢ nat) =
fn xfn ycase x of
  | [ ⊢ z] ⇒ y
  | [ ⊢ succ N] ⇒ let [ ⊢ R] = add [ ⊢ N] y in [ ⊢ succ R];

list : type.
nil : list.
cons : natlistlist.

rec length : ( ⊢ list) → ( ⊢ nat) =
fn lcase l of
  | [ ⊢ nil] ⇒ [ ⊢ z]
  | [ ⊢ cons H T] ⇒ let [ ⊢ N] = length [ ⊢ T] in [ ⊢ succ N];

rec map : (( ⊢ nat) → ( ⊢ nat)) → ( ⊢ list) → ( ⊢ list) =
fn ffn lcase l of
  | [ ⊢ nil] ⇒ [ ⊢ nil]
  | [ ⊢ cons H T] ⇒ let [ ⊢ R] = f [ ⊢ H] in let [ ⊢ T'] = map f [ ⊢ T] in
    [ ⊢ cons R T'];

© Computation and Logic Group McGill University Logo
Department of Computer Science, McGill University
3480 University Street, Montreal, Quebec, Canada, H3A 0E9