X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=weblib%2Ftutorial%2Fchapter7.ma;h=e37ec25e6d3689c0be83211ace41b47a3bb320e8;hb=a82d87a4c2ff9f518385fba7357dafb632a22882;hp=a4e3a861472a54c5c207646ecb2c0ffcd5067fa5;hpb=fc43587e06d59afb5b1c65904372843d928fdfe5;p=helm.git diff --git a/weblib/tutorial/chapter7.ma b/weblib/tutorial/chapter7.ma index a4e3a8614..e37ec25e6 100644 --- a/weblib/tutorial/chapter7.ma +++ b/weblib/tutorial/chapter7.ma @@ -8,7 +8,7 @@ include "tutorial/chapter6.ma". (* The type re of regular expressions over an alphabet $S$ is the smallest collection of objects generated by the following constructors: *) -inductive re (S: a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a) : Type[0] ≝ +img class="anchor" src="icons/tick.png" id="re"inductive re (S: a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a) : Type[0] ≝ z: re S (* empty: ∅ *) | e: re S (* epsilon: ϵ *) | s: S → re S (* symbol: a *) @@ -31,20 +31,20 @@ interpretation "empty" 'empty = (z ?). (* The language sem{e} associated with the regular expression e is inductively defined by the following function: *) -let rec in_l (S : a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a) (r : a href="cic:/matita/tutorial/chapter7/re.ind(1,0,1)"re/a S) on r : a href="cic:/matita/tutorial/chapter6/word.def(3)"word/a S → Prop ≝ +img class="anchor" src="icons/tick.png" id="in_l"let rec in_l (S : a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/aspan class="error" title="Parse error: RPAREN expected after [term] (in [arg])"/span) (r : a href="cic:/matita/tutorial/chapter7/re.ind(1,0,1)"re/a S) on r : a href="cic:/matita/tutorial/chapter6/word.def(3)"word/aspan class="error" title="Parse error: SYMBOL '≝' expected (in [let_defs])"/span S → Prop ≝ match r with [ z ⇒ a title="empty set" href="cic:/fakeuri.def(1)"∅/a -| e ⇒ a title="singleton" href="cic:/fakeuri.def(1)"{/aa title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a} -| s x ⇒ a title="singleton" href="cic:/fakeuri.def(1)"{/a (xa title="cons" href="cic:/fakeuri.def(1)":/a:a title="nil" href="cic:/fakeuri.def(1)"[/a]) } +| e ⇒ a title="singleton" href="cic:/fakeuri.def(1)"{/aa title="epsilon" href="cic:/fakeuri.def(1)"ϵ/aa title="singleton" href="cic:/fakeuri.def(1)"}/a +| s x ⇒ a title="singleton" href="cic:/fakeuri.def(1)"{/aspan class="error" title="Parse error: [ident] or [term level 19] expected after [sym{] (in [term])"/span (xa title="cons" href="cic:/fakeuri.def(1)":/aa title="cons" href="cic:/fakeuri.def(1)":/aa title="nil" href="cic:/fakeuri.def(1)"[/aa title="nil" href="cic:/fakeuri.def(1)"]/a) a title="singleton" href="cic:/fakeuri.def(1)"}/a | c r1 r2 ⇒ (in_l ? r1) a title="cat lang" href="cic:/fakeuri.def(1)"·/a (in_l ? r2) | o r1 r2 ⇒ (in_l ? r1) a title="union" href="cic:/fakeuri.def(1)"∪/a (in_l ? r2) -| k r1 ⇒ (in_l ? r1) a title="star lang" href="cic:/fakeuri.def(1)"^/a*]. +| k r1 ⇒ (in_l ? r1) a title="star lang" href="cic:/fakeuri.def(1)"^/aa title="star lang" href="cic:/fakeuri.def(1)"*/a]. notation "\sem{term 19 E}" non associative with precedence 75 for @{'in_l $E}. interpretation "in_l" 'in_l E = (in_l ? E). interpretation "in_l mem" 'mem w l = (in_l ? l w). -lemma rsem_star : ∀S.∀r: a href="cic:/matita/tutorial/chapter7/re.ind(1,0,1)"re/a S. a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{ra title="re star" href="cic:/fakeuri.def(1)"^/a*} a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{r}a title="star lang" href="cic:/fakeuri.def(1)"^/a*. +img class="anchor" src="icons/tick.png" id="rsem_star"lemma rsem_star : ∀S.∀r: a href="cic:/matita/tutorial/chapter7/re.ind(1,0,1)"re/a S. a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{ra title="re star" href="cic:/fakeuri.def(1)"^/aa title="re star" href="cic:/fakeuri.def(1)"*/aa title="in_l" href="cic:/fakeuri.def(1)"}/a a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{ra title="in_l" href="cic:/fakeuri.def(1)"}/aa title="star lang" href="cic:/fakeuri.def(1)"^/aa title="star lang" href="cic:/fakeuri.def(1)"*/a. // qed. @@ -78,7 +78,7 @@ formalization of the metatheory of programming languages. For our purposes, it i enough to mark positions preceding individual characters, so we shall have two kinds of characters •a (pp a) and a (ps a) according to the case a is pointed or not. *) -inductive pitem (S: a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a) : Type[0] ≝ +img class="anchor" src="icons/tick.png" id="pitem"inductive pitem (S: a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a) : Type[0] ≝ pz: pitem S (* empty *) | pe: pitem S (* epsilon *) | ps: S → pitem S (* symbol *) @@ -93,7 +93,7 @@ the end of the expression. As we shall see, pointed regular expressions can be understood as states of a DFA, and the boolean indicates if the state is final or not. *) -definition pre ≝ λS.a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S a title="Product" href="cic:/fakeuri.def(1)"×/a a href="cic:/matita/basics/bool/bool.ind(1,0,0)"bool/a. +img class="anchor" src="icons/tick.png" id="pre"definition pre ≝ λS.a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S a title="Product" href="cic:/fakeuri.def(1)"×/a a href="cic:/matita/basics/bool/bool.ind(1,0,0)"bool/a. interpretation "pitem star" 'star a = (pk ? a). interpretation "pitem or" 'plus a b = (po ? a b). @@ -109,27 +109,27 @@ interpretation "pitem empty" 'empty = (pz ?). removing all the points. Similarly, the carrier of a pointed regular expression is the carrier of its item. *) -let rec forget (S: a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a) (l : a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S) on l: a href="cic:/matita/tutorial/chapter7/re.ind(1,0,1)"re/a S ≝ +img class="anchor" src="icons/tick.png" id="forget"let rec forget (S: a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a) (l : a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S) on l: a href="cic:/matita/tutorial/chapter7/re.ind(1,0,1)"re/a S ≝ match l with [ pz ⇒ a href="cic:/matita/tutorial/chapter7/re.con(0,1,1)"z/a ? (* `∅ *) | pe ⇒ a title="re epsilon" href="cic:/fakeuri.def(1)"ϵ/a | ps x ⇒ a title="atom" href="cic:/fakeuri.def(1)"`/ax | pp x ⇒ a title="atom" href="cic:/fakeuri.def(1)"`/ax | pc E1 E2 ⇒ (forget ? E1) a title="re cat" href="cic:/fakeuri.def(1)"·/a (forget ? E2) - | po E1 E2 ⇒ (forget ? E1) a title="re or" href="cic:/fakeuri.def(1)"+/a (forget ? E2) - | pk E ⇒ (forget ? E)a title="re star" href="cic:/fakeuri.def(1)"^/a* ]. + | po E1 E2 ⇒ (forget ? E1) a title="re or" href="cic:/fakeuri.def(1)"+/aspan class="error" title="Parse error: [term] expected after [sym+] (in [term])"/span (forget ? E2) + | pk E ⇒ (forget ? E)a title="re star" href="cic:/fakeuri.def(1)"^/aa title="re star" href="cic:/fakeuri.def(1)"*/a ]. (* notation < "|term 19 e|" non associative with precedence 70 for @{'forget $e}.*) interpretation "forget" 'norm a = (forget ? a). -lemma erase_dot : ∀S.∀e1,e2:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. a title="forget" href="cic:/fakeuri.def(1)"|/ae1 a title="pitem cat" href="cic:/fakeuri.def(1)"·/a e2| a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a href="cic:/matita/tutorial/chapter7/re.con(0,4,1)"c/a ? (a title="forget" href="cic:/fakeuri.def(1)"|/ae1|) (a title="forget" href="cic:/fakeuri.def(1)"|/ae2|). +img class="anchor" src="icons/tick.png" id="erase_dot"lemma erase_dot : ∀S.∀e1,e2:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. a title="forget" href="cic:/fakeuri.def(1)"|/ae1 a title="pitem cat" href="cic:/fakeuri.def(1)"·/a e2a title="forget" href="cic:/fakeuri.def(1)"|/a a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a href="cic:/matita/tutorial/chapter7/re.con(0,4,1)"c/a ? (a title="forget" href="cic:/fakeuri.def(1)"|/ae1a title="forget" href="cic:/fakeuri.def(1)"|/a) (a title="forget" href="cic:/fakeuri.def(1)"|/ae2a title="forget" href="cic:/fakeuri.def(1)"|/a). // qed. -lemma erase_plus : ∀S.∀i1,i2:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. - a title="forget" href="cic:/fakeuri.def(1)"|/ai1 a title="pitem or" href="cic:/fakeuri.def(1)"+/a i2| a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="forget" href="cic:/fakeuri.def(1)"|/ai1| a title="re or" href="cic:/fakeuri.def(1)"+/a a title="forget" href="cic:/fakeuri.def(1)"|/ai2|. +img class="anchor" src="icons/tick.png" id="erase_plus"lemma erase_plus : ∀S.∀i1,i2:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. + a title="forget" href="cic:/fakeuri.def(1)"|/ai1 a title="pitem or" href="cic:/fakeuri.def(1)"+/a i2a title="forget" href="cic:/fakeuri.def(1)"|/a a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="forget" href="cic:/fakeuri.def(1)"|/ai1a title="forget" href="cic:/fakeuri.def(1)"|/a a title="re or" href="cic:/fakeuri.def(1)"+/a a title="forget" href="cic:/fakeuri.def(1)"|/ai2a title="forget" href="cic:/fakeuri.def(1)"|/a. // qed. -lemma erase_star : ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S.a title="forget" href="cic:/fakeuri.def(1)"|/aia title="pitem star" href="cic:/fakeuri.def(1)"^/a*| a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="forget" href="cic:/fakeuri.def(1)"|/ai|a title="re star" href="cic:/fakeuri.def(1)"^/a*. +img class="anchor" src="icons/tick.png" id="erase_star"lemma erase_star : ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S.a title="forget" href="cic:/fakeuri.def(1)"|/aia title="pitem star" href="cic:/fakeuri.def(1)"^/aa title="pitem star" href="cic:/fakeuri.def(1)"*/aa title="forget" href="cic:/fakeuri.def(1)"|/a a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="forget" href="cic:/fakeuri.def(1)"|/aia title="forget" href="cic:/fakeuri.def(1)"|/aa title="re star" href="cic:/fakeuri.def(1)"^/aa title="re star" href="cic:/fakeuri.def(1)"*/a. // qed. (* @@ -139,22 +139,22 @@ and enumerated. In particular, we can define a boolean equality beqitem and a pr beqitem_true that it refects propositional equality, enriching the set (pitem S) to a DeqSet. *) -let rec beqitem S (i1,i2: a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S) on i1 ≝ +img class="anchor" src="icons/tick.png" id="beqitem"let rec beqitem S (i1,i2: a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S) on i1 ≝ match i1 with [ pz ⇒ match i2 with [ pz ⇒ a href="cic:/matita/basics/bool/bool.con(0,1,0)"true/a | _ ⇒ a href="cic:/matita/basics/bool/bool.con(0,2,0)"false/a] | pe ⇒ match i2 with [ pe ⇒ a href="cic:/matita/basics/bool/bool.con(0,1,0)"true/a | _ ⇒ a href="cic:/matita/basics/bool/bool.con(0,2,0)"false/a] - | ps y1 ⇒ match i2 with [ ps y2 ⇒ y1a title="eqb" href="cic:/fakeuri.def(1)"=/a=y2 | _ ⇒ a href="cic:/matita/basics/bool/bool.con(0,2,0)"false/a] - | pp y1 ⇒ match i2 with [ pp y2 ⇒ y1a title="eqb" href="cic:/fakeuri.def(1)"=/a=y2 | _ ⇒ a href="cic:/matita/basics/bool/bool.con(0,2,0)"false/a] + | ps y1 ⇒ match i2 with [ ps y2 ⇒ y1a title="eqb" href="cic:/fakeuri.def(1)"=/aa title="eqb" href="cic:/fakeuri.def(1)"=/ay2 | _ ⇒ a href="cic:/matita/basics/bool/bool.con(0,2,0)"false/a] + | pp y1 ⇒ match i2 with [ pp y2 ⇒ y1a title="eqb" href="cic:/fakeuri.def(1)"=/aa title="eqb" href="cic:/fakeuri.def(1)"=/ay2 | _ ⇒ a href="cic:/matita/basics/bool/bool.con(0,2,0)"false/a] | po i11 i12 ⇒ match i2 with [ po i21 i22 ⇒ beqitem S i11 i21 a title="boolean and" href="cic:/fakeuri.def(1)"∧/a beqitem S i12 i22 - | _ ⇒ a href="cic:/matita/basics/bool/bool.con(0,2,0)"false/a] + | _ ⇒ a href="cic:/matita/basics/bool/bool.con(0,2,0)"false/aspan class="error" title="Parse error: SYMBOL '|' or SYMBOL ']' expected (in [term])"/span] | pc i11 i12 ⇒ match i2 with [ pc i21 i22 ⇒ beqitem S i11 i21 a title="boolean and" href="cic:/fakeuri.def(1)"∧/a beqitem S i12 i22 | _ ⇒ a href="cic:/matita/basics/bool/bool.con(0,2,0)"false/a] | pk i11 ⇒ match i2 with [ pk i21 ⇒ beqitem S i11 i21 | _ ⇒ a href="cic:/matita/basics/bool/bool.con(0,2,0)"false/a] ]. -lemma beqitem_true: ∀S,i1,i2. a href="cic:/matita/basics/logic/iff.def(1)"iff/a (a href="cic:/matita/tutorial/chapter7/beqitem.fix(0,1,4)"beqitem/a S i1 i2 a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a href="cic:/matita/basics/bool/bool.con(0,1,0)"true/a) (i1 a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a i2). +img class="anchor" src="icons/tick.png" id="beqitem_true"lemma beqitem_true: ∀S,i1,i2. a href="cic:/matita/basics/logic/iff.def(1)"iff/a (a href="cic:/matita/tutorial/chapter7/beqitem.fix(0,1,4)"beqitem/a S i1 i2 a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a href="cic:/matita/basics/bool/bool.con(0,1,0)"true/a) (i1 a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a i2). #S #i1 elim i1 [#i2 cases i2 [||#a|#a|#i21 #i22| #i21 #i22|#i3] % // normalize #H destruct |#i2 cases i2 [||#a|#a|#i21 #i22| #i21 #i22|#i3] % // normalize #H destruct @@ -184,7 +184,7 @@ lemma beqitem_true: ∀S,i1,i2. a href="cic:/matita/basics/logic/iff.def(1)"if ] qed. -definition DeqItem ≝ λS. +img class="anchor" src="icons/tick.png" id="DeqItem"definition DeqItem ≝ λS. a href="cic:/matita/tutorial/chapter4/DeqSet.con(0,1,0)"mk_DeqSet/a (a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S) (a href="cic:/matita/tutorial/chapter7/beqitem.fix(0,1,4)"beqitem/a S) (a href="cic:/matita/tutorial/chapter7/beqitem_true.def(5)"beqitem_true/a S). (* We also add a couple of unification hints to allow the type inference system @@ -207,57 +207,57 @@ The intuitive semantic of a point is to mark the position where we should start reading the regular expression. The language associated to a pre is the union of the languages associated with its points. *) -let rec in_pl (S : a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a) (r : a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S) on r : a href="cic:/matita/tutorial/chapter6/word.def(3)"word/a S → Prop ≝ +img class="anchor" src="icons/tick.png" id="in_pl"let rec in_pl (S : a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a) (r : a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S) on r : a href="cic:/matita/tutorial/chapter6/word.def(3)"word/a S → Prop ≝ match r with [ pz ⇒ a title="empty set" href="cic:/fakeuri.def(1)"∅/a | pe ⇒ a title="empty set" href="cic:/fakeuri.def(1)"∅/a | ps _ ⇒ a title="empty set" href="cic:/fakeuri.def(1)"∅/a -| pp x ⇒ a title="singleton" href="cic:/fakeuri.def(1)"{/a (xa title="cons" href="cic:/fakeuri.def(1)":/a:a title="nil" href="cic:/fakeuri.def(1)"[/a]) } -| pc r1 r2 ⇒ (in_pl ? r1) a title="cat lang" href="cic:/fakeuri.def(1)"·/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{a href="cic:/matita/tutorial/chapter7/forget.fix(0,1,3)"forget/a ? r2} a title="union" href="cic:/fakeuri.def(1)"∪/a (in_pl ? r2) +| pp x ⇒ a title="singleton" href="cic:/fakeuri.def(1)"{/a (xa title="cons" href="cic:/fakeuri.def(1)":/aa title="cons" href="cic:/fakeuri.def(1)":/aa title="nil" href="cic:/fakeuri.def(1)"[/aa title="nil" href="cic:/fakeuri.def(1)"]/a) a title="singleton" href="cic:/fakeuri.def(1)"}/a +| pc r1 r2 ⇒ (in_pl ? r1) a title="cat lang" href="cic:/fakeuri.def(1)"·/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{a href="cic:/matita/tutorial/chapter7/forget.fix(0,1,3)"forget/a ? r2a title="in_l" href="cic:/fakeuri.def(1)"}/a a title="union" href="cic:/fakeuri.def(1)"∪/aspan class="error" title="Parse error: [term] expected after [sym∪] (in [term])"/span (in_pl ? r2) | po r1 r2 ⇒ (in_pl ? r1) a title="union" href="cic:/fakeuri.def(1)"∪/a (in_pl ? r2) -| pk r1 ⇒ (in_pl ? r1) a title="cat lang" href="cic:/fakeuri.def(1)"·/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{a href="cic:/matita/tutorial/chapter7/forget.fix(0,1,3)"forget/a ? r1}a title="star lang" href="cic:/fakeuri.def(1)"^/a* ]. +| pk r1 ⇒ (in_pl ? r1) a title="cat lang" href="cic:/fakeuri.def(1)"·/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{a href="cic:/matita/tutorial/chapter7/forget.fix(0,1,3)"forget/a ? r1a title="in_l" href="cic:/fakeuri.def(1)"}/aa title="star lang" href="cic:/fakeuri.def(1)"^/aa title="star lang" href="cic:/fakeuri.def(1)"*/a ]. interpretation "in_pl" 'in_l E = (in_pl ? E). interpretation "in_pl mem" 'mem w l = (in_pl ? l w). -definition in_prl ≝ λS : a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a.λp:a href="cic:/matita/tutorial/chapter7/pre.def(1)"pre/a S. - if (a title="pair pi2" href="cic:/fakeuri.def(1)"\snd/a p) then a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{a title="pair pi1" href="cic:/fakeuri.def(1)"\fst/a p} a title="union" href="cic:/fakeuri.def(1)"∪/a a title="singleton" href="cic:/fakeuri.def(1)"{/aa title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a} else a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{a title="pair pi1" href="cic:/fakeuri.def(1)"\fst/a p}. +img class="anchor" src="icons/tick.png" id="in_prl"definition in_prl ≝ λS : a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a.λp:a href="cic:/matita/tutorial/chapter7/pre.def(1)"pre/a S. + if (a title="pair pi2" href="cic:/fakeuri.def(1)"\snd/a p) then a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{a title="pair pi1" href="cic:/fakeuri.def(1)"\fst/a pa title="in_pl" href="cic:/fakeuri.def(1)"}/a a title="union" href="cic:/fakeuri.def(1)"∪/a a title="singleton" href="cic:/fakeuri.def(1)"{/aa title="epsilon" href="cic:/fakeuri.def(1)"ϵ/aa title="singleton" href="cic:/fakeuri.def(1)"}/a else a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{a title="pair pi1" href="cic:/fakeuri.def(1)"\fst/a pa title="in_pl" href="cic:/fakeuri.def(1)"}/a. interpretation "in_prl mem" 'mem w l = (in_prl ? l w). interpretation "in_prl" 'in_l E = (in_prl ? E). (* The following, trivial lemmas are only meant for rewriting purposes. *) -lemma sem_pre_true : ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. - a title="in_prl" href="cic:/fakeuri.def(1)"\sem/a{a title="Pair construction" href="cic:/fakeuri.def(1)"〈/ai,a href="cic:/matita/basics/bool/bool.con(0,1,0)"true/a〉} a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i} a title="union" href="cic:/fakeuri.def(1)"∪/a a title="singleton" href="cic:/fakeuri.def(1)"{/aa title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a}. +img class="anchor" src="icons/tick.png" id="sem_pre_true"lemma sem_pre_true : ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. + a title="in_prl" href="cic:/fakeuri.def(1)"\sem/a{a title="Pair construction" href="cic:/fakeuri.def(1)"〈/ai,a href="cic:/matita/basics/bool/bool.con(0,1,0)"true/aa title="Pair construction" href="cic:/fakeuri.def(1)"〉/aa title="in_prl" href="cic:/fakeuri.def(1)"}/a a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{ia title="in_pl" href="cic:/fakeuri.def(1)"}/a a title="union" href="cic:/fakeuri.def(1)"∪/a a title="singleton" href="cic:/fakeuri.def(1)"{/aa title="epsilon" href="cic:/fakeuri.def(1)"ϵ/aa title="singleton" href="cic:/fakeuri.def(1)"}/a. // qed. -lemma sem_pre_false : ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. - a title="in_prl" href="cic:/fakeuri.def(1)"\sem/a{a title="Pair construction" href="cic:/fakeuri.def(1)"〈/ai,a href="cic:/matita/basics/bool/bool.con(0,2,0)"false/a〉} a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i}. +img class="anchor" src="icons/tick.png" id="sem_pre_false"lemma sem_pre_false : ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. + a title="in_prl" href="cic:/fakeuri.def(1)"\sem/a{a title="Pair construction" href="cic:/fakeuri.def(1)"〈/ai,a href="cic:/matita/basics/bool/bool.con(0,2,0)"false/aa title="Pair construction" href="cic:/fakeuri.def(1)"〉/aa title="in_prl" href="cic:/fakeuri.def(1)"}/a a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{ia title="in_pl" href="cic:/fakeuri.def(1)"}/a. // qed. -lemma sem_cat: ∀S.∀i1,i2:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. - a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1 a title="pitem cat" href="cic:/fakeuri.def(1)"·/a i2} a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1} a title="cat lang" href="cic:/fakeuri.def(1)"·/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{a title="forget" href="cic:/fakeuri.def(1)"|/ai2|} a title="union" href="cic:/fakeuri.def(1)"∪/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i2}. +img class="anchor" src="icons/tick.png" id="sem_cat"lemma sem_cat: ∀S.∀i1,i2:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. + a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1 a title="pitem cat" href="cic:/fakeuri.def(1)"·/a i2a title="in_pl" href="cic:/fakeuri.def(1)"}/a a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1a title="in_pl" href="cic:/fakeuri.def(1)"}/a a title="cat lang" href="cic:/fakeuri.def(1)"·/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{a title="forget" href="cic:/fakeuri.def(1)"|/ai2a title="forget" href="cic:/fakeuri.def(1)"|/aa title="in_l" href="cic:/fakeuri.def(1)"}/a a title="union" href="cic:/fakeuri.def(1)"∪/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i2a title="in_pl" href="cic:/fakeuri.def(1)"}/a. // qed. -lemma sem_cat_w: ∀S.∀i1,i2:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S.∀w. - a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1 a title="pitem cat" href="cic:/fakeuri.def(1)"·/a i2} w a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a ((a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1} a title="cat lang" href="cic:/fakeuri.def(1)"·/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{a title="forget" href="cic:/fakeuri.def(1)"|/ai2|}) w a title="logical or" href="cic:/fakeuri.def(1)"∨/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i2} w). +img class="anchor" src="icons/tick.png" id="sem_cat_w"lemma sem_cat_w: ∀S.∀i1,i2:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S.∀w. + a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1 a title="pitem cat" href="cic:/fakeuri.def(1)"·/a i2a title="in_pl" href="cic:/fakeuri.def(1)"}/a w a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a ((a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1a title="in_pl" href="cic:/fakeuri.def(1)"}/a a title="cat lang" href="cic:/fakeuri.def(1)"·/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{a title="forget" href="cic:/fakeuri.def(1)"|/ai2a title="forget" href="cic:/fakeuri.def(1)"|/aa title="in_l" href="cic:/fakeuri.def(1)"}/a) w a title="logical or" href="cic:/fakeuri.def(1)"∨/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i2a title="in_pl" href="cic:/fakeuri.def(1)"}/a w). // qed. -lemma sem_plus: ∀S.∀i1,i2:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. - a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1 a title="pitem or" href="cic:/fakeuri.def(1)"+/a i2} a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1} a title="union" href="cic:/fakeuri.def(1)"∪/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i2}. +img class="anchor" src="icons/tick.png" id="sem_plus"lemma sem_plus: ∀S.∀i1,i2:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. + a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1 a title="pitem or" href="cic:/fakeuri.def(1)"+/a i2a title="in_pl" href="cic:/fakeuri.def(1)"}/a a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1a title="in_pl" href="cic:/fakeuri.def(1)"}/a a title="union" href="cic:/fakeuri.def(1)"∪/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i2a title="in_pl" href="cic:/fakeuri.def(1)"}/a. // qed. -lemma sem_plus_w: ∀S.∀i1,i2:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S.∀w. - a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1 a title="pitem or" href="cic:/fakeuri.def(1)"+/a i2} w a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a (a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1} w a title="logical or" href="cic:/fakeuri.def(1)"∨/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i2} w). +img class="anchor" src="icons/tick.png" id="sem_plus_w"lemma sem_plus_w: ∀S.∀i1,i2:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S.∀w. + a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1 a title="pitem or" href="cic:/fakeuri.def(1)"+/a i2a title="in_pl" href="cic:/fakeuri.def(1)"}/a w a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a (a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i1a title="in_pl" href="cic:/fakeuri.def(1)"}/a w a title="logical or" href="cic:/fakeuri.def(1)"∨/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i2a title="in_pl" href="cic:/fakeuri.def(1)"}/a w). // qed. -lemma sem_star : ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. - a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{ia title="pitem star" href="cic:/fakeuri.def(1)"^/a*} a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i} a title="cat lang" href="cic:/fakeuri.def(1)"·/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{a title="forget" href="cic:/fakeuri.def(1)"|/ai|}a title="star lang" href="cic:/fakeuri.def(1)"^/a*. +img class="anchor" src="icons/tick.png" id="sem_star"lemma sem_star : ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. + a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{ia title="pitem star" href="cic:/fakeuri.def(1)"^/aa title="pitem star" href="cic:/fakeuri.def(1)"*/aa title="in_pl" href="cic:/fakeuri.def(1)"}/a a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{ia title="in_pl" href="cic:/fakeuri.def(1)"}/a a title="cat lang" href="cic:/fakeuri.def(1)"·/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{a title="forget" href="cic:/fakeuri.def(1)"|/aia title="forget" href="cic:/fakeuri.def(1)"|/aa title="in_l" href="cic:/fakeuri.def(1)"}/aa title="star lang" href="cic:/fakeuri.def(1)"^/aa title="star lang" href="cic:/fakeuri.def(1)"*/a. // qed. -lemma sem_star_w : ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S.∀w. - a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{ia title="pitem star" href="cic:/fakeuri.def(1)"^/a*} w a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a (a title="exists" href="cic:/fakeuri.def(1)"∃/aw1,w2.w1 a title="append" href="cic:/fakeuri.def(1)"@/a w2 a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a w a title="logical and" href="cic:/fakeuri.def(1)"∧/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i} w1 a title="logical and" href="cic:/fakeuri.def(1)"∧/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{a title="forget" href="cic:/fakeuri.def(1)"|/ai|}a title="star lang" href="cic:/fakeuri.def(1)"^/a* w2). +img class="anchor" src="icons/tick.png" id="sem_star_w"lemma sem_star_w : ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S.∀w. + a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{ia title="pitem star" href="cic:/fakeuri.def(1)"^/aa title="pitem star" href="cic:/fakeuri.def(1)"*/aa title="in_pl" href="cic:/fakeuri.def(1)"}/a w a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a (a title="exists" href="cic:/fakeuri.def(1)"∃/aw1,w2a title="exists" href="cic:/fakeuri.def(1)"./aw1 a title="append" href="cic:/fakeuri.def(1)"@/a w2 a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a w a title="logical and" href="cic:/fakeuri.def(1)"∧/a a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{ia title="in_pl" href="cic:/fakeuri.def(1)"}/a w1 a title="logical and" href="cic:/fakeuri.def(1)"∧/a a title="in_l" href="cic:/fakeuri.def(1)"\sem/a{a title="forget" href="cic:/fakeuri.def(1)"|/aia title="forget" href="cic:/fakeuri.def(1)"|/aa title="in_l" href="cic:/fakeuri.def(1)"}/aa title="star lang" href="cic:/fakeuri.def(1)"^/aa title="star lang" href="cic:/fakeuri.def(1)"*/a w2). // qed. (* Below are a few, simple, semantic properties of items. In particular: @@ -268,10 +268,10 @@ lemma sem_star_w : ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1, The first property is proved by a simple induction on $i$; the other results are easy corollaries. We need an auxiliary lemma first. *) -lemma append_eq_nil : ∀S.∀w1,w2:a href="cic:/matita/tutorial/chapter6/word.def(3)"word/a S. w1 a title="append" href="cic:/fakeuri.def(1)"@/a w2 a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a → w1 a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a. +img class="anchor" src="icons/tick.png" id="append_eq_nil"lemma append_eq_nil : ∀S.∀w1,w2:a href="cic:/matita/tutorial/chapter6/word.def(3)"word/a S. w1 a title="append" href="cic:/fakeuri.def(1)"@/a w2 a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a → w1 a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a. #S #w1 #w2 cases w1 // #a #tl normalize #H destruct qed. -lemma not_epsilon_lp : ∀S:a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a.∀e:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. a title="logical not" href="cic:/fakeuri.def(1)"¬/a (a title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a a title="in_pl mem" href="cic:/fakeuri.def(1)"∈/a e). +img class="anchor" src="icons/tick.png" id="not_epsilon_lp"lemma not_epsilon_lp : ∀S:a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1,0,0)"DeqSet/a.∀e:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. a title="logical not" href="cic:/fakeuri.def(1)"¬/a (a title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a a title="in_pl mem" href="cic:/fakeuri.def(1)"∈/a e). #S #e elim e normalize /span class="autotactic"2span class="autotrace" trace a href="cic:/matita/basics/logic/Not.con(0,1,1)"nmk/a/span/span/ [#r1 #r2 * #n1 #n2 % * /span class="autotactic"2span class="autotrace" trace a href="cic:/matita/basics/logic/absurd.def(2)"absurd/a/span/span/ * #w1 * #w2 * * #H >(a href="cic:/matita/tutorial/chapter7/append_eq_nil.def(4)"append_eq_nil/a …H…) /span class="autotactic"2span class="autotrace" trace /span/span/ @@ -280,22 +280,22 @@ lemma not_epsilon_lp : ∀S:a href="cic:/matita/tutorial/chapter4/DeqSet.ind(1, ] qed. -lemma epsilon_to_true : ∀S.∀e:a href="cic:/matita/tutorial/chapter7/pre.def(1)"pre/a S. a title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a a title="in_prl mem" href="cic:/fakeuri.def(1)"∈/a e → a title="pair pi2" href="cic:/fakeuri.def(1)"\snd/a e a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a href="cic:/matita/basics/bool/bool.con(0,1,0)"true/a. +img class="anchor" src="icons/tick.png" id="epsilon_to_true"lemma epsilon_to_true : ∀S.∀e:a href="cic:/matita/tutorial/chapter7/pre.def(1)"pre/a S. a title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a a title="in_prl mem" href="cic:/fakeuri.def(1)"∈/a e → a title="pair pi2" href="cic:/fakeuri.def(1)"\snd/a e a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a href="cic:/matita/basics/bool/bool.con(0,1,0)"true/a. #S * #i #b cases b // normalize #H @a href="cic:/matita/basics/logic/False_ind.fix(0,1,1)"False_ind/a /span class="autotactic"2span class="autotrace" trace a href="cic:/matita/basics/logic/absurd.def(2)"absurd/a/span/span/ qed. -lemma true_to_epsilon : ∀S.∀e:a href="cic:/matita/tutorial/chapter7/pre.def(1)"pre/a S. a title="pair pi2" href="cic:/fakeuri.def(1)"\snd/a e a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a href="cic:/matita/basics/bool/bool.con(0,1,0)"true/a → a title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a a title="in_prl mem" href="cic:/fakeuri.def(1)"∈/a e. +img class="anchor" src="icons/tick.png" id="true_to_epsilon"lemma true_to_epsilon : ∀S.∀e:a href="cic:/matita/tutorial/chapter7/pre.def(1)"pre/a S. a title="pair pi2" href="cic:/fakeuri.def(1)"\snd/a e a title="leibnitz's equality" href="cic:/fakeuri.def(1)"=/a a href="cic:/matita/basics/bool/bool.con(0,1,0)"true/a → a title="epsilon" href="cic:/fakeuri.def(1)"ϵ/a a title="in_prl mem" href="cic:/fakeuri.def(1)"∈/a e. #S * #i #b #btrue normalize in btrue; >btrue %2 // qed. -lemma minus_eps_item: ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i} a title="extensional equality" href="cic:/fakeuri.def(1)"=/a1 a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{i}a title="substraction" href="cic:/fakeuri.def(1)"-/aa title="singleton" href="cic:/fakeuri.def(1)"{/aa title="nil" href="cic:/fakeuri.def(1)"[/a ]}. +img class="anchor" src="icons/tick.png" id="minus_eps_item"lemma minus_eps_item: ∀S.∀i:a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S. a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{ia title="in_pl" href="cic:/fakeuri.def(1)"}/a a title="extensional equality" href="cic:/fakeuri.def(1)"=/a1 a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{ia title="in_pl" href="cic:/fakeuri.def(1)"}/aa title="substraction" href="cic:/fakeuri.def(1)"-/aa title="singleton" href="cic:/fakeuri.def(1)"{/aa title="nil" href="cic:/fakeuri.def(1)"[/a a title="nil" href="cic:/fakeuri.def(1)"]/aa title="singleton" href="cic:/fakeuri.def(1)"}/a. #S #i #w % [#H whd % // normalize @(a href="cic:/matita/basics/logic/not_to_not.def(3)"not_to_not/a … (a href="cic:/matita/tutorial/chapter7/not_epsilon_lp.def(8)"not_epsilon_lp/a …i)) // |* // ] qed. -lemma minus_eps_pre: ∀S.∀e:a href="cic:/matita/tutorial/chapter7/pre.def(1)"pre/a S. a title="in_pl" href="cic:/fakeuri.def(1)"\sem/a{a title="pair pi1" href="cic:/fakeuri.def(1)"\fst/a e} a title="extensional equality" href="cic:/fakeuri.def(1)"=/a1 a title="in_prl" href="cic:/fakeuri.def(1)"\sem/a{e}a title="substraction" href="cic:/fakeuri.def(1)"-/aa title="singleton" href="cic:/fakeuri.def(1)"{/aa title="nil" href="cic:/fakeuri.def(1)"[/a ]}. +img class="anchor" src="icons/tick.png" id="minus_eps_pre"lemma minus_eps_pre: ∀S.∀e:a href="cic:/matita/tutorial/chapter7/pre.def(1)"pre/a S. a title="in_pl" href="cic:/fakeuri.def(1)"\sem/aspan class="error" title="Parse error: [sym{] expected after [sym\sem ] (in [term])"/span{a title="pair pi1" href="cic:/fakeuri.def(1)"\fst/a ea title="in_pl" href="cic:/fakeuri.def(1)"}/a a title="extensional equality" href="cic:/fakeuri.def(1)"=/a1 a title="in_prl" href="cic:/fakeuri.def(1)"\sem/a{ea title="in_prl" href="cic:/fakeuri.def(1)"}/aa title="substraction" href="cic:/fakeuri.def(1)"-/aa title="singleton" href="cic:/fakeuri.def(1)"{/aa title="nil" href="cic:/fakeuri.def(1)"[/a a title="nil" href="cic:/fakeuri.def(1)"]/aa title="singleton" href="cic:/fakeuri.def(1)"}/a. #S * #i * [>a href="cic:/matita/tutorial/chapter7/sem_pre_true.def(9)"sem_pre_true/a normalize in ⊢ (??%?); #w % [/span class="autotactic"3span class="autotrace" trace a href="cic:/matita/basics/logic/Or.con(0,1,2)"or_introl/a, a href="cic:/matita/basics/logic/And.con(0,1,2)"conj/a, a href="cic:/matita/basics/logic/not_to_not.def(3)"not_to_not/a/span/span/ | * * // #H1 #H2 @a href="cic:/matita/basics/logic/False_ind.fix(0,1,1)"False_ind/a @(a href="cic:/matita/basics/logic/absurd.def(2)"absurd/a …H1 H2)]