From e93fda0eb50a6761c1f91807db400f15d04b845e Mon Sep 17 00:00:00 2001 From: matitaweb Date: Fri, 2 Mar 2012 09:42:52 +0000 Subject: [PATCH] commit by user andrea --- weblib/tutorial/chapter7.ma | 187 ++++++++++++++++++------------------ 1 file changed, 95 insertions(+), 92 deletions(-) diff --git a/weblib/tutorial/chapter7.ma b/weblib/tutorial/chapter7.ma index b9a35a8ad..2b3df9064 100644 --- a/weblib/tutorial/chapter7.ma +++ b/weblib/tutorial/chapter7.ma @@ -1,4 +1,5 @@ -(*

Regular Expressions

+(* +h1Regular Expressions /h1 We shall apply all the previous machinery to the study of regular languages and the constructions of the associated finite automata. *) @@ -30,11 +31,11 @@ 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/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 ≝ +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 ≝ match r with -[ z ⇒ a title="empty set" href="cic:/fakeuri.def(1)"∅/aspan class="error" title="Parse error: SYMBOL '|' or SYMBOL ']' expected (in [term])"/span +[ 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)"{/aspan class="error" title="Parse error: [ident] or [term level 19] expected after [sym{] (in [term])"/spana title="cons" href="cic:/fakeuri.def(1)"[/aspan class="error" title="Parse error: [term] expected after [sym[] (in [term])"/spanx]} +| 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]) } | 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*]. @@ -47,7 +48,8 @@ lemma rsem_star : ∀S.∀r: a href="cic:/matita/tutorial/chapter7/re.ind(1,0,1 // qed. -(*

Pointed Regular expressions

+(* +h2Pointed Regular expressions /h2 We now introduce pointed regular expressions, that are the main tool we shall use for the construction of the automaton. A pointed regular expression is just a regular expression internally labelled @@ -107,153 +109,155 @@ 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: DeqSet) (l : pitem S) on l: re S ≝ +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 ⇒ `∅ - | pe ⇒ ϵ - | ps x ⇒ `x - | pp x ⇒ `x - | pc E1 E2 ⇒ (forget ? E1) · (forget ? E2) - | po E1 E2 ⇒ (forget ? E1) + (forget ? E2) - | pk E ⇒ (forget ? E)^* ]. + [ 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* ]. (* notation < "|term 19 e|" non associative with precedence 70 for @{'forget $e}.*) interpretation "forget" 'norm a = (forget ? a). -lemma erase_dot : ∀S.∀e1,e2:pitem S. |e1 · e2| = c ? (|e1|) (|e2|). +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|). // qed. -lemma erase_plus : ∀S.∀i1,i2:pitem S. - |i1 + i2| = |i1| + |i2|. +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|. // qed. -lemma erase_star : ∀S.∀i:pitem S.|i^*| = |i|^*. +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*. // qed. -(*

Comparing items and pres

+(* +h2Comparing items and pres/h2 Items and pres are very concrete datatypes: they can be effectively compared, and enumerated. In particular, we can define a boolean equality beqitem and a proof beqitem_true that it refects propositional equality, enriching the set (pitem S) to a DeqSet. *) -let rec beqitem S (i1,i2: pitem S) on i1 ≝ +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 ⇒ true | _ ⇒ false] - | pe ⇒ match i2 with [ pe ⇒ true | _ ⇒ false] - | ps y1 ⇒ match i2 with [ ps y2 ⇒ y1==y2 | _ ⇒ false] - | pp y1 ⇒ match i2 with [ pp y2 ⇒ y1==y2 | _ ⇒ false] + [ 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] | po i11 i12 ⇒ match i2 with - [ po i21 i22 ⇒ beqitem S i11 i21 ∧ beqitem S i12 i22 - | _ ⇒ false] + [ 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] | pc i11 i12 ⇒ match i2 with - [ pc i21 i22 ⇒ beqitem S i11 i21 ∧ beqitem S i12 i22 - | _ ⇒ false] - | pk i11 ⇒ match i2 with [ pk i21 ⇒ beqitem S i11 i21 | _ ⇒ false] + [ 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. iff (beqitem S i1 i2 = true) (i1 = i2). +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 |#x #i2 cases i2 [||#a|#a|#i21 #i22| #i21 #i22|#i3] % normalize #H destruct - [>(\P H) // | @(\b (refl …))] + [>(\P H) // | @(\b (a href="cic:/matita/basics/logic/eq.con(0,1,2)"refl/a …))] |#x #i2 cases i2 [||#a|#a|#i21 #i22| #i21 #i22|#i3] % normalize #H destruct - [>(\P H) // | @(\b (refl …))] + [>(\P H) // | @(\b (a href="cic:/matita/basics/logic/eq.con(0,1,2)"refl/a …))] |#i11 #i12 #Hind1 #Hind2 #i2 cases i2 [||#a|#a|#i21 #i22| #i21 #i22|#i3] % normalize #H destruct - [cases (true_or_false (beqitem S i11 i21)) #H1 - [>(proj1 … (Hind1 i21) H1) >(proj1 … (Hind2 i22)) // >H1 in H; #H @H - |>H1 in H; normalize #abs @False_ind /2/ + [cases (a href="cic:/matita/basics/bool/true_or_false.def(1)"true_or_false/a (a href="cic:/matita/tutorial/chapter7/beqitem.fix(0,1,4)"beqitem/a S i11 i21)) #H1 + [>(a href="cic:/matita/basics/logic/proj1.def(2)"proj1/a … (Hind1 i21) H1) >(a href="cic:/matita/basics/logic/proj1.def(2)"proj1/a … (Hind2 i22)) // >H1 in H; #H @H + |>H1 in H; normalize #abs @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/ ] - |>(proj2 … (Hind1 i21) (refl …)) >(proj2 … (Hind2 i22) (refl …)) // + |>(a href="cic:/matita/basics/logic/proj2.def(2)"proj2/a … (Hind1 i21) (a href="cic:/matita/basics/logic/eq.con(0,1,2)"refl/a …)) >(a href="cic:/matita/basics/logic/proj2.def(2)"proj2/a … (Hind2 i22) (a href="cic:/matita/basics/logic/eq.con(0,1,2)"refl/a …)) // ] |#i11 #i12 #Hind1 #Hind2 #i2 cases i2 [||#a|#a|#i21 #i22| #i21 #i22|#i3] % normalize #H destruct - [cases (true_or_false (beqitem S i11 i21)) #H1 - [>(proj1 … (Hind1 i21) H1) >(proj1 … (Hind2 i22)) // >H1 in H; #H @H - |>H1 in H; normalize #abs @False_ind /2/ + [cases (a href="cic:/matita/basics/bool/true_or_false.def(1)"true_or_false/a (a href="cic:/matita/tutorial/chapter7/beqitem.fix(0,1,4)"beqitem/a S i11 i21)) #H1 + [>(a href="cic:/matita/basics/logic/proj1.def(2)"proj1/a … (Hind1 i21) H1) >(a href="cic:/matita/basics/logic/proj1.def(2)"proj1/a … (Hind2 i22)) // >H1 in H; #H @H + |>H1 in H; normalize #abs @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/ ] - |>(proj2 … (Hind1 i21) (refl …)) >(proj2 … (Hind2 i22) (refl …)) // + |>(a href="cic:/matita/basics/logic/proj2.def(2)"proj2/a … (Hind1 i21) (a href="cic:/matita/basics/logic/eq.con(0,1,2)"refl/a …)) >(a href="cic:/matita/basics/logic/proj2.def(2)"proj2/a … (Hind2 i22) (a href="cic:/matita/basics/logic/eq.con(0,1,2)"refl/a …)) // ] |#i3 #Hind #i2 cases i2 [||#a|#a|#i21 #i22| #i21 #i22|#i4] % normalize #H destruct - [>(proj1 … (Hind i4) H) // |>(proj2 … (Hind i4) (refl …)) //] + [>(a href="cic:/matita/basics/logic/proj1.def(2)"proj1/a … (Hind i4) H) // |>(a href="cic:/matita/basics/logic/proj2.def(2)"proj2/a … (Hind i4) (a href="cic:/matita/basics/logic/eq.con(0,1,2)"refl/a …)) //] ] qed. definition DeqItem ≝ λS. - mk_DeqSet (pitem S) (beqitem S) (beqitem_true 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 to look at (pitem S) as the carrier of a DeqSet, and at beqitem as if it was the equality function of a DeqSet. *) -unification hint 0 ≔ S; - X ≟ mk_DeqSet (pitem S) (beqitem S) (beqitem_true S) +unification hint 0 a href="cic:/fakeuri.def(1)" title="hint_decl_Type1"≔/a S; + X ≟ 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) (* ---------------------------------------- *) ⊢ - pitem S ≡ carr X. + a href="cic:/matita/tutorial/chapter7/pitem.ind(1,0,1)"pitem/a S ≡ a href="cic:/matita/tutorial/chapter4/carr.fix(0,0,2)"carr/a X. -unification hint 0 ≔ S,i1,i2; - X ≟ mk_DeqSet (pitem S) (beqitem S) (beqitem_true S) +unification hint 0 a href="cic:/fakeuri.def(1)" title="hint_decl_Type0"≔/a S,i1,i2; + X ≟ 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) (* ---------------------------------------- *) ⊢ - beqitem S i1 i2 ≡ eqb X i1 i2. + a href="cic:/matita/tutorial/chapter7/beqitem.fix(0,1,4)"beqitem/a S i1 i2 ≡ a href="cic:/matita/tutorial/chapter4/eqb.fix(0,0,3)"eqb/a X i1 i2. -(*

Semantics of pointed regular expression

+(* +h2Semantics of pointed regular expression/h2 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 : DeqSet) (r : pitem S) on r : word S → Prop ≝ +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 ⇒ ∅ -| pe ⇒ ∅ -| ps _ ⇒ ∅ -| pp x ⇒ { [x] } -| pc r1 r2 ⇒ (in_pl ? r1) · \sem{forget ? r2} ∪ (in_pl ? r2) -| po r1 r2 ⇒ (in_pl ? r1) ∪ (in_pl ? r2) -| pk r1 ⇒ (in_pl ? r1) · \sem{forget ? r1}^* ]. +[ 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) +| 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* ]. interpretation "in_pl" 'in_l E = (in_pl ? E). interpretation "in_pl mem" 'mem w l = (in_pl ? l w). -definition in_prl ≝ λS : DeqSet.λp:pre S. - if (\snd p) then \sem{\fst p} ∪ {ϵ} else \sem{\fst p}. +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}. 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:pitem S. - \sem{〈i,true〉} = \sem{i} ∪ {ϵ}. +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}. // qed. -lemma sem_pre_false : ∀S.∀i:pitem S. - \sem{〈i,false〉} = \sem{i}. +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}. // qed. -lemma sem_cat: ∀S.∀i1,i2:pitem S. - \sem{i1 · i2} = \sem{i1} · \sem{|i2|} ∪ \sem{i2}. +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}. // qed. -lemma sem_cat_w: ∀S.∀i1,i2:pitem S.∀w. - \sem{i1 · i2} w = ((\sem{i1} · \sem{|i2|}) w ∨ \sem{i2} 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 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). // qed. -lemma sem_plus: ∀S.∀i1,i2:pitem S. - \sem{i1 + i2} = \sem{i1} ∪ \sem{i2}. +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}. // qed. -lemma sem_plus_w: ∀S.∀i1,i2:pitem S.∀w. - \sem{i1 + i2} w = (\sem{i1} w ∨ \sem{i2} 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 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). // qed. -lemma sem_star : ∀S.∀i:pitem S. - \sem{i^*} = \sem{i} · \sem{|i|}^*. +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*. // qed. -lemma sem_star_w : ∀S.∀i:pitem S.∀w. - \sem{i^*} w = (∃w1,w2.w1 @ w2 = w ∧ \sem{i} w1 ∧ \sem{|i|}^* w2). +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). // qed. (* Below are a few, simple, semantic properties of items. In particular: @@ -264,38 +268,37 @@ lemma sem_star_w : ∀S.∀i:pitem S.∀w. 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:word S. w1 @ w2 = ϵ → w1 = ϵ. +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:DeqSet.∀e:pitem S. ¬ (ϵ ∈ e). -#S #e elim e normalize /2/ - [#r1 #r2 * #n1 #n2 % * /2/ * #w1 * #w2 * * #H - >(append_eq_nil …H…) /2/ - |#r1 #r2 #n1 #n2 % * /2/ - |#r #n % * #w1 * #w2 * * #H >(append_eq_nil …H…) /2/ +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/ + |#r1 #r2 #n1 #n2 % * /span class="autotactic"2span class="autotrace" trace a href="cic:/matita/basics/logic/absurd.def(2)"absurd/a/span/span/ + |#r #n % * #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 a href="cic:/matita/basics/logic/absurd.def(2)"absurd/a/span/span/ ] qed. -lemma epsilon_to_true : ∀S.∀e:pre S. ϵ ∈ e → \snd e = true. -#S * #i #b cases b // normalize #H @False_ind /2/ +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:pre S. \snd e = true → ϵ ∈ e. +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:pitem S. \sem{i} =1 \sem{i}-{[ ]}. +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 ]}. #S #i #w % - [#H whd % // normalize @(not_to_not … (not_epsilon_lp …i)) // + [#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:pre S. \sem{\fst e} =1 \sem{e}-{[ ]}. +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 ]}. #S * #i * - [>sem_pre_true normalize in ⊢ (??%?); #w % - [/3/ | * * // #H1 #H2 @False_ind @(absurd …H1 H2)] - |>sem_pre_false normalize in ⊢ (??%?); #w % [ /3/ | * // ] + [>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)] + |>a href="cic:/matita/tutorial/chapter7/sem_pre_false.def(9)"sem_pre_false/a normalize in ⊢ (??%?); #w % [ /span class="autotactic"3span class="autotrace" trace 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/ | * // ] ] -qed. - +qed. \ No newline at end of file -- 2.39.2