1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| The HELM team. *)
8 (* ||A|| http://helm.cs.unibo.it *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU General Public License Version 2 *)
13 (**************************************************************************)
15 include "logic/connectives.ma".
16 include "properties/relations.ma".
18 ninductive eq (A: Type[0]) (a: A) : A → CProp[0] ≝
21 nlemma eq_rect_CProp0_r':
22 ∀A.∀a,x.∀p:eq ? x a.∀P: ∀x:A. eq ? x a → CProp[0]. P a (refl A a) → P x p.
23 #A; #a; #x; #p; ncases p; #P; #H; nassumption.
26 nlemma eq_rect_CProp0_r:
27 ∀A.∀a.∀P: ∀x:A. eq ? x a → CProp[0]. P a (refl A a) → ∀x.∀p:eq ? x a.P x p.
28 #A; #a; #P; #p; #x0; #p0; napply (eq_rect_CProp0_r' ??? p0); nassumption.
32 ∀A.∀a.∀P: ∀x:A. eq ? x a → Prop. P a (refl A a) → ∀x.∀p:eq ? x a.P x p.
33 #A; #a; #P; #p; #x0; #p0; napply (eq_rect_CProp0_r' ??? p0); nassumption.
36 interpretation "leibnitz's equality" 'eq t x y = (eq t x y).
38 interpretation "leibnitz's non-equality" 'neq t x y = (Not (eq t x y)).
40 ndefinition R0 ≝ λT:Type[0].λt:T.t.
42 ndefinition R1 ≝ eq_rect_Type0.
47 ∀T1:∀x0:T0. a0=x0 → Type[0].
48 ∀a1:T1 a0 (refl ? a0).
49 ∀T2:∀x0:T0. ∀p0:a0=x0. ∀x1:T1 x0 p0. R1 ?? T1 a1 ? p0 = x1 → Type[0].
50 ∀a2:T2 a0 (refl ? a0) a1 (refl ? a1).
54 ∀e1:R1 ?? T1 a1 ? e0 = b1.
56 #T0;#a0;#T1;#a1;#T2;#a2;#b0;#e0;#b1;#e1;
57 napply (eq_rect_Type0 ????? e1);
58 napply (R1 ?? ? ?? e0);
65 ∀T1:∀x0:T0. a0=x0 → Type[0].
66 ∀a1:T1 a0 (refl ? a0).
67 ∀T2:∀x0:T0. ∀p0:a0=x0. ∀x1:T1 x0 p0. R1 ?? T1 a1 ? p0 = x1 → Type[0].
68 ∀a2:T2 a0 (refl ? a0) a1 (refl ? a1).
69 ∀T3:∀x0:T0. ∀p0:a0=x0. ∀x1:T1 x0 p0.∀p1:R1 ?? T1 a1 ? p0 = x1.
70 ∀x2:T2 x0 p0 x1 p1.R2 ???? T2 a2 x0 p0 ? p1 = x2 → Type[0].
71 ∀a3:T3 a0 (refl ? a0) a1 (refl ? a1) a2 (refl ? a2).
75 ∀e1:R1 ?? T1 a1 ? e0 = b1.
77 ∀e2:R2 ???? T2 a2 b0 e0 ? e1 = b2.
79 #T0;#a0;#T1;#a1;#T2;#a2;#T3;#a3;#b0;#e0;#b1;#e1;#b2;#e2;
80 napply (eq_rect_Type0 ????? e2);
81 napply (R2 ?? ? ???? e0 ? e1);
88 ∀T1:∀x0:T0. eq T0 a0 x0 → Type[0].
89 ∀a1:T1 a0 (refl T0 a0).
90 ∀T2:∀x0:T0. ∀p0:eq (T0 …) a0 x0. ∀x1:T1 x0 p0.eq (T1 …) (R1 T0 a0 T1 a1 x0 p0) x1 → Type[0].
91 ∀a2:T2 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1).
92 ∀T3:∀x0:T0. ∀p0:eq (T0 …) a0 x0. ∀x1:T1 x0 p0.∀p1:eq (T1 …) (R1 T0 a0 T1 a1 x0 p0) x1.
93 ∀x2:T2 x0 p0 x1 p1.eq (T2 …) (R2 T0 a0 T1 a1 T2 a2 x0 p0 x1 p1) x2 → Type[0].
94 ∀a3:T3 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1)
95 a2 (refl (T2 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1)) a2).
96 ∀T4:∀x0:T0. ∀p0:eq (T0 …) a0 x0. ∀x1:T1 x0 p0.∀p1:eq (T1 …) (R1 T0 a0 T1 a1 x0 p0) x1.
97 ∀x2:T2 x0 p0 x1 p1.∀p2:eq (T2 …) (R2 T0 a0 T1 a1 T2 a2 x0 p0 x1 p1) x2.
98 ∀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.
100 ∀a4:T4 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1)
101 a2 (refl (T2 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1)) a2)
102 a3 (refl (T3 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1)
103 a2 (refl (T2 a0 (refl T0 a0) a1 (refl (T1 a0 (refl T0 a0)) a1)) a2))
108 ∀e1:eq (T1 …) (R1 T0 a0 T1 a1 b0 e0) b1.
110 ∀e2:eq (T2 …) (R2 T0 a0 T1 a1 T2 a2 b0 e0 b1 e1) b2.
111 ∀b3: T3 b0 e0 b1 e1 b2 e2.
112 ∀e3:eq (T3 …) (R3 T0 a0 T1 a1 T2 a2 T3 a3 b0 e0 b1 e1 b2 e2) b3.
113 T4 b0 e0 b1 e1 b2 e2 b3 e3.
114 #T0;#a0;#T1;#a1;#T2;#a2;#T3;#a3;#T4;#a4;#b0;#e0;#b1;#e1;#b2;#e2;#b3;#e3;
115 napply (eq_rect_Type0 ????? e3);
116 napply (R3 ????????? e0 ? e1 ? e2);
120 naxiom streicherK : ∀T:Type[0].∀t:T.∀P:t = t → Type[2].P (refl ? t) → ∀p.P p.
122 ndefinition EQ: ∀A:Type[0]. equivalence_relation A.
123 #A; napply mk_equivalence_relation
126 | #x; #y; #H; nrewrite < H; napply refl
127 | #x; #y; #z; #Hyx; #Hxz; nrewrite < Hxz; nassumption]
131 naxiom T2 : T1 → Type[0].
133 naxiom t2 : ∀x:T1. T2 x.
135 ninductive I2 : ∀r1:T1.T2 r1 → Type[0] ≝
136 | i2c1 : ∀x1:T1.∀x2:T2 x1. I2 x1 x2
137 | i2c2 : I2 t1 (t2 t1).
139 (* nlemma i2d : ∀a,b.∀x,y:I2 a b.
140 ∀e1:a = a.∀e2:R1 T1 a (λz,p.T2 z) b a e1 = b.
141 ∀e: R2 T1 a (λz,p.T2 z) b (λz1,p1,z2,p2.I2 z1 z2) x a e1 b e2 = y.
145 match x return (λr1,r2,r.
146 ∀e1:r1 = a. ∀e2:R1 T1 r1 (λz,p. T2 z) r2 a e1 = b.
147 ∀e :R2 T1 r1 (λz,p. T2 z) r2 (λz1,p1,z2,p2. I2 z1 z2) r a e1 b e2 = y. Type[2]) with
151 [napply (match y return (λr1,r2,r.
152 ∀e1: x1 = r1. ∀e2: R1 T1 x1 (λz,p. T2 z) x2 r1 e1 = r2.
153 ∀e : R2 T1 x1 (λz,p.T2 z) x2 (λz1,p1,z2,p2. I2 z1 z2) (i2c1 x1 x2) r1 e1 r2 e2 = r. Type[2]) with
158 (∀f1:x1 = y1. ∀f2: R1 T1 x1 (λz,p.T2 z) x2 y1 f1 = y2.
159 ∀f: R2 T1 x1 (λz,p.T2 z) x2
161 (i2c1 (R1 ??? z1 ? (R1 ?? (λm,n.m = y1) f1 ? p1)) ?)
162 (* (R2 ???? (λm1,n1,m2,n2.R1 ?? (λm,n.T2 m) ? ? f1 = y2) f2 ?
164 (* (R2 ???? (λw1,q1,w2,q2.I2 w1 w2) (i2c1 z1 z2)
165 ? (R1 ?? (λw,q.w = y1) e1 z1 p1)
167 (λw1,q1,w2,q2.R1 ?? (λm,n.T2 m) w2 ? q1 = y2)
168 e2 z1 p1 (R1 T1 x1 (λw,q.w = y1) e1 z1 p1) p2))
170 ? y1 f1 y2 f2 = refl (I2 y1 y2) (i2c1 y1 y2).P)
173 (∀f1:x1 = y1. ∀f2: R1 T1 x1 (λz,p.T2 z) x2 y1 f1 = y2.
174 ∀f: R2 T1 x1 (λz,p.T2 z) x2
175 (λz1,p1,z2,p2.eq (I2 y1 y2)
176 (R2 T1 z1 (λw,q.T2 w) z2 (λw1,q1,w2,q2.I2 w1 w2) (i2c1 z1 z2)
177 y1 (R1 T1 x1 (λw,q.w = y1) e1 z1 p1)
178 y2 (R2 T1 x1 (λw,q.w = y1) e1
179 (λw1,q1,w2,q2.R1 ??? w2 w1 q1 = y2) e2 z1 p1 (R1 T1 x1 (λw,q.w = y1) e1 z1 p1) p2))
181 e y1 f1 y2 f2 = refl (I2 y1 y2) (i2c1 y1 y2).P)
185 ndefinition i2d : ∀a,b.∀x,y:I2 a b.
186 ∀e1:a = a.∀e2:R1 T1 a (λz,p.T2 z) b a e1 = b.
187 ∀e: R2 T1 a (λz,p.T2 z) b (λz1,p1,z2,p2.I2 z1 z2) x a e1 b e2 = y.Type[2] ≝
189 match x return (λr1,r2,r.
190 ∀e1:r1 = a. ∀e2:R1 T1 r1 (λz,p. T2 z) r2 a e1 = b.
191 ∀e :R2 T1 r1 (λz,p. T2 z) r2 (λz1,p1,z2,p2. I2 z1 z2) r a e1 b e2 = y. Type[2]) with
193 match y return (λr1,r2,r.
194 ∀e1: x1 = r1. ∀e2: R1 T1 x1 (λz,p. T2 z) x2 r1 e1 = r2.
195 ∀e : R2 T1 x1 (λz,p.T2 z) x2 (λz1,p1,z2,p2. I2 z1 z2) (i2c1 x1 x2) r1 e1 r2 e2 = r. Type[2]) with
196 [ i2c1 y1 y2 ⇒ λe1,e2,e.∀P:Type[1].
197 (∀f1:x1 = y1. ∀f2: R1 T1 x1 (λz,p.T2 z) x2 y1 f1 = y2.
198 ∀f: R2 T1 x1 (λz,p.T2 z) x2
199 (λz1,p1,z2,p2.eq (I2 y1 y2)
200 (R2 T1 z1 (λw,q.T2 w) z2 (λw1,q1,w2,q2.I2 w1 w2) (i2c1 z1 z2)
201 y1 (R1 T1 x1 (λw,q.w = y1) e1 z1 p1)
202 y2 (R2 T1 x1 (λw,q.w = y1) e1
203 (λw1,q1,w2,q2.R1 ??? w2 w1 q1 = y2) e2 z1 p1 (R1 T1 x1 (λw,q.w = y1) e1 z1 p1) p2))
205 e y1 f1 y2 f2 = refl (I2 y1 y2) (i2c1 y1 y2).P)
207 | i2c2 ⇒ λe1,e2,e.∀P:Type[1].P ]
209 match y return (λr1,r2,r.
210 ∀e1: x1 = r1. ∀e2: R1 ?? (λz,p. T2 z) x2 ? e1 = r2.
211 ∀e : R2 ???? (λz1,p1,z2,p2. I2 z1 z2) i2c2 ? e1 ? e2 = r. Type[2]) with
212 [ i2c1 _ _ ⇒ λe1,e2,e.∀P:Type[1].P
213 | i2c2 ⇒ λe1,e2,e.∀P:Type[1].
215 (λz1,p1,z2,p2.eq ? i2c2 i2c2)
216 e ? e1 ? e2 = refl ? i2c2.P) → P ] ].