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 (* ********************************************************************** *)
16 (* Progetto FreeScale *)
18 (* Sviluppato da: Cosimo Oliboni, oliboni@cs.unibo.it *)
19 (* Cosimo Oliboni, oliboni@cs.unibo.it *)
21 (* ********************************************************************** *)
23 include "freescale/bool.ma".
29 ninductive ProdT (T1:Type) (T2:Type) : Type ≝
30 pair : T1 → T2 → ProdT T1 T2.
33 : ΠT1,T2:Type.ΠP:ProdT T1 T2 → Prop.
34 (Πt:T1.Πt1:T2.P (pair T1 T2 t t1)) →
36 λT1,T2:Type.λP:ProdT T1 T2 → Prop.
37 λf:Πt:T1.Πt1:T2.P (pair T1 T2 t t1).
39 match p with [ pair t t1 ⇒ f t t1 ].
42 : ΠT1,T2:Type.ΠP:ProdT T1 T2 → Set.
43 (Πt:T1.Πt1:T2.P (pair T1 T2 t t1)) →
45 λT1,T2:Type.λP:ProdT T1 T2 → Set.
46 λf:Πt:T1.Πt1:T2.P (pair T1 T2 t t1).
48 match p with [ pair t t1 ⇒ f t t1 ].
50 ndefinition ProdT_rect
51 : ΠT1,T2:Type.ΠP:ProdT T1 T2 → Type.
52 (Πt:T1.Πt1:T2.P (pair T1 T2 t t1)) →
54 λT1,T2:Type.λP:ProdT T1 T2 → Type.
55 λf:Πt:T1.Πt1:T2.P (pair T1 T2 t t1).
57 match p with [ pair t t1 ⇒ f t t1 ].
60 λT1,T2:Type.λp:ProdT T1 T2.match p with [ pair x _ ⇒ x ].
63 λT1,T2:Type.λp:ProdT T1 T2.match p with [ pair _ x ⇒ x ].
66 λT1,T2:Type.λp1,p2:ProdT T1 T2.
67 λf1:T1 → T1 → bool.λf2:T2 → T2 → bool.
68 match p1 with [ pair x1 y1 ⇒
69 match p2 with [ pair x2 y2 ⇒
70 (f1 x1 x2) ⊗ (f2 y1 y2) ]].
72 ninductive Prod3T (T1:Type) (T2:Type) (T3:Type) : Type ≝
73 triple : T1 → T2 → T3 → Prod3T T1 T2 T3.
75 ndefinition Prod3T_ind
76 : ΠT1,T2,T3:Type.ΠP:Prod3T T1 T2 T3 → Prop.
77 (Πt:T1.Πt1:T2.Πt2:T3.P (triple T1 T2 T3 t t1 t2)) →
78 Πp:Prod3T T1 T2 T3.P p ≝
79 λT1,T2,T3:Type.λP:Prod3T T1 T2 T3 → Prop.
80 λf:Πt:T1.Πt1:T2.Πt2:T3.P (triple T1 T2 T3 t t1 t2).
82 match p with [ triple t t1 t2 ⇒ f t t1 t2 ].
84 ndefinition Prod3T_rec
85 : ΠT1,T2,T3:Type.ΠP:Prod3T T1 T2 T3 → Set.
86 (Πt:T1.Πt1:T2.Πt2:T3.P (triple T1 T2 T3 t t1 t2)) →
87 Πp:Prod3T T1 T2 T3.P p ≝
88 λT1,T2,T3:Type.λP:Prod3T T1 T2 T3 → Set.
89 λf:Πt:T1.Πt1:T2.Πt2:T3.P (triple T1 T2 T3 t t1 t2).
91 match p with [ triple t t1 t2 ⇒ f t t1 t2 ].
93 ndefinition Prod3T_rect
94 : ΠT1,T2,T3:Type.ΠP:Prod3T T1 T2 T3 → Type.
95 (Πt:T1.Πt1:T2.Πt2:T3.P (triple T1 T2 T3 t t1 t2)) →
96 Πp:Prod3T T1 T2 T3.P p ≝
97 λT1,T2,T3:Type.λP:Prod3T T1 T2 T3 → Type.
98 λf:Πt:T1.Πt1:T2.Πt2:T3.P (triple T1 T2 T3 t t1 t2).
100 match p with [ triple t t1 t2 ⇒ f t t1 t2 ].
103 λT1.λT2.λT3.λp:Prod3T T1 T2 T3.match p with [ triple x _ _ ⇒ x ].
106 λT1.λT2.λT3.λp:Prod3T T1 T2 T3.match p with [ triple _ x _ ⇒ x ].
109 λT1.λT2.λT3.λp:Prod3T T1 T2 T3.match p with [ triple _ _ x ⇒ x ].
111 ndefinition eq_triple ≝
112 λT1,T2,T3:Type.λp1,p2:Prod3T T1 T2 T3.
113 λf1:T1 → T1 → bool.λf2:T2 → T2 → bool.λf3:T3 → T3 → bool.
114 match p1 with [ triple x1 y1 z1 ⇒
115 match p2 with [ triple x2 y2 z2 ⇒
116 (f1 x1 x2) ⊗ (f2 y1 y2) ⊗ (f3 z1 z2) ]].
118 ninductive Prod4T (T1:Type) (T2:Type) (T3:Type) (T4:Type) : Type ≝
119 quadruple : T1 → T2 → T3 → T4 → Prod4T T1 T2 T3 T4.
121 ndefinition Prod4T_ind
122 : ΠT1,T2,T3,T4:Type.ΠP:Prod4T T1 T2 T3 T4 → Prop.
123 (Πt:T1.Πt1:T2.Πt2:T3.Πt3:T4.P (quadruple T1 T2 T3 T4 t t1 t2 t3)) →
124 Πp:Prod4T T1 T2 T3 T4.P p ≝
125 λT1,T2,T3,T4:Type.λP:Prod4T T1 T2 T3 T4 → Prop.
126 λf:Πt:T1.Πt1:T2.Πt2:T3.Πt3:T4.P (quadruple T1 T2 T3 T4 t t1 t2 t3).
127 λp:Prod4T T1 T2 T3 T4.
128 match p with [ quadruple t t1 t2 t3 ⇒ f t t1 t2 t3 ].
130 ndefinition Prod4T_rec
131 : ΠT1,T2,T3,T4:Type.ΠP:Prod4T T1 T2 T3 T4 → Set.
132 (Πt:T1.Πt1:T2.Πt2:T3.Πt3:T4.P (quadruple T1 T2 T3 T4 t t1 t2 t3)) →
133 Πp:Prod4T T1 T2 T3 T4.P p ≝
134 λT1,T2,T3,T4:Type.λP:Prod4T T1 T2 T3 T4 → Set.
135 λf:Πt:T1.Πt1:T2.Πt2:T3.Πt3:T4.P (quadruple T1 T2 T3 T4 t t1 t2 t3).
136 λp:Prod4T T1 T2 T3 T4.
137 match p with [ quadruple t t1 t2 t3 ⇒ f t t1 t2 t3 ].
139 ndefinition Prod4T_rect
140 : ΠT1,T2,T3,T4:Type.ΠP:Prod4T T1 T2 T3 T4 → Type.
141 (Πt:T1.Πt1:T2.Πt2:T3.Πt3:T4.P (quadruple T1 T2 T3 T4 t t1 t2 t3)) →
142 Πp:Prod4T T1 T2 T3 T4.P p ≝
143 λT1,T2,T3,T4:Type.λP:Prod4T T1 T2 T3 T4 → Type.
144 λf:Πt:T1.Πt1:T2.Πt2:T3.Πt3:T4.P (quadruple T1 T2 T3 T4 t t1 t2 t3).
145 λp:Prod4T T1 T2 T3 T4.
146 match p with [ quadruple t t1 t2 t3 ⇒ f t t1 t2 t3 ].
149 λT1.λT2.λT3.λT4.λp:Prod4T T1 T2 T3 T4.match p with [ quadruple x _ _ _ ⇒ x ].
152 λT1.λT2.λT3.λT4.λp:Prod4T T1 T2 T3 T4.match p with [ quadruple _ x _ _ ⇒ x ].
155 λT1.λT2.λT3.λT4.λp:Prod4T T1 T2 T3 T4.match p with [ quadruple _ _ x _ ⇒ x ].
158 λT1.λT2.λT3.λT4.λp:Prod4T T1 T2 T3 T4.match p with [ quadruple _ _ _ x ⇒ x ].
160 ndefinition eq_quadruple ≝
161 λT1,T2,T3,T4:Type.λp1,p2:Prod4T T1 T2 T3 T4.
162 λf1:T1 → T1 → bool.λf2:T2 → T2 → bool.λf3:T3 → T3 → bool.λf4:T4 → T4 → bool.
163 match p1 with [ quadruple x1 y1 z1 w1 ⇒
164 match p2 with [ quadruple x2 y2 z2 w2 ⇒
165 (f1 x1 x2) ⊗ (f2 y1 y2) ⊗ (f3 z1 z2) ⊗ (f4 w1 w2) ]].
167 ninductive Prod5T (T1:Type) (T2:Type) (T3:Type) (T4:Type) (T5:Type) : Type ≝
168 quintuple : T1 → T2 → T3 → T4 → T5 → Prod5T T1 T2 T3 T4 T5.
170 ndefinition Prod5T_ind
171 : ΠT1,T2,T3,T4,T5:Type.ΠP:Prod5T T1 T2 T3 T4 T5 → Prop.
172 (Πt:T1.Πt1:T2.Πt2:T3.Πt3:T4.Πt4:T5.P (quintuple T1 T2 T3 T4 T5 t t1 t2 t3 t4)) →
173 Πp:Prod5T T1 T2 T3 T4 T5.P p ≝
174 λT1,T2,T3,T4,T5:Type.λP:Prod5T T1 T2 T3 T4 T5 → Prop.
175 λf:Πt:T1.Πt1:T2.Πt2:T3.Πt3:T4.Πt4:T5.P (quintuple T1 T2 T3 T4 T5 t t1 t2 t3 t4).
176 λp:Prod5T T1 T2 T3 T4 T5.
177 match p with [ quintuple t t1 t2 t3 t4 ⇒ f t t1 t2 t3 t4 ].
179 ndefinition Prod5T_rec
180 : ΠT1,T2,T3,T4,T5:Type.ΠP:Prod5T T1 T2 T3 T4 T5 → Set.
181 (Πt:T1.Πt1:T2.Πt2:T3.Πt3:T4.Πt4:T5.P (quintuple T1 T2 T3 T4 T5 t t1 t2 t3 t4)) →
182 Πp:Prod5T T1 T2 T3 T4 T5.P p ≝
183 λT1,T2,T3,T4,T5:Type.λP:Prod5T T1 T2 T3 T4 T5 → Set.
184 λf:Πt:T1.Πt1:T2.Πt2:T3.Πt3:T4.Πt4:T5.P (quintuple T1 T2 T3 T4 T5 t t1 t2 t3 t4).
185 λp:Prod5T T1 T2 T3 T4 T5.
186 match p with [ quintuple t t1 t2 t3 t4 ⇒ f t t1 t2 t3 t4 ].
188 ndefinition Prod5T_rect
189 : ΠT1,T2,T3,T4,T5:Type.ΠP:Prod5T T1 T2 T3 T4 T5 → Type.
190 (Πt:T1.Πt1:T2.Πt2:T3.Πt3:T4.Πt4:T5.P (quintuple T1 T2 T3 T4 T5 t t1 t2 t3 t4)) →
191 Πp:Prod5T T1 T2 T3 T4 T5.P p ≝
192 λT1,T2,T3,T4,T5:Type.λP:Prod5T T1 T2 T3 T4 T5 → Type.
193 λf:Πt:T1.Πt1:T2.Πt2:T3.Πt3:T4.Πt4:T5.P (quintuple T1 T2 T3 T4 T5 t t1 t2 t3 t4).
194 λp:Prod5T T1 T2 T3 T4 T5.
195 match p with [ quintuple t t1 t2 t3 t4 ⇒ f t t1 t2 t3 t4 ].
198 λT1.λT2.λT3.λT4.λT5.λp:Prod5T T1 T2 T3 T4 T5.match p with [ quintuple x _ _ _ _ ⇒ x ].
201 λT1.λT2.λT3.λT4.λT5.λp:Prod5T T1 T2 T3 T4 T5.match p with [ quintuple _ x _ _ _ ⇒ x ].
204 λT1.λT2.λT3.λT4.λT5.λp:Prod5T T1 T2 T3 T4 T5.match p with [ quintuple _ _ x _ _ ⇒ x ].
207 λT1.λT2.λT3.λT4.λT5.λp:Prod5T T1 T2 T3 T4 T5.match p with [ quintuple _ _ _ x _ ⇒ x ].
210 λT1.λT2.λT3.λT4.λT5.λp:Prod5T T1 T2 T3 T4 T5.match p with [ quintuple _ _ _ _ x ⇒ x ].
212 ndefinition eq_quintuple ≝
213 λT1,T2,T3,T4,T5:Type.λp1,p2:Prod5T T1 T2 T3 T4 T5.
214 λf1:T1 → T1 → bool.λf2:T2 → T2 → bool.λf3:T3 → T3 → bool.λf4:T4 → T4 → bool.λf5:T5 → T5 → bool.
215 match p1 with [ quintuple x1 y1 z1 w1 v1 ⇒
216 match p2 with [ quintuple x2 y2 z2 w2 v2 ⇒
217 (f1 x1 x2) ⊗ (f2 y1 y2) ⊗ (f3 z1 z2) ⊗ (f4 w1 w2) ⊗ (f5 v1 v2) ]].