2 Author: Lawrence C Paulson, Cambridge University Computer Laboratory
3 Copyright 1991 University of Cambridge
6 header {* The two-element type (booleans and conditionals) *}
25 cond :: "[i,i,i]=>i" where
26 "cond(a,b,c) == when(a, %u. b, %u. c)"
28 lemmas bool_defs = Bool_def true_def false_def cond_def
31 subsection {* Derivation of rules for the type Bool *}
34 lemma boolF: "Bool type"
35 apply (unfold bool_defs)
36 apply (tactic "typechk_tac []")
40 (*introduction rules for true, false*)
42 lemma boolI_true: "true : Bool"
43 apply (unfold bool_defs)
44 apply (tactic "typechk_tac []")
47 lemma boolI_false: "false : Bool"
48 apply (unfold bool_defs)
49 apply (tactic "typechk_tac []")
52 (*elimination rule: typing of cond*)
54 "[| p:Bool; a : C(true); b : C(false) |] ==> cond(p,a,b) : C(p)"
55 apply (unfold bool_defs)
56 apply (tactic "typechk_tac []")
57 apply (erule_tac [!] TE)
58 apply (tactic "typechk_tac []")
62 "[| p = q : Bool; a = c : C(true); b = d : C(false) |]
63 ==> cond(p,a,b) = cond(q,c,d) : C(p)"
64 apply (unfold bool_defs)
66 apply (erule asm_rl refl_elem [THEN TEL])+
69 (*computation rules for true, false*)
72 "[| a : C(true); b : C(false) |] ==> cond(true,a,b) = a : C(true)"
73 apply (unfold bool_defs)
75 apply (tactic "typechk_tac []")
76 apply (erule_tac [!] TE)
77 apply (tactic "typechk_tac []")
81 "[| a : C(true); b : C(false) |] ==> cond(false,a,b) = b : C(false)"
82 apply (unfold bool_defs)
84 apply (tactic "typechk_tac []")
85 apply (erule_tac [!] TE)
86 apply (tactic "typechk_tac []")