2 ||M|| This file is part of HELM, an Hypertextual, Electronic
3 ||A|| Library of Mathematics, developed at the Computer Science
4 ||T|| Department of the University of Bologna, Italy.
8 \ / This file is distributed under the terms of the
9 \ / GNU General Public License Version 2
10 V_______________________________________________________________ *)
12 include "basics/pts.ma".
13 include "hints_declaration.ma".
15 (* propositional equality *)
17 inductive eq (A:Type[1]) (x:A) : A → Prop ≝
20 interpretation "leibnitz's equality" 'eq t x y = (eq t x y).
23 ∀A.∀a,x.∀p:eq ? x a.∀P: ∀x:A. eq ? x a → Type[2]. P a (refl A a) → P x p.
24 #A #a #x #p (cases p) // qed.
27 ∀A.∀a.∀P: ∀x:A. x = a → Prop. P a (refl A a) → ∀x.∀p:eq ? x a.P x p.
28 #A #a #P #p #x0 #p0; @(eq_rect_r ? ? ? p0) //; qed.
30 lemma eq_rect_Type0_r:
31 ∀A.∀a.∀P: ∀x:A. eq ? x a → Type[0]. P a (refl A a) → ∀x.∀p:eq ? x a.P x p.
32 #A #a #P #H #x #p (generalize in match H) (generalize in match P)
35 lemma eq_rect_Type2_r:
36 ∀A.∀a.∀P: ∀x:A. eq ? x a → Type[2]. P a (refl A a) → ∀x.∀p:eq ? x a.P x p.
37 #A #a #P #H #x #p (generalize in match H) (generalize in match P)
40 theorem rewrite_l: ∀A:Type[1].∀x.∀P:A → Type[1]. P x → ∀y. x = y → P y.
41 #A #x #P #Hx #y #Heq (cases Heq); //; qed.
43 theorem sym_eq: ∀A.∀x,y:A. x = y → y = x.
44 #A #x #y #Heq @(rewrite_l A x (λz.z=x)); //; qed.
46 theorem rewrite_r: ∀A:Type[1].∀x.∀P:A → Type[1]. P x → ∀y. y = x → P y.
47 #A #x #P #Hx #y #Heq (cases (sym_eq ? ? ? Heq)); //; qed.
49 theorem eq_coerc: ∀A,B:Type[0].A→(A=B)→B.
50 #A #B #Ha #Heq (elim Heq); //; qed.
52 theorem trans_eq : ∀A.∀x,y,z:A. x = y → y = z → x = z.
53 #A #x #y #z #H1 #H2 >H1; //; qed.
55 theorem eq_f: ∀A,B.∀f:A→B.∀x,y:A. x=y → f x = f y.
56 #A #B #f #x #y #H >H; //; qed.
58 (* deleterio per auto? *)
59 theorem eq_f2: ∀A,B,C.∀f:A→B→C.
60 ∀x1,x2:A.∀y1,y2:B. x1=x2 → y1=y2 → f x1 y1 = f x2 y2.
61 #A #B #C #f #x1 #x2 #y1 #y2 #E1 #E2 >E1; >E2; //; qed.
63 lemma eq_f3: ∀A,B,C,D.∀f:A→B→C->D.
64 ∀x1,x2:A.∀y1,y2:B. ∀z1,z2:C. x1=x2 → y1=y2 → z1=z2 → f x1 y1 z1 = f x2 y2 z2.
65 #A #B #C #D #f #x1 #x2 #y1 #y2 #z1 #z2 #E1 #E2 #E3 >E1; >E2; >E3 //; qed.
67 (* hint to genereric equality
68 definition eq_equality: equality ≝
69 mk_equality eq refl rewrite_l rewrite_r.
72 unification hint 0 ≔ T,a,b;
74 (*------------------------------------*) ⊢
75 equal X T a b ≡ eq T a b.
78 (********** connectives ********)
80 inductive True: Prop ≝
83 inductive False: Prop ≝ .
85 (* ndefinition Not: Prop → Prop ≝
88 inductive Not (A:Prop): Prop ≝
89 nmk: (A → False) → Not A.
91 interpretation "logical not" 'not x = (Not x).
93 theorem absurd : ∀A:Prop. A → ¬A → False.
94 #A #H #Hn (elim Hn); /2/; qed.
97 ntheorem absurd : ∀ A,C:Prop. A → ¬A → C.
98 #A; #C; #H; #Hn; nelim (Hn H).
101 theorem not_to_not : ∀A,B:Prop. (A → B) → ¬B →¬A.
105 interpretation "leibnitz's non-equality" 'neq t x y = (Not (eq t x y)).
107 theorem sym_not_eq: ∀A.∀x,y:A. x ≠ y → y ≠ x.
111 inductive And (A,B:Prop) : Prop ≝
112 conj : A → B → And A B.
114 interpretation "logical and" 'and x y = (And x y).
116 theorem proj1: ∀A,B:Prop. A ∧ B → A.
117 #A #B #AB (elim AB) //; qed.
119 theorem proj2: ∀ A,B:Prop. A ∧ B → B.
120 #A #B #AB (elim AB) //; qed.
123 inductive Or (A,B:Prop) : Prop ≝
124 or_introl : A → (Or A B)
125 | or_intror : B → (Or A B).
127 interpretation "logical or" 'or x y = (Or x y).
129 definition decidable : Prop → Prop ≝
133 inductive ex (A:Type[0]) (P:A → Prop) : Prop ≝
134 ex_intro: ∀ x:A. P x → ex A P.
136 interpretation "exists" 'exists x = (ex ? x).
138 inductive ex2 (A:Type[0]) (P,Q:A →Prop) : Prop ≝
139 ex_intro2: ∀ x:A. P x → Q x → ex2 A P Q.
143 λ A,B. (A → B) ∧ (B → A).
145 interpretation "iff" 'iff a b = (iff a b).
147 (* cose per destruct: da rivedere *)
149 definition R0 ≝ λT:Type[0].λt:T.t.
151 definition R1 ≝ eq_rect_Type0.
153 (* used for lambda-delta *)
157 ∀T1:∀x0:T0. a0=x0 → Type[0].
158 ∀a1:T1 a0 (refl ? a0).
159 ∀T2:∀x0:T0. ∀p0:a0=x0. ∀x1:T1 x0 p0. R1 ?? T1 a1 ? p0 = x1 → Type[0].
160 ∀a2:T2 a0 (refl ? a0) a1 (refl ? a1).
164 ∀e1:R1 ?? T1 a1 ? e0 = b1.
166 #T0 #a0 #T1 #a1 #T2 #a2 #b0 #e0 #b1 #e1
167 @(eq_rect_Type0 ????? e1)
175 ∀T1:∀x0:T0. a0=x0 → Type[0].
176 ∀a1:T1 a0 (refl ? a0).
177 ∀T2:∀x0:T0. ∀p0:a0=x0. ∀x1:T1 x0 p0. R1 ?? T1 a1 ? p0 = x1 → Type[0].
178 ∀a2:T2 a0 (refl ? a0) a1 (refl ? a1).
179 ∀T3:∀x0:T0. ∀p0:a0=x0. ∀x1:T1 x0 p0.∀p1:R1 ?? T1 a1 ? p0 = x1.
180 ∀x2:T2 x0 p0 x1 p1.R2 ???? T2 a2 x0 p0 ? p1 = x2 → Type[0].
181 ∀a3:T3 a0 (refl ? a0) a1 (refl ? a1) a2 (refl ? a2).
185 ∀e1:R1 ?? T1 a1 ? e0 = b1.
187 ∀e2:R2 ???? T2 a2 b0 e0 ? e1 = b2.
188 T3 b0 e0 b1 e1 b2 e2.
189 #T0 #a0 #T1 #a1 #T2 #a2 #T3 #a3 #b0 #e0 #b1 #e1 #b2 #e2
190 @(eq_rect_Type0 ????? e2)
191 @(R2 ?? ? ???? e0 ? e1)
198 ∀T1:∀x0:T0. eq T0 a0 x0 → Type[0].
199 ∀a1:T1 a0 (refl T0 a0).
200 ∀T2:∀x0:T0. ∀p0:eq (T0 …) a0 x0. ∀x1:T1 x0 p0.eq (T1 …) (R1 T0 a0 T1 a1 x0 p0) x1 → Type[0].
201 ∀a2:T2 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1).
202 ∀T3:∀x0:T0. ∀p0:eq (T0 …) a0 x0. ∀x1:T1 x0 p0.∀p1:eq (T1 …) (R1 T0 a0 T1 a1 x0 p0) x1.
203 ∀x2:T2 x0 p0 x1 p1.eq (T2 …) (R2 T0 a0 T1 a1 T2 a2 x0 p0 x1 p1) x2 → Type[0].
204 ∀a3:T3 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1)
205 a2 (refl (T2 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1)) a2).
206 ∀T4:∀x0:T0. ∀p0:eq (T0 …) a0 x0. ∀x1:T1 x0 p0.∀p1:eq (T1 …) (R1 T0 a0 T1 a1 x0 p0) x1.
207 ∀x2:T2 x0 p0 x1 p1.∀p2:eq (T2 …) (R2 T0 a0 T1 a1 T2 a2 x0 p0 x1 p1) x2.
208 ∀x3:T3 x0 p0 x1 p1 x2 p2.∀p3:eq (T3 …) (R3 T0 a0 T1 a1 T2 a2 T3 a3 x0 p0 x1 p1 x2 p2) x3.
210 ∀a4:T4 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1)
211 a2 (refl (T2 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1)) a2)
212 a3 (refl (T3 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1)
213 a2 (refl (T2 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1)) a2))
218 ∀e1:eq (T1 …) (R1 T0 a0 T1 a1 b0 e0) b1.
220 ∀e2:eq (T2 …) (R2 T0 a0 T1 a1 T2 a2 b0 e0 b1 e1) b2.
221 ∀b3: T3 b0 e0 b1 e1 b2 e2.
222 ∀e3:eq (T3 …) (R3 T0 a0 T1 a1 T2 a2 T3 a3 b0 e0 b1 e1 b2 e2) b3.
223 T4 b0 e0 b1 e1 b2 e2 b3 e3.
224 #T0 #a0 #T1 #a1 #T2 #a2 #T3 #a3 #T4 #a4 #b0 #e0 #b1 #e1 #b2 #e2 #b3 #e3
225 @(eq_rect_Type0 ????? e3)
226 @(R3 ????????? e0 ? e1 ? e2)
230 (* TODO concrete definition by means of proof irrelevance *)
231 axiom streicherK : ∀T:Type[1].∀t:T.∀P:t = t → Type[2].P (refl ? t) → ∀p.P p.