3 Matita Tutorial: inductively generated formal topologies
4 ========================================================
6 This is a not so short introduction to Matita, based on
7 the formalization of the paper
9 > Between formal topology and game theory: an
10 > explicit solution for the conditions for an
11 > inductive generation of formal topologies
13 by S.Berardi and S. Valentini. The tutorial is by Enrico Tassi.
15 The tutorial spends a considerable amount of effort in defining
16 notations that resemble the ones used in the original paper. We believe
17 this is a important part of every formalization, not only from the aesthetic
18 point of view, but also from the practical point of view. Being
19 consistent allows to follow the paper in a pedantic way, and hopefully
20 to make the formalization (at least the definitions and proved
21 statements) readable to the author of the paper.
26 The graphical interface of Matita is composed of three windows:
27 the script window, on the left, is where you type; the sequent
28 window on the top right is where the system shows you the ongoing proof;
29 the error window, on the bottom right, is where the system complains.
30 On the top of the script window five buttons drive the processing of
31 the proof script. From left to right the requesting the system to:
33 - go back to the beginning of the script
35 - go to the current cursor position
37 - advance to the end of the script
39 When the system processes a command, it locks the part of the script
40 corresponding to the command, such that you cannot edit it anymore
41 (without to go back). Locked parts are coloured in blue.
43 The sequent window is hyper textual, i.e. you can click on symbols
44 to jump to their definition, or switch between different notation
45 for the same expression (for example, equality has two notations,
46 one of them makes the type of the arguments explicit).
48 Everywhere in the script you can use the `ncheck (term).` command to
49 ask for the type a given term. If you that in the middle of a proof,
50 the term is assumed to live in the current proof context (i.e. can use
51 variables introduced so far).
53 To ease the typing of mathematical symbols, the script window
54 implements two unusual input facilities:
56 - some TeX symbols can be typed using their TeX names, and are
57 automatically converted to UTF-8 characters. For a list of
58 the supported TeX names, see the menu: View ▹ TeX/UTF-8 Table.
59 Moreover some ASCII-art is understood as well, like `=>` and `->`
60 to mean double or single arrows.
61 Here we recall some of these "shortcuts":
63 - ∀ can be typed with `\Forall`
64 - λ can be typed with `\lambda`
65 - ≝ can be typed with `\def` or `:=`
66 - → can be typed with `\to` or `->`
68 - some symbols have variants, like the ≤ relation and ≼, ≰, ⋠.
69 The user can cycle between variants typing one of them and then
70 pressing ALT-L. Note that also letters do have variants, for
71 example W has Ω, 𝕎 and 𝐖, L has Λ, 𝕃, and 𝐋, F has Φ, …
72 Variants are listed in the aforementioned TeX/UTF-8 table.
74 Pressing `F1` opens the Matita manual.
76 CIC (as implemented in Matita) in a nutshell
77 --------------------------------------------
79 CIC is a full and functional Pure Type System (all products do exist,
80 and their sort is is determined by the target) with an impedicative sort
81 Prop and a predicative sort Type. The environment can be populated with
82 well typed definitions or theorems, (co)inductive types validating positivity
83 conditions and recursive functions provably total by simple syntactical
84 analysis (recursive call on structurally smaller subterms). Co-recursive
85 functions can be defined as well, and must satisfy a dual condition, that is
86 performing the recursive call only after having generated a constructor (a piece
89 The λ-calculus is equipped with a pattern matching construct (match) on inductive
90 types defined in the environment that combined with the definable total
91 structural recursive functions allows to define eliminators (or constructors)
92 for (co)inductive types. The λ-calculus is also equipped with explicitly types
93 local definitions (let in) that in the degenerate case work as casts (i.e.
94 the type annotation `(t : T)` is implemented as `let x : T ≝ t in x`).
96 Types are compare up to conversion. Since types may depend on terms, conversion
97 involves β-reduction, δ-reduction (definition unfolding), ζ-reduction (local
98 definition unfolding), ι-reduction (pattern matching simplification),
99 μ-reduction (recursive function computation) and ν-reduction (co-fixpoint
102 Since we are going to formalize constructive and predicative mathematics
103 in an intensional type theory like CIC, we try to establish some terminology.
104 Type is the sort of sets equipped with the Id equality (i.e. an intensional,
105 not quotiented set). We will avoid using Leibnitz equality Id,
106 thus we will explicitly equip a set with an equality when needed.
107 We will call this structure `setoid`. Note that we will
108 attach the infix = symbol only to the equality of a setoid,
111 We write Type[i] to mention a Type in the predicative hierarchy
112 of types. To ease the comprehension we will use Type[0] for sets,
113 and Type[1] for classes.
115 For every Type[i] there is a corresponding level of predicative
116 propositions CProp[i].
119 The standard library and the `include` command
120 ----------------------------------------------
122 Some basic notions, like subset, membership, intersection and union
123 are part of the standard library of Matita.
125 These notions come with some standard notation attached to them:
127 - A ∪ B can be typed with `A \cup B`
128 - A ∩ B can be typed with `A \cap B`
129 - A ≬ B can be typed with `A \between B`
130 - x ∈ A can be typed with `x \in A`
131 - Ω^A, that is the type of the subsets of A, can be typed with `\Omega ^ A`
133 The `include` command tells Matita to load a part of the library,
134 in particular the part that we will use can be loaded as follows:
138 include "sets/sets.ma".
142 Some basic results that we will use are also part of the sets library:
144 - subseteq\_union\_l: ∀A.∀U,V,W:Ω^A.U ⊆ W → V ⊆ W → U ∪ V ⊆ W
145 - subseteq\_intersection\_r: ∀A.∀U,V,W:Ω^A.W ⊆ U → W ⊆ V → W ⊆ U ∩ V
150 A set of axioms is made of a set S, a family of sets I and a
151 family C of subsets of S indexed by elements a of S and I(a).
153 It is desirable to state theorems like "for every set of axioms, …"
154 without explicitly mentioning S, I and C. To do that, the three
155 components have to be grouped into a record (essentially a dependently
156 typed tuple). The system is able to generate the projections
157 of the record for free, and they are named as the fields of
158 the record. So, given a axiom set `A` we can obtain the set
159 with `S A`, the family of sets with `I A` and the family of subsets
164 nrecord Ax : Type[1] ≝ {
167 C : ∀a:S. I a → Ω ^ S
172 Forget for a moment the `:>` that will be detailed later, and focus on
173 the record definition. It is made of a list of pairs: a name, followed
174 by `:` and the its type. It is a dependently typed tuple, thus
175 already defined names (fields) can be used in the types that follow.
177 Note that `S` is declared to be a `setoid` and not a Type. The original
178 paper probably also considers I to generate setoids, and both I and C
179 to be morphisms. For the sake of simplicity, we will "cheat" and use
180 setoids only when strictly needed (i.e. where we want to talk about
181 equality). Setoids will play a role only when we will define
182 the alternative version of the axiom set.
184 Note that the field `S` was declared with `:>` instead of a simple `:`.
185 This declares the `S` projection to be a coercion. A coercion is
186 a function case the system automatically inserts when it is needed.
187 In that case, the projection `S` has type `Ax → setoid`, and whenever
188 the expected type of a term is `setoid` while its type is `Ax`, the
189 system inserts the coercion around it, to make the whole term well types.
191 When formalizing an algebraic structure, declaring the carrier as a
192 coercion is a common practice, since it allows to write statements like
194 ∀G:Group.∀x:G.x * x^-1 = 1
196 The quantification over `x` of type `G` is ill-typed, since `G` is a term
197 (of type `Group`) and thus not a type. Since the carrier projection
198 `carr` of `G` is a coercion, that maps a `Group` into the type of
199 its elements, the system automatically inserts `carr` around `G`,
200 obtaining `…∀x: carr G.…`. Coercions are also hidden by the system
201 when it displays a term.
203 In this particular case, the coercion `S` allows to write
207 Since `A` is not a type, but it can be turned into a `setoid` by `S`
208 and a `setoid` can be turned into a type by its `carr` projection, the
209 composed coercion `carr ∘ S` is silently inserted.
214 Something that is not still satisfactory, is that the dependent type
215 of `I` and `C` are abstracted over the Axiom set. To obtain the
216 precise type of a term, you can use the `ncheck` command as follows.
225 One would like to write `I a` and not `I A a` under a context where
226 `A` is an axiom set and `a` has type `S A` (or thanks to the coercion
227 mechanism simply `A`). In Matita, a question mark represents an implicit
228 argument, i.e. a missing piece of information the system is asked to
229 infer. Matita performs some sort of type inference, thus writing
230 `I ? a` is enough: since the second argument of `I` is typed by the
231 first one, the first one can be inferred just computing the type of `a`.
235 (* ncheck (∀A:Ax.∀a:A.I ? a). *)
239 This is still not completely satisfactory, since you have always type
240 `?`; to fix this minor issue we have to introduce the notational
241 support built in Matita.
246 Matita is quipped with a quite complex notational support,
247 allowing the user to define and use mathematical notations
248 ([From Notation to Semantics: There and Back Again][1]).
250 Since notations are usually ambiguous (e.g. the frequent overloading of
251 symbols) Matita distinguishes between the term level, the
252 content level, and the presentation level, allowing multiple
253 mappings between the content and the term level.
255 The mapping between the presentation level (i.e. what is typed on the
256 keyboard and what is displayed in the sequent window) and the content
257 level is defined with the `notation` command. When followed by
258 `>`, it defines an input (only) notation.
262 notation > "𝐈 term 90 a" non associative with precedence 70 for @{ 'I $a }.
263 notation > "𝐂 term 90 a term 90 i" non associative with precedence 70 for @{ 'C $a $i }.
267 The first notation defines the writing `𝐈 a` where `a` is a generic
268 term of precedence 90, the maximum one. This high precedence forces
269 parentheses around any term of a lower precedence. For example `𝐈 x`
270 would be accepted, since identifiers have precedence 90, but
271 `𝐈 f x` would be interpreted as `(𝐈 f) x`. In the latter case, parentheses
272 have to be put around `f x`, thus the accepted writing would be `𝐈 (f x)`.
274 To obtain the `𝐈` is enough to type `I` and then cycle between its
275 similar symbols with ALT-L. The same for `𝐂`. Notations cannot use
276 regular letters or the round parentheses, thus their variants (like the
277 bold ones) have to be used.
279 The first notation associates `𝐈 a` with `'I $a` where `'I` is a
280 new content element to which a term `$a` is passed.
282 Content elements have to be interpreted, and possibly multiple,
283 incompatible, interpretations can be defined.
287 interpretation "I" 'I a = (I ? a).
288 interpretation "C" 'C a i = (C ? a i).
292 The `interpretation` command allows to define the mapping between
293 the content level and the terms level. Here we associate the `I` and
294 `C` projections of the Axiom set record, where the Axiom set is an implicit
295 argument `?` to be inferred by the system.
297 Interpretation are bi-directional, thus when displaying a term like
298 `C _ a i`, the system looks for a presentation for the content element
303 notation < "𝐈 \sub( ❨a❩ )" non associative with precedence 70 for @{ 'I $a }.
304 notation < "𝐂 \sub( ❨a,\emsp i❩ )" non associative with precedence 70 for @{ 'C $a $i }.
308 For output purposes we can define more complex notations, for example
309 we can put bold parentheses around the arguments of `𝐈` and `𝐂`, decreasing
310 the size of the arguments and lowering their baseline (i.e. putting them
311 as subscript), separating them with a comma followed by a little space.
313 The first (technical) definition
314 --------------------------------
316 Before defining the cover relation as an inductive predicate, one
317 has to notice that the infinity rule uses, in its hypotheses, the
318 cover relation between two subsets, while the inductive predicate
319 we are going to define relates an element and a subset.
321 An option would be to unfold the definition of cover between subsets,
322 but we prefer to define the abstract notion of cover between subsets
323 (so that we can attach a (ambiguous) notation to it).
325 Anyway, to ease the understanding of the definition of the cover relation
326 between subsets, we first define the inductive predicate unfolding the
327 definition, and we later refine it with.
331 ninductive xcover (A : Ax) (U : Ω^A) : A → CProp[0] ≝
332 | xcreflexivity : ∀a:A. a ∈ U → xcover A U a
333 | xcinfinity : ∀a:A.∀i:𝐈 a. (∀y.y ∈ 𝐂 a i → xcover A U y) → xcover A U a.
337 We defined the xcover (x will be removed in the final version of the
338 definition) as an inductive predicate. The arity of the inductive
339 predicate has to be carefully analyzed:
341 > (A : Ax) (U : Ω^A) : A → CProp[0]
343 The syntax separates with `:` abstractions that are fixed for every
344 constructor (introduction rule) and abstractions that can change. In that
345 case the parameter `U` is abstracted once and forall in front of every
346 constructor, and every occurrence of the inductive predicate is applied to
347 `U` in a consistent way. Arguments abstracted on the right of `:` are not
348 constant, for example the xcinfinity constructor introduces `a ◃ U`,
349 but under the assumption that (for every y) `y ◃ U`. In that rule, the left
350 had side of the predicate changes, thus it has to be abstracted (in the arity
351 of the inductive predicate) on the right of `:`.
355 (* ncheck xcreflexivity. *)
359 We want now to abstract out `(∀y.y ∈ 𝐂 a i → xcover A U y)` and define
360 a notion `cover_set` to which a notation `𝐂 a i ◃ U` can be attached.
362 This notion has to be abstracted over the cover relation (whose
363 type is the arity of the inductive `xcover` predicate just defined).
365 Then it has to be abstracted over the arguments of that cover relation,
366 i.e. the axiom set and the set U, and the subset (in that case `𝐂 a i`)
367 sitting on the left hand side of `◃`.
371 ndefinition cover_set :
372 ∀cover: ∀A:Ax.Ω^A → A → CProp[0]. ∀A:Ax.∀C,U:Ω^A. CProp[0]
374 λcover. λA, C,U. ∀y.y ∈ C → cover A U y.
378 The `ndefinition` command takes a name, a type and body (of that type).
379 The type can be omitted, and in that case it is inferred by the system.
380 If the type is given, the system uses it to infer implicit arguments
381 of the body. In that case all types are left implicit in the body.
383 We now define the notation `a ◃ b`. Here the keywork `hvbox`
384 and `break` tell the system how to wrap text when it does not
385 fit the screen (they can be safely ignore for the scope of
386 this tutorial). We also add an interpretation for that notation,
387 where the (abstracted) cover relation is implicit. The system
388 will not be able to infer it from the other arguments `C` and `U`
389 and will thus prompt the user for it. This is also why we named this
390 interpretation `covers set temp`: we will later define another
391 interpretation in which the cover relation is the one we are going to
396 notation "hvbox(a break ◃ b)" non associative with precedence 45
397 for @{ 'covers $a $b }.
399 interpretation "covers set temp" 'covers C U = (cover_set ?? C U).
406 We can now define the cover relation using the `◃` notation for
407 the premise of infinity.
411 ninductive cover (A : Ax) (U : Ω^A) : A → CProp[0] ≝
412 | creflexivity : ∀a. a ∈ U → cover ? U a
413 | cinfinity : ∀a. ∀i. 𝐂 a i ◃ U → cover ? U a.
414 (** screenshot "cover". *)
420 Note that the system accepts the definition
421 but prompts the user for the relation the `cover_set` notion is
426 The horizontal line separates the hypotheses from the conclusion.
427 The `napply cover` command tells the system that the relation
428 it is looking for is exactly our first context entry (i.e. the inductive
429 predicate we are defining, up to α-conversion); while the `nqed` command
430 ends a definition or proof.
432 We can now define the interpretation for the cover relation between an
433 element and a subset fist, then between two subsets (but this time
434 we fixed the relation `cover_set` is abstracted on).
438 interpretation "covers" 'covers a U = (cover ? U a).
439 interpretation "covers set" 'covers a U = (cover_set cover ? a U).
443 We will proceed similarly for the fish relation, but before going
444 on it is better to give a short introduction to the proof mode of Matita.
445 We define again the `cover_set` term, but this time we will build
446 its body interactively. In the λ-calculus Matita is based on, CIC, proofs
447 and terms share the same syntax, and it is thus possible to use the
448 commands devoted to build proof term to build regular definitions.
449 A tentative semantics for the proof mode commands (called tactics)
450 in terms of sequent calculus rules are given in the
451 <a href="#appendix">appendix</a>.
455 ndefinition xcover_set :
456 ∀c: ∀A:Ax.Ω^A → A → CProp[0]. ∀A:Ax.∀C,U:Ω^A. CProp[0].
457 (** screenshot "xcover-set-1". *)
458 #cover; #A; #C; #U; (** screenshot "xcover-set-2". *)
459 napply (∀y:A.y ∈ C → ?); (** screenshot "xcover-set-3". *)
460 napply cover; (** screenshot "xcover-set-4". *)
468 The system asks for a proof of the full statement, in an empty context.
470 The `#` command is the ∀-introduction rule, it gives a name to an
471 assumption putting it in the context, and generates a λ-abstraction
475 We have now to provide a proposition, and we exhibit it. We left
476 a part of it implicit; since the system cannot infer it it will
477 ask it later. Note that the type of `∀y:A.y ∈ C → ?` is a proposition
481 The proposition we want to provide is an application of the
482 cover relation we have abstracted in the context. The command
483 `napply`, if the given term has not the expected type (in that
484 case it is a product versus a proposition) it applies it to as many
485 implicit arguments as necessary (in that case `? ? ?`).
488 The system will now ask in turn the three implicit arguments
489 passed to cover. The syntax `##[` allows to start a branching
490 to tackle every sub proof individually, otherwise every command
491 is applied to every subrpoof. The command `##|` switches to the next
492 subproof and `##]` ends the branching.
500 The definition of fish works exactly the same way as for cover, except
501 that it is defined as a coinductive proposition.
504 ndefinition fish_set ≝ λf:∀A:Ax.Ω^A → A → CProp[0].
509 notation "hvbox(a break ⋉ b)" non associative with precedence 45
510 for @{ 'fish $a $b }.
512 interpretation "fish set temp" 'fish A U = (fish_set ?? U A).
514 ncoinductive fish (A : Ax) (F : Ω^A) : A → CProp[0] ≝
515 | cfish : ∀a. a ∈ F → (∀i:𝐈 a .𝐂 a i ⋉ F) → fish A F a.
519 interpretation "fish set" 'fish A U = (fish_set fish ? U A).
520 interpretation "fish" 'fish a U = (fish ? U a).
524 Introction rule for fish
525 ------------------------
527 Matita is able to generate elimination rules for inductive types,
528 but not introduction rules for the coinductive case.
532 (* ncheck cover_rect_CProp0. *)
536 We thus have to define the introduction rule for fish by corecursion.
537 Here we again use the proof mode of Matita to exhibit the body of the
538 corecursive function.
542 nlet corec fish_rec (A:Ax) (U: Ω^A)
544 (H2: ∀a:A. a ∈ P → ∀j: 𝐈 a. 𝐂 a j ≬ P): ∀a:A. ∀p: a ∈ P. a ⋉ U ≝ ?.
545 (** screenshot "def-fish-rec-1". *)
546 #a; #p; napply cfish; (** screenshot "def-fish-rec-2". *)
547 ##[ nchange in H1 with (∀b.b∈P → b∈U); (** screenshot "def-fish-rec-2-1". *)
548 napply H1; (** screenshot "def-fish-rec-3". *)
550 ##| #i; ncases (H2 a p i); (** screenshot "def-fish-rec-5". *)
551 #x; *; #xC; #xP; (** screenshot "def-fish-rec-5-1". *)
552 @; (** screenshot "def-fish-rec-6". *)
554 ##| @; (** screenshot "def-fish-rec-7". *)
556 ##| napply (fish_rec ? U P); (** screenshot "def-fish-rec-9". *)
565 Note the first item of the context, it is the corecursive function we are
566 defining. This item allows to perform the recursive call, but we will be
567 allowed to do such call only after having generated a constructor of
568 the fish coinductive type.
570 We introduce `a` and `p`, and then return the fish constructor `cfish`.
571 Since the constructor accepts two arguments, the system asks for them.
574 The first one is a proof that `a ∈ U`. This can be proved using `H1` and `p`.
575 With the `nchange` tactic we change `H1` into an equivalent form (this step
576 can be skipped, since the system would be able to unfold the definition
577 of inclusion by itself)
580 It is now clear that `H1` can be applied. Again `napply` adds two
581 implicit arguments to `H1 ? ?`, obtaining a proof of `? ∈ U` given a proof
582 that `? ∈ P`. Thanks to unification, the system understands that `?` is actually
583 `a`, and it asks a proof that `a ∈ P`.
586 The `nassumption` tactic looks for the required proof in the context, and in
587 that cases finds it in the last context position.
589 We move now to the second branch of the proof, corresponding to the second
590 argument of the `cfish` constructor.
592 We introduce `i` and then we destruct `H2 a p i`, that being a proof
593 of an overlap predicate, give as an element and a proof that it is
594 both in `𝐂 a i` and `P`.
597 We then introduce `x`, break the conjunction (the `*;` command is the
598 equivalent of `ncases` but operates on the first hypothesis that can
599 be introduced. We then introduce the two sides of the conjunction.
602 The goal is now the existence of an a point in `𝐂 a i` fished by `U`.
603 We thus need to use the introduction rule for the existential quantifier.
604 In CIC it is a defined notion, that is an inductive type with just
605 one constructor (one introduction rule) holding the witness and the proof
606 that the witness satisfies a proposition.
610 Instead of trying to remember the name of the constructor, that should
611 be used as the argument of `napply`, we can ask the system to find by
612 itself the constructor name and apply it with the `@` tactic.
613 Note that some inductive predicates, like the disjunction, have multiple
614 introduction rules, and thus `@` can be followed by a number identifying
618 After choosing `x` as the witness, we have to prove a conjunction,
619 and we again apply the introduction rule for the inductively defined
623 The left hand side of the conjunction is trivial to prove, since it
624 is already in the context. The right hand side needs to perform
625 the co-recursive call.
628 The co-recursive call needs some arguments, but all of them live
629 in the context. Instead of explicitly mention them, we use the
630 `nassumption` tactic, that simply tries to apply every context item.
636 Subset of covered/fished points
637 -------------------------------
639 We now have to define the subset of `S` of points covered by `U`.
640 We also define a prefix notation for it. Remember that the precedence
641 of the prefix form of a symbol has to be lower than the precedence
646 ndefinition coverage : ∀A:Ax.∀U:Ω^A.Ω^A ≝ λA,U.{ a | a ◃ U }.
648 notation "◃U" non associative with precedence 55 for @{ 'coverage $U }.
650 interpretation "coverage cover" 'coverage U = (coverage ? U).
654 Here we define the equation characterizing the cover relation.
655 In the igft.ma file we proved that `◃U` is the minimum solution for
656 such equation, the interested reader should be able to reply the proof
661 ndefinition cover_equation : ∀A:Ax.∀U,X:Ω^A.CProp[0] ≝ λA,U,X.
662 ∀a.a ∈ X ↔ (a ∈ U ∨ ∃i:𝐈 a.∀y.y ∈ 𝐂 a i → y ∈ X).
664 ntheorem coverage_cover_equation : ∀A,U. cover_equation A U (◃U).
667 ##[ #bU; @1; nassumption;
668 ##| #i; #CaiU; #IH; @2; @ i; #c; #cCbi; ncases (IH ? cCbi);
670 ##| #_; napply CaiU; nassumption; ##] ##]
671 ##| ncases H; ##[ #E; @; nassumption]
672 *; #j; #Hj; @2 j; #w; #wC; napply Hj; nassumption;
676 ntheorem coverage_min_cover_equation :
677 ∀A,U,W. cover_equation A U W → ◃U ⊆ W.
678 #A; #U; #W; #H; #a; #aU; nelim aU; #b;
679 ##[ #bU; ncases (H b); #_; #H1; napply H1; @1; nassumption;
680 ##| #i; #CbiU; #IH; ncases (H b); #_; #H1; napply H1; @2; @i; napply IH;
686 We similarly define the subset of point fished by `F`, the
687 equation characterizing `⋉F` and prove that fish is
688 the biggest solution for such equation.
692 notation "⋉F" non associative with precedence 55
695 ndefinition fished : ∀A:Ax.∀F:Ω^A.Ω^A ≝ λA,F.{ a | a ⋉ F }.
697 interpretation "fished fish" 'fished F = (fished ? F).
699 ndefinition fish_equation : ∀A:Ax.∀F,X:Ω^A.CProp[0] ≝ λA,F,X.
700 ∀a. a ∈ X ↔ a ∈ F ∧ ∀i:𝐈 a.∃y.y ∈ 𝐂 a i ∧ y ∈ X.
702 ntheorem fished_fish_equation : ∀A,F. fish_equation A F (⋉F).
703 #A; #F; #a; @; (* *; non genera outtype che lega a *) #H; ncases H;
704 ##[ #b; #bF; #H2; @ bF; #i; ncases (H2 i); #c; *; #cC; #cF; @c; @ cC;
706 ##| #aF; #H1; @ aF; napply H1;
710 ntheorem fished_max_fish_equation : ∀A,F,G. fish_equation A F G → G ⊆ ⋉F.
711 #A; #F; #G; #H; #a; #aG; napply (fish_rec … aG);
712 #b; ncases (H b); #H1; #_; #bG; ncases (H1 bG); #E1; #E2; nassumption;
717 Part 2, the new set of axioms
718 -----------------------------
720 Since the name of objects (record included) has to unique
721 within the same script, we prefix every field name
722 in the new definition of the axiom set with `n`.
726 nrecord nAx : Type[2] ≝ {
729 nD: ∀a:nS. nI a → Type[0];
730 nd: ∀a:nS. ∀i:nI a. nD a i → nS
735 We again define a notation for the projections, making the
736 projected record an implicit argument. Note that since we already have
737 a notation for `𝐈` we just add another interpretation for it. The
738 system, looking at the argument of `𝐈`, will be able to use
739 the correct interpretation.
743 notation "𝐃 \sub ( ❨a,\emsp i❩ )" non associative with precedence 70 for @{ 'D $a $i }.
744 notation "𝐝 \sub ( ❨a,\emsp i,\emsp j❩ )" non associative with precedence 70 for @{ 'd $a $i $j}.
746 notation > "𝐃 term 90 a term 90 i" non associative with precedence 70 for @{ 'D $a $i }.
747 notation > "𝐝 term 90 a term 90 i term 90 j" non associative with precedence 70 for @{ 'd $a $i $j}.
749 interpretation "D" 'D a i = (nD ? a i).
750 interpretation "d" 'd a i j = (nd ? a i j).
751 interpretation "new I" 'I a = (nI ? a).
755 The paper defines the image as
757 > Im[d(a,i)] = { d(a,i,j) | j : D(a,i) }
759 but this not so formal notation poses some problems. The image is
760 often used as the left hand side of the ⊆ predicate
764 Of course this writing is interpreted by the authors as follows
766 > ∀j:D(a,i). d(a,i,j) ∈ V
768 If we need to use the image to define 𝐂 (a subset of S) we are obliged to
769 form a subset, i.e. to place a single variable `{ here | … }`.
771 > Im[d(a,i)] = { y | ∃j:D(a,i). y = d(a,i,j) }
773 This poses no theoretical problems, since `S` is a setoid and thus equipped
776 Unless we difene two different images, one for stating the image is ⊆ of
777 something and another one to define 𝐂, we end up using always the latter.
778 Thus the statement `Im[d(a,i)] ⊆ V` unfolds to
780 > ∀x:S. ( ∃j.x = d(a,i,j) ) → x ∈ V
782 That up to rewriting with the equation defining `x` is what we mean. The
783 technical problem arises when `V` is a complex construction that has to
784 be proved extensional (i.e. ∀x,y. x = y → x ∈ V → y ∈ V).
788 ndefinition image ≝ λA:nAx.λa:A.λi. { x | ∃j:𝐃 a i. x = 𝐝 a i j }.
790 notation > "𝐈𝐦 [𝐝 term 90 a term 90 i]" non associative with precedence 70 for @{ 'Im $a $i }.
791 notation "𝐈𝐦 [𝐝 \sub ( ❨a,\emsp i❩ )]" non associative with precedence 70 for @{ 'Im $a $i }.
793 interpretation "image" 'Im a i = (image ? a i).
797 Thanks to our definition of image, we ca trivially a function mapping a
798 new axiom set to an old one and viceversa. Note that in the second
799 definition, when defining 𝐝, the projection of the Σ type is inlined
800 (constructed on the fly by `*;`) while in the paper it was named `fst`.
804 ndefinition Ax_of_nAx : nAx → Ax.
805 #A; @ A (nI ?); #a; #i; napply (𝐈𝐦 [𝐝 a i]);
808 ndefinition nAx_of_Ax : Ax → nAx.
810 ##[ #a; #i; napply (Σx:A.x ∈ 𝐂 a i);
811 ##| #a; #i; *; #x; #_; napply x;
817 We then define the inductive type of ordinals, parametrized over an axiom
818 set. We also attach some notations to the constructors.
822 ninductive Ord (A : nAx) : Type[0] ≝
825 | oL : ∀a:A.∀i.∀f:𝐃 a i → Ord A. Ord A.
827 notation "0" non associative with precedence 90 for @{ 'oO }.
828 notation "Λ term 90 f" non associative with precedence 50 for @{ 'oL $f }.
829 notation "x+1" non associative with precedence 50 for @{'oS $x }.
831 interpretation "ordinals Zero" 'oO = (oO ?).
832 interpretation "ordinals Lambda" 'oL f = (oL ? ? ? f).
833 interpretation "ordinals Succ" 'oS x = (oS ? x).
837 The dfinition of `U_x` is by recursion over the ordinal `x`.
838 We thus define a recursive function. The `on x` directive tells
839 the system on which argument the function is (structurally) recursive.
841 In the `oS` case we use a local definition to name the recursive call
842 since it is used twice.
844 Note that Matita does not support notation in the left hand side
845 of a pattern match, and thus the names of the constructors have to
846 be spelled out verbatim.
850 nlet rec famU (A : nAx) (U : Ω^A) (x : Ord A) on x : Ω^A ≝
853 | oS y ⇒ let U_n ≝ famU A U y in U_n ∪ { x | ∃i.𝐈𝐦[𝐝 x i] ⊆ U_n}
854 | oL a i f ⇒ { x | ∃j.x ∈ famU A U (f j) } ].
856 notation < "term 90 U \sub (term 90 x)" non associative with precedence 50 for @{ 'famU $U $x }.
857 notation > "U ⎽ term 90 x" non associative with precedence 50 for @{ 'famU $U $x }.
859 interpretation "famU" 'famU U x = (famU ? U x).
863 We attach as the input notation for U_x the similar `U⎽x` where underscore,
864 that is a character valid for identifier names, has been replaced by `⎽` that is
865 not. The symbol `⎽` can act as a separator, and can be typed as an alternative
866 for `_` (i.e. pressing ALT-L after `_`).
868 The notion ◃(U) has to be defined as the subset of of y
869 belonging to U_x for some x. Moreover, we have to define the notion
870 of cover between sets again, since the one defined at the beginning
871 of the tutorial works only for the old axiom set definition.
875 ndefinition ord_coverage : ∀A:nAx.∀U:Ω^A.Ω^A ≝ λA,U.{ y | ∃x:Ord A. y ∈ famU ? U x }.
877 ndefinition ord_cover_set ≝ λc:∀A:nAx.Ω^A → Ω^A.λA,C,U.
878 ∀y.y ∈ C → y ∈ c A U.
880 interpretation "coverage new cover" 'coverage U = (ord_coverage ? U).
881 interpretation "new covers set" 'covers a U = (ord_cover_set ord_coverage ? a U).
882 interpretation "new covers" 'covers a U = (mem ? (ord_coverage ? U) a).
886 Before proving that this cover relation validates the reflexivity and infinity
887 rules, we prove this little technical lemma that is used in the proof for the
892 nlemma ord_subset: ∀A:nAx.∀a:A.∀i,f,U.∀j:𝐃 a i. U⎽(f j) ⊆ U⎽(Λ f).
893 #A; #a; #i; #f; #U; #j; #b; #bUf; @ j; nassumption;
898 The proof of infinity uses the following form of the Axiom of choice,
899 that cannot be prove inside Matita, since the existential quantifier
900 lives in the sort of predicative propositions while the sigma in the conclusion
901 lives in the sort of data types, and thus the former cannot be eliminated
902 to provide the second.
906 naxiom AC : ∀A,a,i,U.
907 (∀j:𝐃 a i.∃x:Ord A.𝐝 a i j ∈ U⎽x) → (Σf.∀j:𝐃 a i.𝐝 a i j ∈ U⎽(f j)).
911 In the proof of infinity, we have to rewrite under the ∈ predicate.
912 It is clearly possible to show that U⎽x is an extensional set:
914 > a = b → a ∈ U⎽x → b ∈ U⎽x
916 Anyway this proof in non trivial induction over x, that requires 𝐈 and 𝐃 to be
917 declared as morphisms. This poses to problem, but goes out of the scope of the
918 tutorial and we thus assume it.
922 naxiom U_x_is_ext: ∀A:nAx.∀a,b:A.∀x.∀U. a = b → b ∈ U⎽x → a ∈ U⎽x.
926 The reflexivity proof is trivial, it is enough to provide the ordinal 0
927 as a witness, then ◃(U) reduces to U by definition, hence the conclusion.
930 ntheorem new_coverage_reflexive: ∀A:nAx.∀U:Ω^A.∀a. a ∈ U → a ◃ U.
931 #A; #U; #a; #H; @ (0); napply H;
936 We now proceed with the proof of the infinity rule.
940 alias symbol "covers" = "new covers set".
941 alias symbol "covers" = "new covers".
942 alias symbol "covers" = "new covers set".
943 alias symbol "covers" = "new covers".
944 alias symbol "covers" = "new covers set".
945 alias symbol "covers" = "new covers".
946 alias symbol "covers" = "new covers set".
947 alias symbol "covers" = "new covers".
948 ntheorem new_coverage_infinity:
949 ∀A:nAx.∀U:Ω^A.∀a:A. (∃i:𝐈 a. 𝐈𝐦[𝐝 a i] ◃ U) → a ◃ U.
950 #A; #U; #a; (** screenshot "n-cov-inf-1". *)
951 *; #i; #H; nnormalize in H; (** screenshot "n-cov-inf-2". *)
952 ncut (∀y:𝐃 a i.∃x:Ord A.𝐝 a i y ∈ U⎽x); ##[ (** screenshot "n-cov-inf-3". *)
953 #z; napply H; @ z; napply #; ##] #H'; (** screenshot "n-cov-inf-4". *)
954 ncases (AC … H'); #f; #Hf; (** screenshot "n-cov-inf-5". *)
955 ncut (∀j.𝐝 a i j ∈ U⎽(Λ f));
956 ##[ #j; napply (ord_subset … f … (Hf j));##] #Hf';(** screenshot "n-cov-inf-6". *)
957 @ (Λ f+1); (** screenshot "n-cov-inf-7". *)
958 @2; (** screenshot "n-cov-inf-8". *)
959 @i; #x; *; #d; #Hd; (** screenshot "n-cov-inf-9". *)
960 napply (U_x_is_ext … Hd); napply Hf';
965 We eliminate the existential, obtaining an `i` and a proof that the
966 image of d(a,i) is covered by U. The `nnormalize` tactic computes the normal
967 form of `H`, thus expands the definition of cover between sets.
970 The paper proof considers `H` implicitly substitutes the equation assumed
971 by `H` in its conclusion. In Matita this step is not completely trivia.
972 We thus assert (`ncut`) the nicer form of `H`.
975 After introducing `z`, `H` can be applied (choosing `𝐝 a i z` as `y`).
976 What is the left to prove is that `∃j: 𝐃 a j. 𝐝 a i z = 𝐝 a i j`, that
977 becomes trivial is `j` is chosen to be `z`. In the command `napply #`,
978 the `#` is a standard notation for the reflexivity property of the equality.
981 Under `H'` the axiom of choice `AC` can be eliminated, obtaining the `f` and
982 its property. Note that the axiom `AC` was abstracted over `A,a,i,U` before
983 assuming `(∀j:𝐃 a i.∃x:Ord A.𝐝 a i j ∈ U⎽x)`. Thus the term that can be eliminated
984 is `AC ???? H'` where the system is able to infer every `?`. Matita provides
985 a facility to specify a number of `?` in a compact way, i.e. `…`. The system
986 expand `…` first to zero, then one, then two, three and finally four question
987 marks, "guessing" how may of them are needed.
990 The paper proof does now a forward reasoning step, deriving (by the ord_subset
991 lemma we proved above) `Hf'` i.e. 𝐝 a i j ∈ U⎽(Λf).
994 To prove that `a◃U` we have to exhibit the ordinal x such that `a ∈ U⎽x`.
997 The definition of `U⎽(…+1)` expands to the union of two sets, and proving
998 that `a ∈ X ∪ Y` is defined as proving that `a` is in `X` or `Y`. Applying
999 the second constructor `@2;` of the disjunction, we are left to prove that `a`
1000 belongs to the right hand side.
1003 We thus provide `i`, introduce the element being in the image and we are
1004 left to prove that it belongs to `U_(Λf)`. In the meanwhile, since belonging
1005 to the image means that there exists an object in the domain… we eliminate the
1006 existential, obtaining `d` (of type `𝐃 a i`) and the equation defining `x`.
1009 We just need to use the equational definition of `x` to obtain a conclusion
1010 that can be proved with `Hf'`. We assumed that `U⎽x` is extensional for
1011 every `x`, thus we are allowed to use `Hd` and close the proof.
1017 The next proof is that ◃(U) is mininal. The hardest part of the proof
1018 is to prepare the goal for the induction. The desiderata is to prove
1019 `U⎽o ⊆ V` by induction on `o`, but the conclusion of the lemma is,
1020 unfolding all definitions:
1022 > ∀x. x ∈ { y | ∃o:Ord A.y ∈ U⎽o } → x ∈ V
1026 nlemma new_coverage_min :
1027 ∀A:nAx.∀U:Ω^A.∀V.U ⊆ V → (∀a:A.∀i.𝐈𝐦[𝐝 a i] ⊆ V → a ∈ V) → ◃U ⊆ V.
1028 #A; #U; #V; #HUV; #Im;#b; (** screenshot "n-cov-min-2". *)
1029 *; #o; (** screenshot "n-cov-min-3". *)
1030 ngeneralize in match b; nchange with (U⎽o ⊆ V); (** screenshot "n-cov-min-4". *)
1031 nelim o; (** screenshot "n-cov-min-5". *)
1032 ##[ #b; #bU0; napply HUV; napply bU0;
1033 ##| #p; #IH; napply subseteq_union_l; ##[ nassumption; ##]
1034 #x; *; #i; #H; napply (Im ? i); napply (subseteq_trans … IH); napply H;
1035 ##| #a; #i; #f; #IH; #x; *; #d; napply IH; ##]
1040 After all the introductions, event the element hidden in the ⊆ definition,
1041 we have to eliminate the existential quantifier, obtaining the ordinal `o`
1044 What is left is almost right, but the element `b` is already in the
1045 context. We thus generalize every occurrence of `b` in
1046 the current goal, obtaining `∀c.c ∈ U⎽o → c ∈ V` that is `U⎽o ⊆ V`.
1049 We then proceed by induction on `o` obtaining the following goals
1052 All of them can be proved using simple set theoretic arguments,
1053 the induction hypothesis and the assumption `Im`.
1060 The notion `F⎽x` is again defined by recursion over the ordinal `x`.
1064 nlet rec famF (A: nAx) (F : Ω^A) (x : Ord A) on x : Ω^A ≝
1067 | oS o ⇒ let F_o ≝ famF A F o in F_o ∩ { x | ∀i:𝐈 x.∃j:𝐃 x i.𝐝 x i j ∈ F_o }
1068 | oL a i f ⇒ { x | ∀j:𝐃 a i.x ∈ famF A F (f j) }
1071 interpretation "famF" 'famU U x = (famF ? U x).
1073 ndefinition ord_fished : ∀A:nAx.∀F:Ω^A.Ω^A ≝ λA,F.{ y | ∀x:Ord A. y ∈ F⎽x }.
1075 interpretation "fished new fish" 'fished U = (ord_fished ? U).
1076 interpretation "new fish" 'fish a U = (mem ? (ord_fished ? U) a).
1080 The proof of compatibility uses this little result, that we
1081 proved outside the mail proof.
1084 nlemma co_ord_subset: ∀A:nAx.∀F:Ω^A.∀a,i.∀f:𝐃 a i → Ord A.∀j. F⎽(Λ f) ⊆ F⎽(f j).
1085 #A; #F; #a; #i; #f; #j; #x; #H; napply H;
1090 We assume the dual of the axiom of choice, as in the paper proof.
1093 naxiom AC_dual: ∀A:nAx.∀a:A.∀i,F.
1094 (∀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.
1098 Proving the anti-reflexivity property is simple, since the
1099 assumption `a ⋉ F` states that for every ordinal `x` (and thus also 0)
1100 `a ∈ F⎽x`. If `x` is choosen to be `0`, we obtain the thesis.
1103 ntheorem new_fish_antirefl: ∀A:nAx.∀F:Ω^A.∀a. a ⋉ F → a ∈ F.
1104 #A; #F; #a; #H; nlapply (H 0); #aFo; napply aFo;
1109 We now prove the compatibility property for the new fish relation.
1112 ntheorem new_fish_compatible:
1113 ∀A:nAx.∀F:Ω^A.∀a. a ⋉ F → ∀i:𝐈 a.∃j:𝐃 a i.𝐝 a i j ⋉ F.
1114 #A; #F; #a; #aF; #i; nnormalize; (** screenshot "n-f-compat-1". *)
1115 napply AC_dual; #f; (** screenshot "n-f-compat-2". *)
1116 nlapply (aF (Λf+1)); #aLf; (** screenshot "n-f-compat-3". *)
1118 (a ∈ F⎽(Λ f) ∧ ∀i:𝐈 a.∃j:𝐃 a i.𝐝 a i j ∈ F⎽(Λ f)); (** screenshot "n-f-compat-4". *)
1119 ncases aLf; #_; #H; nlapply (H i); (** screenshot "n-f-compat-5". *)
1120 *; #j; #Hj; @j; (** screenshot "n-f-compat-6". *)
1121 napply (co_ord_subset … Hj);
1126 After reducing to normal form the goal, we obseve it is exactly the conlusion of
1127 the dual axiom of choice we just assumed. We thus apply it ad introduce the
1131 The hypothesis `aF` states that `a⋉F⎽x` for every `x`, and we choose `Λf+1`.
1134 Since F_(Λf+1) is defined by recursion and we actually have a concrete input
1135 `Λf+1` for that recursive function, it can compute. Anyway, using the `nnormalize`
1136 tactic would reduce too much (both the `+1` and the `Λf` steps would be prformed);
1137 we thus explicitly give a convertible type for that hypothesis, corresponding
1138 the computation of the `+1` step, plus the unfolding of `∩`.
1141 We are interested in the right hand side of `aLf`, an in particular to
1142 its intance where the generic index in `𝐈 a` is `i`.
1145 We then eliminate the existential, obtaining `j` and its property `Hj`. We provide
1149 What is left to prove is exactly the `co_ord_subset` lemma we factored out
1156 The proof that `⋉(F)` is maximal is exactly the dual one of the
1157 minimality of `◃(U)`. Thus the main problem is to obtain `G ⊆ F⎽o`
1158 before doing the induction over `o`.
1160 Note that `G` is assumed to be of type `𝛀^A`, that means an extensional
1161 subset of `S`, while `Ω^A` means just a subset (note that the former is bold).
1164 ntheorem max_new_fished:
1165 ∀A:nAx.∀G:𝛀^A.∀F:Ω^A.G ⊆ F → (∀a.a ∈ G → ∀i.𝐈𝐦[𝐝 a i] ≬ G) → G ⊆ ⋉F.
1166 #A; #G; #F; #GF; #H; #b; #HbG; #o;
1167 ngeneralize in match HbG; ngeneralize in match b;
1168 nchange with (G ⊆ F⎽o);
1171 ##| #p; #IH; napply (subseteq_intersection_r … IH);
1172 #x; #Hx; #i; ncases (H … Hx i); #c; *; *; #d; #Ed; #cG;
1173 @d; napply IH; (** screenshot "n-f-max-1". *)
1174 alias symbol "prop2" = "prop21".
1175 napply (. Ed^-1‡#); napply cG;
1176 ##| #a; #i; #f; #Hf; nchange with (G ⊆ { y | ∀x. y ∈ F⎽(f x) });
1177 #b; #Hb; #d; napply (Hf d); napply Hb;
1183 Here the situacion look really similar to the one of the dual proof where
1184 we had to apply the assumption `U_x_is_ext`, but here the set is just `G`
1185 not `F_x`. Since we assumed `G` to be extensional we can employ the facilities
1186 Matita provides to perform rewriting in the general setting of setoids.
1188 The lemma `.` simply triggers the mechanism, and the given argument has to
1189 mimick the context under which the rewriting has to happen. In that case
1190 we want to rewrite to the left of the binary morphism `∈`. The infix notation
1191 to represent the context of a binary morphism is `‡`. The right hand side
1192 has to be left untouched, and the identity rewriting step is represented with
1193 `#` (actually a reflexivity proof for the subterm identified by the context).
1195 We want to rewrite the left hand side using `Ed` right-to-left (the default
1196 is left-to-right). We thus write `Ed^-1`, that is a proof that `𝐝 x i d = c`.
1198 The complete command is `napply (. Ed^-1‡#)` that has to be read like:
1200 > perform some rewritings under a binary morphism,
1201 > on the right do nothing,
1202 > on the left rewrite with Ed right-to-left.
1204 After the rewriting step the goal is exactly the `cG` assumption.
1210 <div id="appendix" class="anchor"></div>
1211 Appendix: tactics explanation
1212 -----------------------------
1214 In this appendix we try to give a description of tactics
1215 in terms of sequent calculus rules annotated with proofs.
1216 The `:` separator has to be read as _is a proof of_, in the spirit
1217 of the Curry-Howard isomorphism.
1219 Γ ⊢ f : A1 → … → An → B Γ ⊢ ?1 : A1 … ?n : An
1220 napply f; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1221 Γ ⊢ (f ?1 … ?n ) : B
1223 Γ ⊢ ? : F → B Γ ⊢ f : F
1224 nlapply f; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1229 #x; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1230 Γ ⊢ λx:T.? : ∀x:T.P(x)
1233 Γ ⊢ ?_i : args_i → P(k_i args_i)
1234 ncases x; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1235 Γ ⊢ match x with [ k1 args1 ⇒ ?_1 | … | kn argsn ⇒ ?_n ] : P(x)
1238 Γ ⊢ ?i : ∀t. P(t) → P(k_i … t …)
1239 nelim x; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1240 Γ ⊢ (T_rect_CProp0 ?_1 … ?_n) : P(x)
1242 Where `T_rect_CProp0` is the induction principle for the
1247 nchange with Q; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1250 Where the equivalence relation between types `≡` keeps into account
1251 β-reduction, δ-reduction (definition unfolding), ζ-reduction (local
1252 definition unfolding), ι-reduction (pattern matching simplification),
1253 μ-reduction (recursive function computation) and ν-reduction (co-fixpoint
1257 Γ; H : Q; Δ ⊢ ? : G Q ≡ P
1258 nchange in H with Q; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1262 Γ; H : Q; Δ ⊢ ? : G P →* Q
1263 nnormalize in H; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1266 Where `Q` is the normal form of `P` considering βδζιμν-reduction steps.
1270 nnormalize; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1274 Γ ⊢ ?_2 : T → G Γ ⊢ ?_1 : T
1275 ncut T; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1280 ngeneralize in match t; ⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼
1288 Last updated: $Date:$
1290 [1]: http://upsilon.cc/~zack/research/publications/notation.pdf