| true : bool
| false : bool.
-(* destruct does not work *)
theorem not_eq_true_false : true ≠ false.
-@nmk #Heq change with match true with [true ⇒ False|false ⇒ True]
->Heq // qed.
+@nmk #Heq destruct
+qed.
definition notb : bool → bool ≝
λ b:bool. match b with [true ⇒ false|false ⇒ true ].
theorem andb_true_r: ∀b1,b2. (b1 ∧ b2) = true → b2 = true.
#b1 #b2 (cases b1) normalize // (cases b2) // qed.
+theorem andb_true: ∀b1,b2. (b1 ∧ b2) = true → b1 = true ∧ b2 = true.
+/3/ qed.
+
definition orb : bool → bool → bool ≝
λb1,b2:bool.match b1 with [ true ⇒ true | false ⇒ b2].
match b1 with [ true ⇒ P true | false ⇒ P b2] → P (orb b1 b2).
#b1 #b2 #P (elim b1) normalize // qed.
-definition if_then_else: ∀A:Type[0]. bool → A → A → A ≝
-λA.λb.λ P,Q:A. match b with [ true ⇒ P | false ⇒ Q].
+lemma orb_true_r1: ∀b1,b2:bool.
+ b1 = true → (b1 ∨ b2) = true.
+#b1 #b2 #H >H // qed.
+
+lemma orb_true_r2: ∀b1,b2:bool.
+ b2 = true → (b1 ∨ b2) = true.
+#b1 #b2 #H >H cases b1 // qed.
+
+lemma orb_true_l: ∀b1,b2:bool.
+ (b1 ∨ b2) = true → (b1 = true) ∨ (b2 = true).
+* normalize /2/ qed.
+
+definition xorb : bool → bool → bool ≝
+λb1,b2:bool.
+ match b1 with
+ [ true ⇒ match b2 with [ true ⇒ false | false ⇒ true ]
+ | false ⇒ match b2 with [ true ⇒ true | false ⇒ false ]].
+
+notation > "'if' term 46 e 'then' term 46 t 'else' term 46 f" non associative with precedence 46
+ for @{ match $e in bool with [ true ⇒ $t | false ⇒ $f] }.
+notation < "hvbox('if' \nbsp term 46 e \nbsp break 'then' \nbsp term 46 t \nbsp break 'else' \nbsp term 49 f \nbsp)" non associative with precedence 46
+ for @{ match $e with [ true ⇒ $t | false ⇒ $f] }.
theorem bool_to_decidable_eq:
∀b1,b2:bool. decidable (b1=b2).
#b (cases b) /2/ qed.
+(****** DeqSet: a set with a decidbale equality ******)
+
+record DeqSet : Type[1] ≝ { carr :> Type[0];
+ eqb: carr → carr → bool;
+ eqb_true: ∀x,y. (eqb x y = true) ↔ (x = y)
+}.
+
+notation "a == b" non associative with precedence 45 for @{ 'eqb $a $b }.
+interpretation "eqb" 'eqb a b = (eqb ? a b).
+
+
+(****** EnumSet: a DeqSet with an enumeration function ******
+
+record EnumSet : Type[1] ≝ { carr :> DeqSet;
+ enum: carr
+ eqb_true: ∀x,y. (eqb x y = true) ↔ (x = y)
+}.
+
+*)