Types

tp : type.
bool : tp.
nat : tp.

Values

value : tptype.
v_zero : value nat.
v_succ : value natvalue nat.
v_true : value bool.
v_false : value bool.

Typed expressions

term : tptype.
true : term bool.
false : term bool.
switch : term boolterm Tterm Tterm T.
z : term nat.
succ : term natterm nat.
pred : term natterm nat.
iszero : term natterm bool.

rec eval : ( ⊢ term T) → ( ⊢ value T) =
fn mcase m of
  | [ ⊢ true] ⇒ [ ⊢ v_true]
  | [ ⊢ false] ⇒ [ ⊢ v_false]
  | [ ⊢ switch T1 T2 T3] ⇒
    (case eval [ ⊢ T1] of
     | [ ⊢ v_true] ⇒ eval [ ⊢ T2]
     | [ ⊢ v_false] ⇒ eval [ ⊢ T3])
  | [ ⊢ z] ⇒ [ ⊢ v_zero]
  | [ ⊢ succ N] ⇒ let [ ⊢ V] = eval [ ⊢ N] in [ ⊢ v_succ V]
  | [ ⊢ pred N] ⇒
    (case eval [ ⊢ N] of
     | [ ⊢ v_zero] ⇒ [ ⊢ v_zero]
     | [ ⊢ v_succ V] ⇒ [ ⊢ V]);

list : term nattype.
nil : list z.
cons : tplist Nlist (succ N).

yes_or_no : type.
yes : yes_or_no.
no : yes_or_no.

leq : term natterm nattype.
le_z : leq z N.
le_s : leq N Mleq (succ N) (succ M).

rec lemma_leq : ( ⊢ leq M N) → ( ⊢ leq M (succ N)) =
fn dcase d of
  | [ ⊢ le_z] ⇒ [ ⊢ le_z]
  | [ ⊢ le_s D] ⇒ let [ ⊢ E] = lemma_leq [ ⊢ D] in [ ⊢ le_s E];

exists_smaller_or_equal_list : term nattype.
smaller_or_equal_list : list Mleq M Nexists_smaller_or_equal_list N.

rec filter :
  ( ⊢ list N) →
    (( ⊢ tp) → ( ⊢ yes_or_no)) → ( ⊢ exists_smaller_or_equal_list N) =
fn lfn fcase l of
  | [ ⊢ nil] ⇒ [ ⊢ smaller_or_equal_list nil le_z]
  | [ ⊢ cons H T] ⇒ (let [ ⊢ smaller_or_equal_list T' Prf] = filter [ ⊢ T] f
    in
    case f [ ⊢ H] of
    | [ ⊢ yes] ⇒ [ ⊢ smaller_or_equal_list (cons H T') (le_s Prf)]
    | [ ⊢ no] ⇒ let [ ⊢ Prf'] = lemma_leq [ ⊢ Prf] in
      [ ⊢ smaller_or_equal_list T' Prf']);

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