]> matita.cs.unibo.it Git - helm.git/blob - helm/software/matita/contribs/LAMBDA-TYPES/Level-1/problems-1.ma
subst0 completed
[helm.git] / helm / software / matita / contribs / LAMBDA-TYPES / Level-1 / problems-1.ma
1 (**************************************************************************)
2 (*       ___                                                              *)
3 (*      ||M||                                                             *)
4 (*      ||A||       A project by Andrea Asperti                           *)
5 (*      ||T||                                                             *)
6 (*      ||I||       Developers:                                           *)
7 (*      ||T||         The HELM team.                                      *)
8 (*      ||A||         http://helm.cs.unibo.it                             *)
9 (*      \   /                                                             *)
10 (*       \ /        This file is distributed under the terms of the       *)
11 (*        v         GNU General Public License Version 2                  *)
12 (*                                                                        *)
13 (**************************************************************************)
14
15 (* Problematic objects for disambiguation/typechecking ********************)
16 (* FG: PLEASE COMMENT THE NON WORKING OBJECTS *****************************)
17
18 set "baseuri" "cic:/matita/LAMBDA-TYPES/Level-1/problems".
19
20 include "LambdaDelta/theory.ma".
21
22 theorem iso_trans:
23  \forall (t1: T).(\forall (t2: T).((iso t1 t2) \to (\forall (t3: T).((iso t2 
24 t3) \to (iso t1 t3)))))
25 \def
26  \lambda (t1: T).(\lambda (t2: T).(\lambda (H: (iso t1 t2)).(iso_ind (\lambda 
27 (t: T).(\lambda (t0: T).(\forall (t3: T).((iso t0 t3) \to (iso t t3))))) 
28 (\lambda (n1: nat).(\lambda (n2: nat).(\lambda (t3: T).(\lambda (H0: (iso 
29 (TSort n2) t3)).(let H1 \def (match H0 in iso return (\lambda (t: T).(\lambda 
30 (t0: T).(\lambda (_: (iso t t0)).((eq T t (TSort n2)) \to ((eq T t0 t3) \to 
31 (iso (TSort n1) t3)))))) with [(iso_sort n0 n3) \Rightarrow (\lambda (H0: (eq 
32 T (TSort n0) (TSort n2))).(\lambda (H1: (eq T (TSort n3) t3)).((let H2 \def 
33 (f_equal T nat (\lambda (e: T).(match e in T return (\lambda (_: T).nat) with 
34 [(TSort n) \Rightarrow n | (TLRef _) \Rightarrow n0 | (THead _ _ _) 
35 \Rightarrow n0])) (TSort n0) (TSort n2) H0) in (eq_ind nat n2 (\lambda (_: 
36 nat).((eq T (TSort n3) t3) \to (iso (TSort n1) t3))) (\lambda (H3: (eq T 
37 (TSort n3) t3)).(eq_ind T (TSort n3) (\lambda (t: T).(iso (TSort n1) t)) 
38 (iso_sort n1 n3) t3 H3)) n0 (sym_eq nat n0 n2 H2))) H1))) | (iso_lref i1 i2) 
39 \Rightarrow (\lambda (H0: (eq T (TLRef i1) (TSort n2))).(\lambda (H1: (eq T 
40 (TLRef i2) t3)).((let H2 \def (eq_ind T (TLRef i1) (\lambda (e: T).(match e 
41 in T return (\lambda (_: T).Prop) with [(TSort _) \Rightarrow False | (TLRef 
42 _) \Rightarrow True | (THead _ _ _) \Rightarrow False])) I (TSort n2) H0) in 
43 (False_ind ((eq T (TLRef i2) t3) \to (iso (TSort n1) t3)) H2)) H1))) | 
44 (iso_head k v1 v2 t1 t2) \Rightarrow (\lambda (H0: (eq T (THead k v1 t1) 
45 (TSort n2))).(\lambda (H1: (eq T (THead k v2 t2) t3)).((let H2 \def (eq_ind T 
46 (THead k v1 t1) (\lambda (e: T).(match e in T return (\lambda (_: T).Prop) 
47 with [(TSort _) \Rightarrow False | (TLRef _) \Rightarrow False | (THead _ _ 
48 _) \Rightarrow True])) I (TSort n2) H0) in (False_ind ((eq T (THead k v2 t2) 
49 t3) \to (iso (TSort n1) t3)) H2)) H1)))]) in (H1 (refl_equal T (TSort n2)) 
50 (refl_equal T t3))))))) (\lambda (i1: nat).(\lambda (i2: nat).(\lambda (t3: 
51 T).(\lambda (H0: (iso (TLRef i2) t3)).(let H1 \def (match H0 in iso return 
52 (\lambda (t: T).(\lambda (t0: T).(\lambda (_: (iso t t0)).((eq T t (TLRef 
53 i2)) \to ((eq T t0 t3) \to (iso (TLRef i1) t3)))))) with [(iso_sort n1 n2) 
54 \Rightarrow (\lambda (H0: (eq T (TSort n1) (TLRef i2))).(\lambda (H1: (eq T 
55 (TSort n2) t3)).((let H2 \def (eq_ind T (TSort n1) (\lambda (e: T).(match e 
56 in T return (\lambda (_: T).Prop) with [(TSort _) \Rightarrow True | (TLRef 
57 _) \Rightarrow False | (THead _ _ _) \Rightarrow False])) I (TLRef i2) H0) in 
58 (False_ind ((eq T (TSort n2) t3) \to (iso (TLRef i1) t3)) H2)) H1))) | 
59 (iso_lref i0 i3) \Rightarrow (\lambda (H0: (eq T (TLRef i0) (TLRef 
60 i2))).(\lambda (H1: (eq T (TLRef i3) t3)).((let H2 \def (f_equal T nat 
61 (\lambda (e: T).(match e in T return (\lambda (_: T).nat) with [(TSort _) 
62 \Rightarrow i0 | (TLRef n) \Rightarrow n | (THead _ _ _) \Rightarrow i0])) 
63 (TLRef i0) (TLRef i2) H0) in (eq_ind nat i2 (\lambda (_: nat).((eq T (TLRef 
64 i3) t3) \to (iso (TLRef i1) t3))) (\lambda (H3: (eq T (TLRef i3) t3)).(eq_ind 
65 T (TLRef i3) (\lambda (t: T).(iso (TLRef i1) t)) (iso_lref i1 i3) t3 H3)) i0 
66 (sym_eq nat i0 i2 H2))) H1))) | (iso_head k v1 v2 t1 t2) \Rightarrow (\lambda 
67 (H0: (eq T (THead k v1 t1) (TLRef i2))).(\lambda (H1: (eq T (THead k v2 t2) 
68 t3)).((let H2 \def (eq_ind T (THead k v1 t1) (\lambda (e: T).(match e in T 
69 return (\lambda (_: T).Prop) with [(TSort _) \Rightarrow False | (TLRef _) 
70 \Rightarrow False | (THead _ _ _) \Rightarrow True])) I (TLRef i2) H0) in 
71 (False_ind ((eq T (THead k v2 t2) t3) \to (iso (TLRef i1) t3)) H2)) H1)))]) 
72 in (H1 (refl_equal T (TLRef i2)) (refl_equal T t3))))))) (\lambda (k: 
73 K).(\lambda (v1: T).(\lambda (v2: T).(\lambda (t3: T).(\lambda (t4: 
74 T).(\lambda (t5: T).(\lambda (H0: (iso (THead k v2 t4) t5)).(let H1 \def 
75 (match H0 in iso return (\lambda (t: T).(\lambda (t0: T).(\lambda (_: (iso t 
76 t0)).((eq T t (THead k v2 t4)) \to ((eq T t0 t5) \to (iso (THead k v1 t3) 
77 t5)))))) with [(iso_sort n1 n2) \Rightarrow (\lambda (H0: (eq T (TSort n1) 
78 (THead k v2 t4))).(\lambda (H1: (eq T (TSort n2) t5)).((let H2 \def (eq_ind T 
79 (TSort n1) (\lambda (e: T).(match e in T return (\lambda (_: T).Prop) with 
80 [(TSort _) \Rightarrow True | (TLRef _) \Rightarrow False | (THead _ _ _) 
81 \Rightarrow False])) I (THead k v2 t4) H0) in (False_ind ((eq T (TSort n2) 
82 t5) \to (iso (THead k v1 t3) t5)) H2)) H1))) | (iso_lref i1 i2) \Rightarrow 
83 (\lambda (H0: (eq T (TLRef i1) (THead k v2 t4))).(\lambda (H1: (eq T (TLRef 
84 i2) t5)).((let H2 \def (eq_ind T (TLRef i1) (\lambda (e: T).(match e in T 
85 return (\lambda (_: T).Prop) with [(TSort _) \Rightarrow False | (TLRef _) 
86 \Rightarrow True | (THead _ _ _) \Rightarrow False])) I (THead k v2 t4) H0) 
87 in (False_ind ((eq T (TLRef i2) t5) \to (iso (THead k v1 t3) t5)) H2)) H1))) 
88 | (iso_head k0 v0 v3 t0 t4) \Rightarrow (\lambda (H0: (eq T (THead k0 v0 t0) 
89 (THead k v2 t4))).(\lambda (H1: (eq T (THead k0 v3 t4) t5)).((let H2 \def 
90 (f_equal T T (\lambda (e: T).(match e in T return (\lambda (_: T).T) with 
91 [(TSort _) \Rightarrow t0 | (TLRef _) \Rightarrow t0 | (THead _ _ t) 
92 \Rightarrow t])) (THead k0 v0 t0) (THead k v2 t4) H0) in ((let H3 \def 
93 (f_equal T T (\lambda (e: T).(match e in T return (\lambda (_: T).T) with 
94 [(TSort _) \Rightarrow v0 | (TLRef _) \Rightarrow v0 | (THead _ t _) 
95 \Rightarrow t])) (THead k0 v0 t0) (THead k v2 t4) H0) in ((let H4 \def 
96 (f_equal T K (\lambda (e: T).(match e in T return (\lambda (_: T).K) with 
97 [(TSort _) \Rightarrow k0 | (TLRef _) \Rightarrow k0 | (THead k _ _) 
98 \Rightarrow k])) (THead k0 v0 t0) (THead k v2 t4) H0) in (eq_ind K k (\lambda 
99 (k1: K).((eq T v0 v2) \to ((eq T t0 t4) \to ((eq T (THead k1 v3 t4) t5) \to 
100 (iso (THead k v1 t3) t5))))) (\lambda (H5: (eq T v0 v2)).(eq_ind T v2 
101 (\lambda (_: T).((eq T t0 t4) \to ((eq T (THead k v3 t4) t5) \to (iso (THead 
102 k v1 t3) t5)))) (\lambda (H6: (eq T t0 t4)).(eq_ind T t4 (\lambda (_: T).((eq 
103 T (THead k v3 t4) t5) \to (iso (THead k v1 t3) t5))) (\lambda (H7: (eq T 
104 (THead k v3 t4) t5)).(eq_ind T (THead k v3 t4) (\lambda (t: T).(iso (THead k 
105 v1 t3) t)) (iso_head k v1 v3 t3 t4) t5 H7)) t0 (sym_eq T t0 t4 H6))) v0 
106 (sym_eq T v0 v2 H5))) k0 (sym_eq K k0 k H4))) H3)) H2)) H1)))]) in (H1 
107 (refl_equal T (THead k v2 t4)) (refl_equal T t5)))))))))) t1 t2 H))).