Types
tp : type.
bool : tp.
nat : tp.
Values
value : tp → type.
v_zero : value nat.
v_succ : value nat → value nat.
v_true : value bool.
v_false : value bool.
Typed expressions
term : tp → type.
true : term bool.
false : term bool.
switch : term bool → term T → term T → term T.
z : term nat.
succ : term nat → term nat.
pred : term nat → term nat.
iszero : term nat → term bool.
rec eval : ( ⊢ term ) → ( ⊢ value ) =
fn m ⇒
case m of
| [ ⊢ true] ⇒ [ ⊢ v_true]
| [ ⊢ false] ⇒ [ ⊢ v_false]
| [ ⊢ switch ] ⇒
(case eval [ ⊢ ] of
| [ ⊢ v_true] ⇒ eval [ ⊢ ]
| [ ⊢ v_false] ⇒ eval [ ⊢ ])
| [ ⊢ z] ⇒ [ ⊢ v_zero]
| [ ⊢ succ ] ⇒ let [ ⊢ ] = eval [ ⊢ ] in [ ⊢ v_succ ]
| [ ⊢ pred ] ⇒
(case eval [ ⊢ ] of
| [ ⊢ v_zero] ⇒ [ ⊢ v_zero]
| [ ⊢ v_succ ] ⇒ [ ⊢ ]);
list : term nat → type.
nil : list z.
cons : tp → list N → list (succ N).
yes_or_no : type.
yes : yes_or_no.
no : yes_or_no.
leq : term nat → term nat → type.
le_z : leq z N.
le_s : leq N M → leq (succ N) (succ M).
rec lemma_leq : ( ⊢ leq ) → ( ⊢ leq (succ )) =
fn d ⇒
case d of
| [ ⊢ le_z] ⇒ [ ⊢ le_z]
| [ ⊢ le_s ] ⇒ let [ ⊢ ] = lemma_leq [ ⊢ ] in [ ⊢ le_s ];
exists_smaller_or_equal_list : term nat → type.
smaller_or_equal_list : list M → leq M N → exists_smaller_or_equal_list N.
rec filter :
( ⊢ list ) →
(( ⊢ tp) → ( ⊢ yes_or_no)) → ( ⊢ exists_smaller_or_equal_list ) =
fn l ⇒ fn f ⇒
case l of
| [ ⊢ nil] ⇒ [ ⊢ smaller_or_equal_list nil le_z]
| [ ⊢ cons ] ⇒ (let [ ⊢ smaller_or_equal_list ] = filter [ ⊢ ] f
in
case f [ ⊢ ] of
| [ ⊢ yes] ⇒ [ ⊢ smaller_or_equal_list (cons ) (le_s )]
| [ ⊢ no] ⇒ let [ ⊢ ] = lemma_leq [ ⊢ ] in
[ ⊢ smaller_or_equal_list ]);
© Computation and Logic Group
Department of Computer Science, McGill University
3480 University Street, Montreal, Quebec, Canada, H3A 0E9