]> matita.cs.unibo.it Git - helm.git/blob - helm/software/matita/nlibrary/topology/igft.ma
270fbb9cdefe0345916d8855c4e38a9413362347
[helm.git] / helm / software / matita / nlibrary / topology / igft.ma
1 (*D
2
3 Matita Tutorial: inductively generated formal topologies
4 ======================================================== 
5
6 This is a not so short introduction to [Matita][2], based on
7 the formalization of the paper
8
9 > Between formal topology and game theory: an
10 > explicit solution for the conditions for an
11 > inductive generation of formal topologies
12
13 by Stefano Berardi and Silvio Valentini. 
14
15 The tutorial is by Enrico Tassi. 
16
17 The tutorial spends a considerable amount of effort in defining 
18 notations that resemble the ones used in the original paper. We believe
19 this is a important part of every formalization, not only from the aesthetic 
20 point of view, but also from the practical point of view. Being 
21 consistent allows to follow the paper in a pedantic way, and hopefully
22 to make the formalization (at least the definitions and proved
23 statements) readable to the author of the paper. 
24
25 The formalization uses the ng (new generation) version of Matita
26 (that will be named 1.x when finally released). 
27 Last stable release of the "old" system is named 0.5.7; the ng system
28 is coexisting with the old one in every development release 
29 (named "nightly builds" in the download page of Matita) 
30 with a version strictly greater than 0.5.7.
31
32 Orienteering
33 ------------
34
35 The graphical interface of Matita is composed of three windows:
36 the script window, on the left, is where you type; the sequent
37 window on the top right is where the system shows you the ongoing proof;
38 the error window, on the bottom right, is where the system complains.
39 On the top of the script window five buttons drive the processing of
40 the proof script. From left to right they request the system to:
41
42 - go back to the beginning of the script
43 - go back one step
44 - go to the current cursor position
45 - advance one step
46 - advance to the end of the script
47
48 When the system processes a command, it locks the part of the script
49 corresponding to the command, such that you cannot edit it anymore 
50 (without going back). Locked parts are coloured in blue.
51
52 The sequent window is hyper textual, i.e. you can click on symbols
53 to jump to their definition, or switch between different notations
54 for the same expression (for example, equality has two notations,
55 one of them makes the type of the arguments explicit).  
56
57 Everywhere in the script you can use the `ncheck (term).` command to
58 ask for the type a given term. If you do that in the middle of a proof,
59 the term is assumed to live in the current proof context (i.e. can use
60 variables introduced so far).
61
62 To ease the typing of mathematical symbols, the script window
63 implements two unusual input facilities:
64
65 - some TeX symbols can be typed using their TeX names, and are 
66   automatically converted to UTF-8 characters. For a list of 
67   the supported TeX names, see the menu: View ▹ TeX/UTF-8 Table.
68   Moreover some ASCII-art is understood as well, like `=>` and `->`
69   to mean double or single arrows.
70   Here we recall some of these "shortcuts":
71
72   - ∀ can be typed with `\forall`
73   - λ can be typed with `\lambda`
74   - ≝ can be typed with `\def` or `:=`
75   - → can be typed with `\to` or `->`
76   
77 - some symbols have variants, like the ≤ relation and ≼, ≰, ⋠.
78   The user can cycle between variants typing one of them and then
79   pressing ALT-L. Note that also letters do have variants, for
80   example W has Ω, 𝕎 and 𝐖, L has Λ, 𝕃, and 𝐋, F has Φ, … 
81   Variants are listed in the aforementioned TeX/UTF-8 table. 
82
83 The syntax of terms (and types) is the one of the λ-calculus CIC
84 on which Matita is based. The main syntactical difference w.r.t. 
85 the usual mathematical notation is the function application, written
86 `(f x y)` in place of `f(x,y)`. 
87
88 Pressing `F1` opens the Matita manual.
89
90 CIC (as [implemented in Matita][3]) in a nutshell
91 ------------------------------------------------- 
92
93 CIC is a full and functional Pure Type System (all products do exist,
94 and their sort is is determined by the target) with an impredicative sort
95 Prop and a predicative sort Type. It features both dependent types and 
96 polymorphism like the [Calculus of Constructions][4]. Proofs and terms share
97 the same syntax, and they can occur in types. 
98
99 The environment used for in the typing judgement can be populated with
100 well typed definitions or theorems, (co)inductive types validating positivity
101 conditions and recursive functions provably total by simple syntactical 
102 analysis (recursive calls are allowed only on structurally smaller subterms). 
103 Co-recursive 
104 functions can be defined as well, and must satisfy the dual condition, i.e.
105 performing the recursive call only after having generated a constructor (a piece
106 of output).
107
108 The CIC λ-calculus is equipped with a pattern matching construct (match) on inductive
109 types defined in the environment. This construct, together with the possibility to
110 definable total recursive functions, allows to define eliminators (or constructors)
111 for (co)inductive types. The λ-calculus is also equipped with explicitly typed 
112 local definitions (let in) that in the degenerate case work as casts (i.e.
113 the type annotation `(t : T)`  is implemented as `let x : T ≝ t in x`). 
114
115 Types are compare up to conversion. Since types may depend on terms, conversion
116 involves β-reduction, δ-reduction (definition unfolding), ζ-reduction (local
117 definition unfolding), ι-reduction (pattern matching simplification),
118 μ-reduction (recursive function computation) and ν-reduction (co-fixpoint
119 computation).
120
121 Since we are going to formalize constructive and predicative mathematics
122 in an intensional type theory like CIC, we try to establish some terminology. 
123 Type is the sort of sets equipped with the `Id` equality (i.e. an intensional,
124 not quotiented set). We will avoid using `Id` (Leibniz equality), 
125 thus we will explicitly equip a set with an equivalence relation when needed.
126 We will call this structure a _setoid_. Note that we will
127 attach the infix `=` symbol only to the equality of a setoid,
128 not to Id.
129
130 We write `Type[i]` to mention a Type in the predicative hierarchy 
131 of types. To ease the comprehension we will use `Type[0]` for sets, 
132 and `Type[1]` for classes. The index `i` is just a label: constraints among
133 universes are declared by the user. The standard library defines
134
135 > Type[0] < Type[1] < Type[2]
136
137 For every `Type[i]` there is a corresponding level of predicative
138 propositions `CProp[i]`. A predicative proposition cannot be eliminated toward
139 `Type[j]` unless it holds no computational content (i.e. it is an inductive type
140 with 0 or 1 constructors with propositional arguments, like `Id` and `And` 
141 but not like `Or`). 
142
143
144 The standard library and the `include` command
145 ----------------------------------------------
146
147 Some basic notions, like subset, membership, intersection and union
148 are part of the standard library of Matita.
149
150 These notions come with some standard notation attached to them:
151
152 - A ∪ B can be typed with `A \cup B`
153 - A ∩ B can be typed with `A \cap B` 
154 - A ≬ B can be typed with `A \between B`
155 - x ∈ A can be typed with `x \in A` 
156 - Ω^A, that is the type of the subsets of A, can be typed with `\Omega ^ A` 
157
158 The `include` command tells Matita to load a part of the library, 
159 in particular the part that we will use can be loaded as follows: 
160
161 D*)
162
163 include "sets/sets.ma".
164
165 (*D
166
167 Some basic results that we will use are also part of the sets library:
168
169 - subseteq\_union\_l: ∀A.∀U,V,W:Ω^A.U ⊆ W → V ⊆ W → U ∪ V ⊆ W
170 - subseteq\_intersection\_r: ∀A.∀U,V,W:Ω^A.W ⊆ U → W ⊆ V → W ⊆ U ∩ V
171
172 Defining Axiom set
173 ------------------
174
175 A set of axioms is made of a set(oid) `S`, a family of sets `I` and a 
176 family `C` of subsets of `S` indexed by elements `a` of `S` 
177 and elements of `I(a)`.
178
179 It is desirable to state theorems like "for every set of axioms, …"
180 without explicitly mentioning S, I and C. To do that, the three 
181 components have to be grouped into a record (essentially a dependently
182 typed tuple). The system is able to generate the projections
183 of the record automatically, and they are named as the fields of
184 the record. So, given an axiom set `A` we can obtain the set
185 with `S A`, the family of sets with `I A` and the family of subsets
186 with `C A`.
187
188 D*)
189
190 nrecord Ax : Type[1] ≝ { 
191   S :> setoid;
192   I :  S → Type[0];
193   C :  ∀a:S. I a → Ω ^ S
194 }.
195
196 (*D
197
198 Forget for a moment the `:>` that will be detailed later, and focus on
199 the record definition. It is made of a list of pairs: a name, followed
200 by `:` and the its type. It is a dependently typed tuple, thus
201 already defined names (fields) can be used in the types that follow. 
202
203 Note that `S` is declared to be a `setoid` and not a Type. The original
204 paper probably also considers I to generate setoids, and both I and C
205 to be (dependent) morphisms. For the sake of simplicity, we will "cheat" and use
206 setoids only when strictly needed (i.e. where we want to talk about 
207 equality). Setoids will play a role only when we will define
208 the alternative version of the axiom set.
209
210 Note that the field `S` was declared with `:>` instead of a simple `:`.
211 This declares the `S` projection to be a coercion. A coercion is 
212 a "cast" function the system automatically inserts when it is needed.
213 In that case, the projection `S` has type `Ax → setoid`, and whenever
214 the expected type of a term is `setoid` while its type is `Ax`, the 
215 system inserts the coercion around it, to make the whole term well typed.
216
217 When formalizing an algebraic structure, declaring the carrier as a 
218 coercion is a common practice, since it allows to write statements like
219
220     ∀G:Group.∀x:G.x * x^-1 = 1 
221
222 The quantification over `x` of type `G` is ill-typed, since `G` is a term
223 (of type `Group`) and thus not a type. Since the carrier projection 
224 `carr` is a coercion, that maps a `Group` into the type of 
225 its elements, the system automatically inserts `carr` around `G`, 
226 obtaining `…∀x: carr G.…`. 
227
228 Coercions are hidden by the system when it displays a term.
229 In this particular case, the coercion `S` allows to write (and read):
230
231     ∀A:Ax.∀a:A.…
232
233 Since `A` is not a type, but it can be turned into a `setoid` by `S`
234 and a `setoid` can be turned into a type by its `carr` projection, the 
235 composed coercion `carr ∘ S` is silently inserted.
236
237 Implicit arguments
238 ------------------
239
240 Something that is not still satisfactory, is that the dependent type
241 of `I` and `C` are abstracted over the Axiom set. To obtain the
242 precise type of a term, you can use the `ncheck` command as follows.
243
244 D*) 
245
246 (** ncheck I. *) (* shows: ∀A:Ax.A → Type[0] *)
247 (** ncheck C. *) (* shows: ∀A:Ax.∀a:A.A → I A a → Ω^A *)
248
249 (*D
250
251 One would like to write `I a` and not `I A a` under a context where
252 `A` is an axiom set and `a` has type `S A` (or thanks to the coercion
253 mechanism simply `A`). In Matita, a question mark represents an implicit
254 argument, i.e. a missing piece of information the system is asked to
255 infer. Matita performs Hindley-Milner-style type inference, thus writing
256 `I ? a` is enough: since the second argument of `I` is typed by the 
257 first one, the first (omitted) argument can be inferred just 
258 computing the type of `a` (that is `A`).
259
260 D*) 
261
262 (** ncheck (∀A:Ax.∀a:A.I ? a). *) (* shows: ∀A:Ax.∀a:A.I A a *)
263
264 (*D
265
266 This is still not completely satisfactory, since you have always to type 
267 `?`; to fix this minor issue we have to introduce the notational
268 support built in Matita.
269
270 Notation for I and C
271 --------------------
272
273 Matita is quipped with a quite complex notational support,
274 allowing the user to define and use mathematical notations 
275 ([From Notation to Semantics: There and Back Again][1]). 
276
277 Since notations are usually ambiguous (e.g. the frequent overloading of 
278 symbols) Matita distinguishes between the term level, the 
279 content level, and the presentation level, allowing multiple 
280 mappings between the content and the term level. 
281
282 The mapping between the presentation level (i.e. what is typed on the 
283 keyboard and what is displayed in the sequent window) and the content
284 level is defined with the `notation` command. When followed by
285 `>`, it defines an input (only) notation.   
286
287 D*)
288
289 notation > "𝐈 term 90 a" non associative with precedence 70 for @{ 'I $a }.
290 notation > "𝐂 term 90 a term 90 i" non associative with precedence 70 for @{ 'C $a $i }.
291
292 (*D
293
294 The first notation defines the writing `𝐈 a` where `a` is a generic
295 term of precedence 90, the maximum one. This high precedence forces
296 parentheses around any term of a lower precedence. For example `𝐈 x`
297 would be accepted, since identifiers have precedence 90, but
298 `𝐈 f x` would be interpreted as `(𝐈 f) x`. In the latter case, parentheses
299 have to be put around `f x`, thus the accepted writing would be `𝐈 (f x)`.
300
301 To obtain the `𝐈` is enough to type `I` and then cycle between its
302 similar symbols with ALT-L. The same for `𝐂`. Notations cannot use
303 regular letters or the round parentheses, thus their variants (like the 
304 bold ones) have to be used.
305
306 The first notation associates `𝐈 a` with `'I $a` where `'I` is a 
307 new content element to which a term `$a` is passed.
308
309 Content elements have to be interpreted, and possibly multiple, 
310 incompatible, interpretations can be defined.
311
312 D*)
313
314 interpretation "I" 'I a = (I ? a).
315 interpretation "C" 'C a i = (C ? a i).
316
317 (*D
318
319 The `interpretation` command allows to define the mapping between
320 the content level and the terms level. Here we associate the `I` and
321 `C` projections of the Axiom set record, where the Axiom set is an implicit 
322 argument `?` to be inferred by the system.
323
324 Interpretation are bi-directional, thus when displaying a term like 
325 `C _ a i`, the system looks for a presentation for the content element
326 `'C a i`. 
327
328 D*)
329
330 notation < "𝐈  \sub( ❨a❩ )" non associative with precedence 70 for @{ 'I $a }.
331 notation < "𝐂 \sub( ❨a,\emsp i❩ )" non associative with precedence 70 for @{ 'C $a $i }.
332
333 (*D
334
335 For output purposes we can define more complex notations, for example
336 we can put bold parentheses around the arguments of `𝐈` and `𝐂`, decreasing
337 the size of the arguments and lowering their baseline (i.e. putting them
338 as subscript), separating them with a comma followed by a little space.
339
340 The first (technical) definition
341 --------------------------------
342
343 Before defining the cover relation as an inductive predicate, one
344 has to notice that the infinity rule uses, in its hypotheses, the 
345 cover relation between two subsets, while the inductive predicate 
346 we are going to define relates an element and a subset.
347
348 An option would be to unfold the definition of cover between subsets,
349 but we prefer to define the abstract notion of cover between subsets
350 (so that we can attach a (ambiguous) notation to it).
351
352 Anyway, to ease the understanding of the definition of the cover relation 
353 between subsets, we first define the inductive predicate unfolding the 
354 definition, and we later refine it with.
355
356 D*)
357
358 ninductive xcover (A : Ax) (U : Ω^A) : A → CProp[0] ≝ 
359 | xcreflexivity : ∀a:A. a ∈ U → xcover A U a
360 | xcinfinity    : ∀a:A.∀i:𝐈 a. (∀y.y ∈ 𝐂 a i → xcover A U y) → xcover A U a.
361
362 (*D
363
364 We defined the xcover (x will be removed in the final version of the 
365 definition) as an inductive predicate. The arity of the inductive
366 predicate has to be carefully analyzed:
367
368 >  (A : Ax) (U : Ω^A) : A → CProp[0]
369
370 The syntax separates with `:` abstractions that are fixed for every
371 constructor (introduction rule) and abstractions that can change. In that 
372 case the parameter `U` is abstracted once and for all in front of every 
373 constructor, and every occurrence of the inductive predicate is applied to
374 `U` in a consistent way. Arguments abstracted on the right of `:` are not
375 constant, for example the xcinfinity constructor introduces `a ◃ U`,
376 but under the assumption that (for every y) `y ◃ U`. In that rule, the left
377 had side of the predicate changes, thus it has to be abstracted (in the arity
378 of the inductive predicate) on the right of `:`.
379
380 D*)
381
382 (** ncheck xcreflexivity. *) (* shows: ∀A:Ax.∀U:Ω^A.∀a:A.a∈U → xcover A U a *)
383
384 (*D
385
386 We want now to abstract out `(∀y.y ∈ 𝐂 a i → xcover A U y)` and define
387 a notion `cover_set` to which a notation `𝐂 a i ◃ U` can be attached.
388
389 This notion has to be abstracted over the cover relation (whose
390 type is the arity of the inductive `xcover` predicate just defined).
391
392 Then it has to be abstracted over the arguments of that cover relation,
393 i.e. the axiom set and the set `U`, and the subset (in that case `𝐂 a i`)
394 sitting on the left hand side of `◃`. 
395
396 D*)
397
398 ndefinition cover_set : 
399   ∀cover: ∀A:Ax.Ω^A → A → CProp[0]. ∀A:Ax.∀C,U:Ω^A. CProp[0] 
400 ≝ 
401   λcover.                           λA,    C,U.     ∀y.y ∈ C → cover A U y.
402
403 (*D
404
405 The `ndefinition` command takes a name, a type and body (of that type).
406 The type can be omitted, and in that case it is inferred by the system.
407 If the type is given, the system uses it to infer implicit arguments
408 of the body. In that case all types are left implicit in the body.
409
410 We now define the notation `a ◃ b`. Here the keywork `hvbox`
411 and `break` tell the system how to wrap text when it does not
412 fit the screen (they can be safely ignored for the scope of
413 this tutorial). We also add an interpretation for that notation, 
414 where the (abstracted) cover relation is implicit. The system
415 will not be able to infer it from the other arguments `C` and `U`
416 and will thus prompt the user for it. This is also why we named this 
417 interpretation `covers set temp`: we will later define another 
418 interpretation in which the cover relation is the one we are going to 
419 define.
420
421 D*)
422
423 notation "hvbox(a break ◃ b)" non associative with precedence 45
424 for @{ 'covers $a $b }.
425
426 interpretation "covers set temp" 'covers C U = (cover_set ?? C U).
427
428 (*D
429
430 The cover relation
431 ------------------
432
433 We can now define the cover relation using the `◃` notation for 
434 the premise of infinity. 
435
436 D*)
437
438 ninductive cover (A : Ax) (U : Ω^A) : A → CProp[0] ≝ 
439 | creflexivity : ∀a. a ∈ U → cover ? U a
440 | cinfinity    : ∀a. ∀i. 𝐂 a i ◃ U → cover ? U a.
441 (** screenshot "cover". *) 
442 napply cover;
443 nqed.
444
445 (*D
446
447 Note that the system accepts the definition
448 but prompts the user for the relation the `cover_set` notion is
449 abstracted on.
450
451
452
453 The horizontal line separates the hypotheses from the conclusion.
454 The `napply cover` command tells the system that the relation
455 it is looking for is exactly our first context entry (i.e. the inductive
456 predicate we are defining, up to α-conversion); while the `nqed` command
457 ends a definition or proof.
458
459 We can now define the interpretation for the cover relation between an
460 element and a subset first, then between two subsets (but this time
461 we fix the relation `cover_set` is abstracted on).
462
463 D*)
464
465 interpretation "covers" 'covers a U = (cover ? U a).
466 interpretation "covers set" 'covers a U = (cover_set cover ? a U).
467
468 (*D
469
470 We will proceed similarly for the fish relation, but before going
471 on it is better to give a short introduction to the proof mode of Matita.
472 We define again the `cover_set` term, but this time we build
473 its body interactively. In the λ-calculus Matita is based on, CIC, proofs
474 and terms share the same syntax, and it is thus possible to use the
475 commands devoted to build proof term also to build regular definitions.
476 A tentative semantics for the proof mode commands (called tactics)
477 in terms of sequent calculus rules are given in the
478 <a href="#appendix">appendix</a>.
479
480 D*)
481
482 ndefinition xcover_set : 
483   ∀c: ∀A:Ax.Ω^A → A → CProp[0]. ∀A:Ax.∀C,U:Ω^A. CProp[0]. 
484                          (** screenshot "xcover-set-1". *)
485 #cover; #A; #C; #U;      (** screenshot "xcover-set-2". *) 
486 napply (∀y:A.y ∈ C → ?); (** screenshot "xcover-set-3". *)
487 napply cover;            (** screenshot "xcover-set-4". *)
488 ##[ napply A;
489 ##| napply U;
490 ##| napply y;
491 ##]
492 nqed.
493
494 (*D[xcover-set-1]
495 The system asks for a proof of the full statement, in an empty context.
496
497 The `#` command is the ∀-introduction rule, it gives a name to an 
498 assumption putting it in the context, and generates a λ-abstraction
499 in the proof term.
500
501 D[xcover-set-2]
502 We have now to provide a proposition, and we exhibit it. We left
503 a part of it implicit; since the system cannot infer it it will
504 ask for it later. 
505 Note that the type of `∀y:A.y ∈ C → ?` is a proposition
506 whenever `?` is a proposition.
507
508 D[xcover-set-3]
509 The proposition we want to provide is an application of the
510 cover relation we have abstracted in the context. The command
511 `napply`, if the given term has not the expected type (in that
512 case it is a product versus a proposition) it applies it to as many 
513 implicit arguments as necessary (in that case `? ? ?`).
514
515 D[xcover-set-4]
516 The system will now ask in turn the three implicit arguments 
517 passed to cover. The syntax `##[` allows to start a branching
518 to tackle every sub proof individually, otherwise every command
519 is applied to every subproof. The command `##|` switches to the next
520 subproof and `##]` ends the branching.  
521 D*)
522
523 (*D
524
525 The fish relation
526 -----------------
527
528 The definition of fish works exactly the same way as for cover, except 
529 that it is defined as a coinductive proposition.
530 D*)
531
532 ndefinition fish_set ≝ λf:∀A:Ax.Ω^A → A → CProp[0].
533  λA,U,V.
534   ∃a.a ∈ V ∧ f A U a.
535
536 (* a \ltimes b *)
537 notation "hvbox(a break ⋉ b)" non associative with precedence 45
538 for @{ 'fish $a $b }. 
539
540 interpretation "fish set temp" 'fish A U = (fish_set ?? U A).
541
542 ncoinductive fish (A : Ax) (F : Ω^A) : A → CProp[0] ≝ 
543 | cfish : ∀a. a ∈ F → (∀i:𝐈 a .𝐂  a i ⋉ F) → fish A F a.
544 napply fish;
545 nqed.
546
547 interpretation "fish set" 'fish A U = (fish_set fish ? U A).
548 interpretation "fish" 'fish a U = (fish ? U a).
549
550 (*D
551
552 Introduction rule for fish
553 ---------------------------
554
555 Matita is able to generate elimination rules for inductive types,
556 but not introduction rules for the coinductive case. 
557
558 D*)
559
560 (** ncheck cover_rect_CProp0. *) 
561
562 (*D
563
564 We thus have to define the introduction rule for fish by co-recursion.
565 Here we again use the proof mode of Matita to exhibit the body of the
566 corecursive function.
567
568 D*)
569
570 nlet corec fish_rec (A:Ax) (U: Ω^A)
571  (P: Ω^A) (H1: P ⊆ U)
572   (H2: ∀a:A. a ∈ P → ∀j: 𝐈 a. 𝐂 a j ≬ P): ∀a:A. ∀p: a ∈ P. a ⋉ U ≝ ?.
573                                        (** screenshot "def-fish-rec-1".   *)
574 #a; #p; napply cfish;                  (** screenshot "def-fish-rec-2".   *)
575 ##[ nchange in H1 with (∀b.b∈P → b∈U); (** screenshot "def-fish-rec-2-1". *) 
576     napply H1;                         (** screenshot "def-fish-rec-3".   *) 
577     nassumption;
578 ##| #i; ncases (H2 a p i);             (** screenshot "def-fish-rec-5".   *) 
579     #x; *; #xC; #xP;                   (** screenshot "def-fish-rec-5-1". *) 
580     @;                                 (** screenshot "def-fish-rec-6".   *)
581     ##[ napply x
582     ##| @;                             (** screenshot "def-fish-rec-7".   *)
583         ##[ napply xC; 
584         ##| napply (fish_rec ? U P);   (** screenshot "def-fish-rec-9".   *)
585             nassumption;
586         ##]
587     ##]
588 ##]
589 nqed.
590
591 (*D
592 D[def-fish-rec-1]
593 Note the first item of the context, it is the corecursive function we are 
594 defining. This item allows to perform the recursive call, but we will be
595 allowed to do such call only after having generated a constructor of
596 the fish coinductive type.
597
598 We introduce `a` and `p`, and then return the fish constructor `cfish`.
599 Since the constructor accepts two arguments, the system asks for them.
600
601 D[def-fish-rec-2]
602 The first one is a proof that `a ∈ U`. This can be proved using `H1` and `p`.
603 With the `nchange` tactic we change `H1` into an equivalent form (this step
604 can be skipped, since the system would be able to unfold the definition
605 of inclusion by itself)
606
607 D[def-fish-rec-2-1]
608 It is now clear that `H1` can be applied. Again `napply` adds two 
609 implicit arguments to `H1 ? ?`, obtaining a proof of `? ∈ U` given a proof
610 that `? ∈ P`. Thanks to unification, the system understands that `?` is actually
611 `a`, and it asks a proof that `a ∈ P`.
612
613 D[def-fish-rec-3]
614 The `nassumption` tactic looks for the required proof in the context, and in
615 that cases finds it in the last context position. 
616
617 We move now to the second branch of the proof, corresponding to the second
618 argument of the `cfish` constructor.
619
620 We introduce `i` and then we destruct `H2 a p i`, that being a proof
621 of an overlap predicate, give as an element and a proof that it is 
622 both in `𝐂 a i` and `P`.
623
624 D[def-fish-rec-5]
625 We then introduce `x`, break the conjunction (the `*;` command is the
626 equivalent of `ncases` but operates on the first hypothesis that can
627 be introduced). We then introduce the two sides of the conjunction.
628
629 D[def-fish-rec-5-1]
630 The goal is now the existence of a point in `𝐂 a i` fished by `U`.
631 We thus need to use the introduction rule for the existential quantifier.
632 In CIC it is a defined notion, that is an inductive type with just
633 one constructor (one introduction rule) holding the witness and the proof
634 that the witness satisfies a proposition.
635
636 > ncheck Ex.
637
638 Instead of trying to remember the name of the constructor, that should
639 be used as the argument of `napply`, we can ask the system to find by
640 itself the constructor name and apply it with the `@` tactic. 
641 Note that some inductive predicates, like the disjunction, have multiple
642 introduction rules, and thus `@` can be followed by a number identifying
643 the constructor.
644
645 D[def-fish-rec-6]
646 After choosing `x` as the witness, we have to prove a conjunction,
647 and we again apply the introduction rule for the inductively defined
648 predicate `∧`.
649
650 D[def-fish-rec-7]
651 The left hand side of the conjunction is trivial to prove, since it 
652 is already in the context. The right hand side needs to perform
653 the co-recursive call.
654
655 D[def-fish-rec-9]
656 The co-recursive call needs some arguments, but all of them are
657 in the context. Instead of explicitly mention them, we use the
658 `nassumption` tactic, that simply tries to apply every context item.
659
660 D*)
661
662 (*D
663
664 Subset of covered/fished points
665 -------------------------------
666
667 We now have to define the subset of `S` of points covered by `U`.
668 We also define a prefix notation for it. Remember that the precedence
669 of the prefix form of a symbol has to be higher than the precedence 
670 of its infix form.
671
672 D*)
673
674 ndefinition coverage : ∀A:Ax.∀U:Ω^A.Ω^A ≝ λA,U.{ a | a ◃ U }.
675
676 notation "◃U" non associative with precedence 55 for @{ 'coverage $U }.
677
678 interpretation "coverage cover" 'coverage U = (coverage ? U).
679
680 (*D
681
682 Here we define the equation characterizing the cover relation. 
683 Even if it is not part of the paper, we proved that `◃(U)` is 
684 the minimum solution for
685 such equation, the interested reader should be able to reply the proof
686 with Matita.
687
688 D*)
689
690 ndefinition cover_equation : ∀A:Ax.∀U,X:Ω^A.CProp[0] ≝  λA,U,X. 
691   ∀a.a ∈ X ↔ (a ∈ U ∨ ∃i:𝐈 a.∀y.y ∈ 𝐂 a i → y ∈ X).  
692
693 ntheorem coverage_cover_equation : ∀A,U. cover_equation A U (◃U).
694 #A; #U; #a; @; #H;
695 ##[ nelim H; #b; 
696     ##[ #bU; @1; nassumption;
697     ##| #i; #CaiU; #IH; @2; @ i; #c; #cCbi; ncases (IH ? cCbi);
698         ##[ #E; @; napply E;
699         ##| #_; napply CaiU; nassumption; ##] ##]
700 ##| ncases H; ##[ #E; @; nassumption]
701     *; #j; #Hj; @2 j; #w; #wC; napply Hj; nassumption;
702 ##]
703 nqed. 
704
705 ntheorem coverage_min_cover_equation : 
706   ∀A,U,W. cover_equation A U W → ◃U ⊆ W.
707 #A; #U; #W; #H; #a; #aU; nelim aU; #b;
708 ##[ #bU; ncases (H b); #_; #H1; napply H1; @1; nassumption;
709 ##| #i; #CbiU; #IH; ncases (H b); #_; #H1; napply H1; @2; @i; napply IH;
710 ##]
711 nqed.
712
713 (*D
714
715 We similarly define the subset of points "fished" by `F`, the 
716 equation characterizing `⋉(F)` and prove that fish is
717 the biggest solution for such equation.
718
719 D*) 
720
721 notation "⋉F" non associative with precedence 55
722 for @{ 'fished $F }.
723
724 ndefinition fished : ∀A:Ax.∀F:Ω^A.Ω^A ≝ λA,F.{ a | a ⋉ F }.
725
726 interpretation "fished fish" 'fished F = (fished ? F).
727
728 ndefinition fish_equation : ∀A:Ax.∀F,X:Ω^A.CProp[0] ≝ λA,F,X.
729   ∀a. a ∈ X ↔ a ∈ F ∧ ∀i:𝐈 a.∃y.y ∈ 𝐂 a i ∧ y ∈ X. 
730   
731 ntheorem fished_fish_equation : ∀A,F. fish_equation A F (⋉F).
732 #A; #F; #a; @; (* *; non genera outtype che lega a *) #H; ncases H;
733 ##[ #b; #bF; #H2; @ bF; #i; ncases (H2 i); #c; *; #cC; #cF; @c; @ cC;
734     napply cF;  
735 ##| #aF; #H1; @ aF; napply H1;
736 ##]
737 nqed.
738
739 ntheorem fished_max_fish_equation : ∀A,F,G. fish_equation A F G → G ⊆ ⋉F.
740 #A; #F; #G; #H; #a; #aG; napply (fish_rec … aG);
741 #b; ncases (H b); #H1; #_; #bG; ncases (H1 bG); #E1; #E2; nassumption; 
742 nqed. 
743
744 (*D
745
746 Part 2, the new set of axioms
747 -----------------------------
748
749 Since the name of defined objects (record included) has to be unique
750 within the same file, we prefix every field name
751 in the new definition of the axiom set with `n`.
752
753 D*)
754
755 nrecord nAx : Type[2] ≝ { 
756   nS:> setoid; 
757   nI: nS → Type[0];
758   nD: ∀a:nS. nI a → Type[0];
759   nd: ∀a:nS. ∀i:nI a. nD a i → nS
760 }.
761
762 (*D
763
764 We again define a notation for the projections, making the 
765 projected record an implicit argument. Note that, since we already have
766 a notation for `𝐈`, we just add another interpretation for it. The
767 system, looking at the argument of `𝐈`, will be able to choose
768 the correct interpretation. 
769
770 D*)
771
772 notation "𝐃 \sub ( ❨a,\emsp i❩ )" non associative with precedence 70 for @{ 'D $a $i }.
773 notation "𝐝 \sub ( ❨a,\emsp i,\emsp j❩ )" non associative with precedence 70 for @{ 'd $a $i $j}.
774
775 notation > "𝐃 term 90 a term 90 i" non associative with precedence 70 for @{ 'D $a $i }.
776 notation > "𝐝 term 90 a term 90 i term 90 j" non associative with precedence 70 for @{ 'd $a $i $j}.
777
778 interpretation "D" 'D a i = (nD ? a i).
779 interpretation "d" 'd a i j = (nd ? a i j).
780 interpretation "new I" 'I a = (nI ? a).
781
782 (*D
783
784 The first result the paper presents to motivate the new formulation
785 of the axiom set is the possibility to define and old axiom set
786 starting from a new one and vice versa. The key definition for
787 such construction is the image of d(a,i).
788 The paper defines the image as
789
790 > Im[d(a,i)] = { d(a,i,j) | j : D(a,i) }
791
792 but this not so formal notation poses some problems. The image is
793 often used as the left hand side of the ⊆ predicate
794
795 > Im[d(a,i)] ⊆ V
796
797 Of course this writing is interpreted by the authors as follows 
798
799 > ∀j:D(a,i). d(a,i,j) ∈ V
800
801 If we need to use the image to define `𝐂 ` (a subset of `S`) we are obliged to
802 form a subset, i.e. to place a single variable `{ here | … }` of type `S`.
803
804 > Im[d(a,i)] = { y | ∃j:D(a,i). y = d(a,i,j) }
805
806 This poses no theoretical problems, since `S` is a setoid and thus equipped
807 with an equality.
808
809 Unless we define two different images, one for stating that the image is ⊆ of
810 something and another one to define `𝐂`, we end up using always the latter.
811 Thus the statement `Im[d(a,i)] ⊆ V` unfolds to
812
813 > ∀x:S. ( ∃j.x = d(a,i,j) ) → x ∈ V
814
815 That, up to rewriting with the equation defining `x`, is what we mean. 
816 The technical problem arises later, when `V` will be a complex 
817 construction that has to be proved extensional 
818 (i.e. ∀x,y. x = y → x ∈ V → y ∈ V).
819
820 D*)
821
822 ndefinition image ≝ λA:nAx.λa:A.λi. { x | ∃j:𝐃 a i. x = 𝐝 a i j }.
823
824 notation > "𝐈𝐦  [𝐝 term 90 a term 90 i]" non associative with precedence 70 for @{ 'Im $a $i }.
825 notation < "𝐈𝐦  [𝐝 \sub ( ❨a,\emsp i❩ )]" non associative with precedence 70 for @{ 'Im $a $i }.
826
827 interpretation "image" 'Im a i = (image ? a i).
828
829 (*D
830
831 Thanks to our definition of image, we can define a function mapping a
832 new axiom set to an old one and vice versa. Note that in the second
833 definition, when we give the `𝐝` component, the projection of the 
834 Σ-type is inlined (constructed on the fly by `*;`) 
835 while in the paper it was named `fst`.
836
837 D*)
838
839 ndefinition Ax_of_nAx : nAx → Ax.
840 #A; @ A (nI ?); #a; #i; napply (𝐈𝐦 [𝐝 a i]);
841 nqed.
842
843 ndefinition nAx_of_Ax : Ax → nAx.
844 #A; @ A (I ?);
845 ##[ #a; #i; napply (Σx:A.x ∈ 𝐂 a i);
846 ##| #a; #i; *; #x; #_; napply x;
847 ##]
848 nqed.
849
850 (*D
851
852 We then define the inductive type of ordinals, parametrized over an axiom
853 set. We also attach some notations to the constructors.
854
855 D*)
856
857 ninductive Ord (A : nAx) : Type[0] ≝ 
858  | oO : Ord A
859  | oS : Ord A → Ord A
860  | oL : ∀a:A.∀i.∀f:𝐃 a i → Ord A. Ord A.
861
862 notation "0" non associative with precedence 90 for @{ 'oO }.
863 notation "x+1" non associative with precedence 50 for @{'oS $x }.
864 notation "Λ term 90 f" non associative with precedence 50 for @{ 'oL $f }.
865
866 interpretation "ordinals Zero" 'oO = (oO ?).
867 interpretation "ordinals Succ" 'oS x = (oS ? x).
868 interpretation "ordinals Lambda" 'oL f = (oL ? ? ? f).
869
870 (*D
871
872 The definition of `U⎽x` is by recursion over the ordinal `x`. 
873 We thus define a recursive function using the `nlet rec` command. 
874 The `on x` directive tells
875 the system on which argument the function is (structurally) recursive.
876
877 In the `oS` case we use a local definition to name the recursive call
878 since it is used twice.
879
880 Note that Matita does not support notation in the left hand side
881 of a pattern match, and thus the names of the constructors have to 
882 be spelled out verbatim.
883
884 D*)
885
886 nlet rec famU (A : nAx) (U : Ω^A) (x : Ord A) on x : Ω^A ≝ 
887   match x with
888   [ oO ⇒ U
889   | oS y ⇒ let U_n ≝ famU A U y in U_n ∪ { x | ∃i.𝐈𝐦[𝐝 x i] ⊆ U_n} 
890   | oL a i f ⇒ { x | ∃j.x ∈ famU A U (f j) } ].
891   
892 notation < "term 90 U \sub (term 90 x)" non associative with precedence 50 for @{ 'famU $U $x }.
893 notation > "U ⎽ term 90 x" non associative with precedence 50 for @{ 'famU $U $x }.
894
895 interpretation "famU" 'famU U x = (famU ? U x).
896
897 (*D
898
899 We attach as the input notation for U_x the similar `U⎽x` where underscore,
900 that is a character valid for identifier names, has been replaced by `⎽` that is
901 not. The symbol `⎽` can act as a separator, and can be typed as an alternative
902 for `_` (i.e. pressing ALT-L after `_`). 
903
904 The notion ◃(U) has to be defined as the subset of elements `y`  
905 belonging to `U⎽x` for some `x`. Moreover, we have to define the notion
906 of cover between sets again, since the one defined at the beginning
907 of the tutorial works only for the old axiom set.
908
909 D*)
910   
911 ndefinition ord_coverage : ∀A:nAx.∀U:Ω^A.Ω^A ≝ λA,U.{ y | ∃x:Ord A. y ∈ famU ? U x }.
912
913 ndefinition ord_cover_set ≝ λc:∀A:nAx.Ω^A → Ω^A.λA,C,U.
914   ∀y.y ∈ C → y ∈ c A U.
915
916 interpretation "coverage new cover" 'coverage U = (ord_coverage ? U).
917 interpretation "new covers set" 'covers a U = (ord_cover_set ord_coverage ? a U).
918 interpretation "new covers" 'covers a U = (mem ? (ord_coverage ? U) a).
919
920 (*D
921
922 Before proving that this cover relation validates the reflexivity and infinity
923 rules, we prove this little technical lemma that is used in the proof for the 
924 infinity rule.
925
926 D*)
927
928 nlemma ord_subset: ∀A:nAx.∀a:A.∀i,f,U.∀j:𝐃 a i. U⎽(f j) ⊆ U⎽(Λ f).
929 #A; #a; #i; #f; #U; #j; #b; #bUf; @ j; nassumption;
930 nqed.
931
932 (*D
933
934 The proof of infinity uses the following form of the Axiom of Choice,
935 that cannot be proved inside Matita, since the existential quantifier
936 lives in the sort of predicative propositions while the sigma in the conclusion
937 lives in the sort of data types, and thus the former cannot be eliminated
938 to provide the witness for the second.
939
940 D*)
941
942 naxiom AC : ∀A,a,i,U.
943   (∀j:𝐃 a i.∃x:Ord A.𝐝 a i j ∈ U⎽x) → (Σf.∀j:𝐃 a i.𝐝 a i j ∈ U⎽(f j)).
944
945 (*D
946
947 In the proof of infinity, we have to rewrite under the ∈ predicate.
948 It is clearly possible to show that `U⎽x` is an extensional set:
949
950 > a = b → a ∈ U⎽x → b ∈ U⎽x
951
952 Anyway this proof is a non trivial induction over x, that requires `𝐈` and `𝐃` to be
953 declared as morphisms. This poses no problem, but goes out of the scope of the 
954 tutorial, since dependent morphisms are hard to manipulate, and we thus assume it.
955
956 D*)
957
958 naxiom U_x_is_ext: ∀A:nAx.∀a,b:A.∀x.∀U. a = b → b ∈ U⎽x → a ∈ U⎽x.
959
960 (*D
961
962 The reflexivity proof is trivial, it is enough to provide the ordinal `0`
963 as a witness, then `◃(U)` reduces to `U` by definition, 
964 hence the conclusion. Note that `0` is between `(` and `)` to
965 make it clear that it is a term (an ordinal) and not the number
966 of the constructor we want to apply (that is the first and only one
967 of the existential inductive type).
968
969 D*)
970 ntheorem new_coverage_reflexive: ∀A:nAx.∀U:Ω^A.∀a. a ∈ U → a ◃ U.
971 #A; #U; #a; #H; @ (0); napply H;
972 nqed.
973
974 (*D
975
976 We now proceed with the proof of the infinity rule.
977
978 D*)
979
980
981 alias symbol "covers" = "new covers set".
982 ntheorem new_coverage_infinity:
983   ∀A:nAx.∀U:Ω^A.∀a:A. (∃i:𝐈 a. 𝐈𝐦[𝐝 a i] ◃ U) → a ◃ U.
984 #A; #U; #a;                                   (** screenshot "n-cov-inf-1". *)  
985 *; #i; #H; nnormalize in H;                   (** screenshot "n-cov-inf-2". *)
986 ncut (∀y:𝐃 a i.∃x:Ord A.𝐝 a i y ∈ U⎽x); ##[    (** screenshot "n-cov-inf-3". *)
987   #z; napply H; @ z; napply #; ##] #H';       (** screenshot "n-cov-inf-4". *)
988 ncases (AC … H'); #f; #Hf;                    (** screenshot "n-cov-inf-5". *)
989 ncut (∀j.𝐝 a i j ∈ U⎽(Λ f));
990   ##[ #j; napply (ord_subset … f … (Hf j));##] #Hf';(** screenshot "n-cov-inf-6". *)
991 @ (Λ f+1);                                    (** screenshot "n-cov-inf-7". *)
992 @2;                                           (** screenshot "n-cov-inf-8". *) 
993 @i; #x; *; #d; #Hd;                           (** screenshot "n-cov-inf-9". *)  
994 napply (U_x_is_ext … Hd); napply Hf';
995 nqed.
996
997 (*D
998 D[n-cov-inf-1]
999 We eliminate the existential, obtaining an `i` and a proof that the 
1000 image of `𝐝 a i` is covered by U. The `nnormalize` tactic computes the normal
1001 form of `H`, thus expands the definition of cover between sets.
1002
1003 D[n-cov-inf-2]
1004 When the paper proof considers `H`, it implicitly substitutes assumed 
1005 equation defining `y` in its conclusion. 
1006 In Matita this step is not completely trivial.
1007 We thus assert (`ncut`) the nicer form of `H` and prove it.
1008
1009 D[n-cov-inf-3]
1010 After introducing `z`, `H` can be applied (choosing `𝐝 a i z` as `y`). 
1011 What is the left to prove is that `∃j: 𝐃 a j. 𝐝 a i z = 𝐝 a i j`, that 
1012 becomes trivial if `j` is chosen to be `z`. In the command `napply #`,
1013 the `#` is a standard notation for the reflexivity property of the equality. 
1014
1015 D[n-cov-inf-4]
1016 Under `H'` the axiom of choice `AC` can be eliminated, obtaining the `f` and 
1017 its property. Note that the axiom `AC` was abstracted over `A,a,i,U` before
1018 assuming `(∀j:𝐃 a i.∃x:Ord A.𝐝 a i j ∈ U⎽x)`. Thus the term that can be eliminated
1019 is `AC ???? H'` where the system is able to infer every `?`. Matita provides
1020 a facility to specify a number of `?` in a compact way, i.e. `…`. The system
1021 expand `…` first to zero, then one, then two, three and finally four question 
1022 marks, "guessing" how may of them are needed. 
1023
1024 D[n-cov-inf-5]
1025 The paper proof does now a forward reasoning step, deriving (by the ord_subset 
1026 lemma we proved above) `Hf'` i.e. 𝐝 a i j ∈ U⎽(Λf).
1027
1028 D[n-cov-inf-6]
1029 To prove that `a◃U` we have to exhibit the ordinal x such that `a ∈ U⎽x`.
1030
1031 D[n-cov-inf-7]
1032 The definition of `U⎽(…+1)` expands to the union of two sets, and proving
1033 that `a ∈ X ∪ Y` is, by definition, equivalent to prove that `a` is in `X` or `Y`. 
1034 Applying the second constructor `@2;` of the disjunction, 
1035 we are left to prove that `a` belongs to the right hand side of the union.
1036
1037 D[n-cov-inf-8]
1038 We thus provide `i` as the witness of the existential, introduce the 
1039 element being in the image and we are
1040 left to prove that it belongs to `U⎽(Λf)`. In the meanwhile, since belonging 
1041 to the image means that there exists an object in the domain …, we eliminate the
1042 existential, obtaining `d` (of type `𝐃 a i`) and the equation defining `x`.  
1043
1044 D[n-cov-inf-9]
1045 We just need to use the equational definition of `x` to obtain a conclusion
1046 that can be proved with `Hf'`. We assumed that `U⎽x` is extensional for
1047 every `x`, thus we are allowed to use `Hd` and close the proof.
1048
1049 D*)
1050
1051 (*D
1052
1053 The next proof is that ◃(U) is minimal. The hardest part of the proof
1054 is to prepare the goal for the induction. The desiderata is to prove
1055 `U⎽o ⊆ V` by induction on `o`, but the conclusion of the lemma is,
1056 unfolding all definitions:
1057
1058 > ∀x. x ∈ { y | ∃o:Ord A.y ∈ U⎽o } → x ∈ V
1059
1060 D*)
1061
1062 nlemma new_coverage_min :  
1063   ∀A:nAx.∀U:Ω^A.∀V.U ⊆ V → (∀a:A.∀i.𝐈𝐦[𝐝 a i] ⊆ V → a ∈ V) → ◃U ⊆ V.
1064 #A; #U; #V; #HUV; #Im;#b;                       (** screenshot "n-cov-min-2". *)
1065 *; #o;                                          (** screenshot "n-cov-min-3". *)
1066 ngeneralize in match b; nchange with (U⎽o ⊆ V); (** screenshot "n-cov-min-4". *)
1067 nelim o;                                        (** screenshot "n-cov-min-5". *) 
1068 ##[ #b; #bU0; napply HUV; napply bU0;
1069 ##| #p; #IH; napply subseteq_union_l; ##[ nassumption; ##]
1070     #x; *; #i; #H; napply (Im ? i); napply (subseteq_trans … IH); napply H;
1071 ##| #a; #i; #f; #IH; #x; *; #d; napply IH; ##]
1072 nqed.
1073
1074 (*D
1075 D[n-cov-min-2]
1076 After all the introductions, event the element hidden in the ⊆ definition,
1077 we have to eliminate the existential quantifier, obtaining the ordinal `o`
1078
1079 D[n-cov-min-3]
1080 What is left is almost right, but the element `b` is already in the
1081 context. We thus generalize every occurrence of `b` in 
1082 the current goal, obtaining `∀c.c ∈ U⎽o → c ∈ V` that is `U⎽o ⊆ V`.
1083
1084 D[n-cov-min-4]
1085 We then proceed by induction on `o` obtaining the following goals
1086
1087 D[n-cov-min-5]
1088 All of them can be proved using simple set theoretic arguments,
1089 the induction hypothesis and the assumption `Im`.
1090
1091 D*)
1092
1093
1094 (*D
1095
1096 The notion `F⎽x` is again defined by recursion over the ordinal `x`.
1097
1098 D*)
1099
1100 nlet rec famF (A: nAx) (F : Ω^A) (x : Ord A) on x : Ω^A ≝ 
1101   match x with
1102   [ oO ⇒ F
1103   | oS o ⇒ let F_o ≝ famF A F o in F_o ∩ { x | ∀i:𝐈 x.∃j:𝐃 x i.𝐝 x i j ∈ F_o } 
1104   | oL a i f ⇒ { x | ∀j:𝐃 a i.x ∈ famF A F (f j) }
1105   ].
1106
1107 interpretation "famF" 'famU U x = (famF ? U x).
1108
1109 ndefinition ord_fished : ∀A:nAx.∀F:Ω^A.Ω^A ≝ λA,F.{ y | ∀x:Ord A. y ∈ F⎽x }.
1110
1111 interpretation "fished new fish" 'fished U = (ord_fished ? U).
1112 interpretation "new fish" 'fish a U = (mem ? (ord_fished ? U) a).
1113
1114 (*D
1115
1116 The proof of compatibility uses this little result, that we 
1117 proved outside the main proof. 
1118
1119 D*)
1120 nlemma co_ord_subset: ∀A:nAx.∀F:Ω^A.∀a,i.∀f:𝐃 a i → Ord A.∀j. F⎽(Λ f) ⊆ F⎽(f j).
1121 #A; #F; #a; #i; #f; #j; #x; #H; napply H;
1122 nqed.
1123
1124 (*D
1125
1126 We assume the dual of the axiom of choice, as in the paper proof.
1127
1128 D*)
1129 naxiom AC_dual: ∀A:nAx.∀a:A.∀i,F. 
1130  (∀f:𝐃 a i → Ord A.∃x:𝐃 a i.𝐝 a i x ∈ F⎽(f x)) → ∃j:𝐃 a i.∀x:Ord A.𝐝 a i j ∈ F⎽x.
1131
1132 (*D
1133
1134 Proving the anti-reflexivity property is simple, since the
1135 assumption `a ⋉ F` states that for every ordinal `x` (and thus also 0)
1136 `a ∈ F⎽x`. If `x` is choose to be `0`, we obtain the thesis.
1137
1138 D*)
1139 ntheorem new_fish_antirefl: ∀A:nAx.∀F:Ω^A.∀a. a ⋉ F → a ∈ F.
1140 #A; #F; #a; #H; nlapply (H 0); #aFo; napply aFo;
1141 nqed.
1142
1143 (*D
1144
1145 We now prove the compatibility property for the new fish relation.
1146
1147 D*)
1148 ntheorem new_fish_compatible: 
1149  ∀A:nAx.∀F:Ω^A.∀a. a ⋉ F → ∀i:𝐈 a.∃j:𝐃 a i.𝐝 a i j ⋉ F.
1150 #A; #F; #a; #aF; #i; nnormalize;               (** screenshot "n-f-compat-1". *)
1151 napply AC_dual; #f;                            (** screenshot "n-f-compat-2". *)
1152 nlapply (aF (Λf+1)); #aLf;                     (** screenshot "n-f-compat-3". *)
1153 nchange in aLf with 
1154   (a ∈ F⎽(Λ f) ∧ ∀i:𝐈 a.∃j:𝐃 a i.𝐝 a i j ∈ F⎽(Λ f)); (** screenshot "n-f-compat-4". *)
1155 ncases aLf; #_; #H; nlapply (H i);                 (** screenshot "n-f-compat-5". *)
1156 *; #j; #Hj; @j;                                    (** screenshot "n-f-compat-6". *)
1157 napply (co_ord_subset … Hj);
1158 nqed.
1159
1160 (*D
1161 D[n-f-compat-1]
1162 After reducing to normal form the goal, we observe it is exactly the conclusion of
1163 the dual axiom of choice we just assumed. We thus apply it ad introduce the 
1164 fcuntion `f`.
1165
1166 D[n-f-compat-2]
1167 The hypothesis `aF` states that `a⋉F⎽x` for every `x`, and we choose `Λf+1`.
1168
1169 D[n-f-compat-3]
1170 Since F_(Λf+1) is defined by recursion and we actually have a concrete input
1171 `Λf+1` for that recursive function, it can be computed. 
1172 Anyway, using the `nnormalize`
1173 tactic would reduce too much (both the `+1` and the `Λf` steps would be performed);
1174 we thus explicitly give a convertible type for that hypothesis, corresponding 
1175 the computation of the `+1` step, plus the unfolding the definition of
1176 the intersection.
1177
1178 D[n-f-compat-4]
1179 We are interested in the right hand side of `aLf`, an in particular to
1180 its intance where the generic index in `𝐈 a` is `i`.
1181
1182 D[n-f-compat-5]
1183 We then eliminate the existential, obtaining `j` and its property `Hj`. We provide
1184 the same witness 
1185
1186 D[n-f-compat-6]
1187 What is left to prove is exactly the `co_ord_subset` lemma we factored out
1188 of the main proof.
1189
1190 D*)
1191
1192 (*D
1193
1194 The proof that `⋉(F)` is maximal is exactly the dual one of the
1195 minimality of `◃(U)`. Thus the main problem is to obtain `G ⊆ F⎽o`
1196 before doing the induction over `o`.
1197
1198 Note that `G` is assumed to be of type `𝛀^A`, that means an extensional
1199 subset of `S`, while `Ω^A` means just a subset (note that the former is bold). 
1200
1201 D*)
1202 ntheorem max_new_fished: 
1203   ∀A:nAx.∀G:𝛀^A.∀F:Ω^A.G ⊆ F → (∀a.a ∈ G → ∀i.𝐈𝐦[𝐝 a i] ≬ G) → G ⊆ ⋉F.
1204 #A; #G; #F; #GF; #H; #b; #HbG; #o; 
1205 ngeneralize in match HbG; ngeneralize in match b;
1206 nchange with (G ⊆ F⎽o);
1207 nelim o;
1208 ##[ napply GF;
1209 ##| #p; #IH; napply (subseteq_intersection_r … IH);
1210     #x; #Hx; #i; ncases (H … Hx i); #c; *; *; #d; #Ed; #cG;
1211     @d; napply IH;                                (** screenshot "n-f-max-1". *)
1212     alias symbol "prop2" = "prop21".
1213     napply (. Ed^-1‡#); napply cG;    
1214 ##| #a; #i; #f; #Hf; nchange with (G ⊆ { y | ∀x. y ∈ F⎽(f x) }); 
1215     #b; #Hb; #d; napply (Hf d); napply Hb;
1216 ##]
1217 nqed.
1218
1219 (*D
1220 D[n-f-max-1]
1221 Here the situation looks really similar to the one of the dual proof where 
1222 we had to apply the assumption `U_x_is_ext`, but here the set is just `G`
1223 not `F_x`. Since we assumed `G` to be extensional we can 
1224 exploit the facilities
1225 Matita provides to perform rewriting in the general setting of setoids.
1226
1227 The `.` notation simply triggers the mechanism, while the given argument has to
1228 mimic the context under which the rewriting has to happen. In that case
1229 we want to rewrite the left hand side of the binary morphism `∈`. 
1230 The infix notation
1231 to represent the context of a binary morphism is `‡`. The right hand side 
1232 has to be left untouched, and the identity rewriting step is represented with 
1233 `#` (actually a reflexivity proof for the subterm identified by the context). 
1234
1235 We want to rewrite the left hand side using `Ed` right-to-left (the default
1236 is left-to-right). We thus write `Ed^-1`, that is a proof that `𝐝 x i d = c`. 
1237
1238 The complete command is `napply (. Ed^-1‡#)` that has to be read like:
1239
1240 > perform some rewritings under a binary morphism, 
1241 > on the right do nothing, 
1242 > on the left rewrite with Ed right-to-left.
1243
1244 After the rewriting step the goal is exactly the `cG` assumption.
1245
1246 D*)
1247
1248
1249 (*D
1250 <div id="appendix" class="anchor"></div>
1251 Appendix: tactics explanation
1252 -----------------------------
1253
1254 In this appendix we try to give a description of tactics
1255 in terms of sequent calculus rules annotated with proofs.
1256 The `:` separator has to be read as _is a proof of_, in the spirit
1257 of the Curry-Howard isomorphism.
1258
1259                   Γ ⊢  f  :  A1 → … → An → B    Γ ⊢ ?1 : A1 … ?n  :  An 
1260     napply f;    ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1261                            Γ ⊢ (f ?1 … ?n )  :  B
1262  
1263                    Γ ⊢  ?  :  F → B       Γ ⊢ f  :  F 
1264     nlapply f;    ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1265                              Γ ⊢ (? f)  :  B
1266
1267
1268                  Γ; x : T  ⊢ ?  :  P(x) 
1269     #x;      ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1270                 Γ ⊢ λx:T.?  :  ∀x:T.P(x)
1271
1272                        
1273                        Γ ⊢ ?_i  :  args_i → P(k_i args_i)          
1274     ncases x;   ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1275                 Γ ⊢ match x with [ k1 args1 ⇒ ?_1 | … | kn argsn ⇒ ?_n ]  :  P(x)                    
1276
1277
1278                       Γ ⊢ ?i  :  ∀t. P(t) → P(k_i … t …)          
1279     nelim x;   ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1280                    Γ ⊢ (T_rect_CProp0 ?_1 … ?_n)  :  P(x)                    
1281
1282 Where `T_rect_CProp0` is the induction principle for the 
1283 inductive type `T`.
1284
1285
1286                           Γ ⊢ ?  :  Q     Q ≡ P          
1287     nchange with Q;   ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1288                           Γ ⊢ ?  :  P                    
1289
1290 Where the equivalence relation between types `≡` keeps into account
1291 β-reduction, δ-reduction (definition unfolding), ζ-reduction (local
1292 definition unfolding), ι-reduction (pattern matching simplification),
1293 μ-reduction (recursive function computation) and ν-reduction (co-fixpoint
1294 computation).
1295
1296
1297                                Γ; H : Q; Δ ⊢ ?  :  G     Q ≡ P          
1298     nchange in H with Q; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1299                                Γ; H : P; Δ ⊢ ?  :  G                    
1300
1301
1302                                Γ; H : Q; Δ ⊢ ?  :  G     P →* Q           
1303     nnormalize in H; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1304                                Γ; H : P; Δ ⊢ ?  :  G                    
1305
1306 Where `Q` is the normal form of `P` considering βδζιμν-reduction steps.
1307
1308
1309                        Γ ⊢ ?  :  Q     P →* Q          
1310     nnormalize; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1311                        Γ ⊢ ?  :  P                    
1312
1313
1314                     Γ ⊢ ?_2  :  T → G    Γ ⊢ ?_1  :  T
1315     ncut T;   ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1316                                Γ ⊢ (?_2 ?_1)  :  G                    
1317
1318
1319                                 Γ ⊢ ?  :  ∀x.P(x)
1320     ngeneralize in match t; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1321                                 Γ ⊢ (? t)  :  P(t)
1322                                 
1323 D*)
1324
1325
1326 (*D
1327
1328 <date>
1329 Last updated: $Date$
1330 </date>
1331
1332 [1]: http://upsilon.cc/~zack/research/publications/notation.pdf 
1333 [2]: http://matita.cs.unibo.it
1334 [3]: http://www.cs.unibo.it/~tassi/smallcc.pdf
1335 [4]: http://www.inria.fr/rrrt/rr-0530.html
1336
1337 D*)