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