From e678e3b1a88e657401902bbddad02d3a4d70205a Mon Sep 17 00:00:00 2001 From: Enrico Tassi Date: Tue, 20 Jul 2010 12:43:19 +0000 Subject: [PATCH] completed lemma 17 --- helm/software/matita/nlibrary/re/re.ma | 159 ++++++++++++++----------- 1 file changed, 90 insertions(+), 69 deletions(-) diff --git a/helm/software/matita/nlibrary/re/re.ma b/helm/software/matita/nlibrary/re/re.ma index 36abab4f6..2899fbc18 100644 --- a/helm/software/matita/nlibrary/re/re.ma +++ b/helm/software/matita/nlibrary/re/re.ma @@ -352,6 +352,34 @@ nlemma odot_dot_aux : ∀S.∀e1,e2: pre S. nrewrite > (cupA…); //;##] nqed. +nlemma sub_dot_star : + ∀S.∀X:word S → Prop.∀b. (X - ϵ b) · X^* ∪ {[]} = X^*. +#S X b; napply extP; #w; @; +##[ *; ##[##2: nnormalize; #defw; nrewrite < defw; @[]; @; //] + *; #w1; *; #w2; *; *; #defw sube; *; #lw; *; #flx cj; + @ (w1 :: lw); nrewrite < defw; nrewrite < flx; @; //; + @; //; napply (subW … sube); +##| *; #wl; *; #defw Pwl; nrewrite < defw; nelim wl in Pwl; ##[ #_; @2; //] + #w' wl' IH; *; #Pw' IHp; nlapply (IH IHp); *; + ##[ *; #w1; *; #w2; *; *; #defwl' H1 H2; + @; ncases b in H1; #H1; + ##[##2: nrewrite > (sub0…); @w'; @(w1@w2); + nrewrite > (associative_append ? w' w1 w2); + nrewrite > defwl'; @; ##[@;//] @(wl'); @; //; + ##| ncases w' in Pw'; + ##[ #ne; @w1; @w2; nrewrite > defwl'; @; //; @; //; + ##| #x xs Px; @(x::xs); @(w1@w2); + nrewrite > (defwl'); @; ##[@; //; @; //; @; nnormalize; #; ndestruct] + @wl'; @; //; ##] ##] + ##| #wlnil; nchange in match (flatten ? (w'::wl')) with (w' @ flatten ? wl'); + nrewrite < (wlnil); nrewrite > (append_nil…); ncases b; + ##[ ncases w' in Pw'; /2/; #x xs Pxs; @; @(x::xs); @([]); + nrewrite > (append_nil…); @; ##[ @; //;@; //; nnormalize; @; #; ndestruct] + @[]; @; //; + ##| @; @w'; @[]; nrewrite > (append_nil…); @; ##[##2: @[]; @; //] + @; //; @; //; @; *;##]##]##] +nqed. + (* theorem 16: 1 *) alias symbol "pc" (instance 13) = "cat lang". alias symbol "in_pl" (instance 23) = "in_pl". @@ -387,32 +415,8 @@ ntheorem bull_cup : ∀S:Alpha. ∀e:pitem S. 𝐋\p (•e) = 𝐋\p e ∪ ##| nrewrite > (sub0 …); #IH; nrewrite < IH; nrewrite > (cup0 …);//; ##]##] nrewrite > (cup_dotD…); nrewrite > (cupA…); nrewrite > (?: ((?·?)∪{[]} = 𝐋 .|e^*|)); //; - nchange in ⊢ (???%) with ((𝐋. |e|)^* ); napply extP; #w; @; - ##[ *; ##[##2: nnormalize; #defw; nrewrite < defw; @[]; @; //] - *; #w1; *; #w2; *; *; #defw sube; *; #lw; *; #flx cj; - @ (w1 :: lw); nrewrite < defw; nrewrite < flx; @; //; - @; //; napply (subW … sube); - ##| *; #wl; *; #defw Pwl; nrewrite < defw; nelim wl in Pwl; - ##[ #_; @2; //; - ##| #w' wl' IH; *; #Pw' IHp; nlapply (IH IHp); *; - ##[ *; #w1; *; #w2; *; *; #defwl' H1 H2; - @; ncases b' in H1; #H1; - ##[##2: nrewrite > (sub0…); @w'; @(w1@w2); - nrewrite > (associative_append ? w' w1 w2); - nrewrite > defwl'; @; ##[@;//] @(wl'); @; //; - ##| ncases w' in Pw'; - ##[ #ne; @w1; @w2; nrewrite > defwl'; @; //; @; //; - ##| #x xs Px; @(x::xs); @(w1@w2); - nrewrite > (defwl'); @; ##[@; //; @; //; @; nnormalize; #; ndestruct] - @wl'; @; //; ##] ##] - ##| #wlnil; nchange in match (flatten ? (w'::wl')) with (w' @ flatten ? wl'); - nrewrite < (wlnil); nrewrite > (append_nil…); ncases b'; - ##[ ncases w' in Pw'; /2/; #x xs Pxs; @; @(x::xs); @([]); - nrewrite > (append_nil…); @; ##[ @; //;@; //; nnormalize; @; #; ndestruct] - @[]; @; //; - ##| @; @w'; @[]; nrewrite > (append_nil…); @; ##[##2: @[]; @; //] - @; //; @; //; @; *;##]##]##]##]##] -nqed. + nchange in match (𝐋 .|e^*|) with ((𝐋. |e|)^* ); napply sub_dot_star;##] + nqed. (* theorem 16: 3 *) nlemma odot_dot: @@ -438,58 +442,75 @@ nlemma cupID : ∀S.∀l:word S → Prop.l ∪ l = l. nlemma cup_star_nil : ∀S.∀l:word S → Prop. l^* ∪ {[]} = l^*. #S a; napply extP; #w; @; ##[*; //; #H; nrewrite < H; @[]; @; //] #;@; //;nqed. -naxiom Admit : False. - -nlemma key_id : ∀S.∀e:pitem S. 𝐋\p e · 𝐋 .|e|^* ∪ {[]} = 𝐋\p e · 𝐋 .|e|^* ∪ 𝐋 .|e|^*. -#S e; napply extP; #w; @;##[##2:*] -##[*; #w1; *; #w2; *; *; #defw Hw1 Hw2;@; @w1; @w2; /3/; -##|*; #wl; *; #H; nrewrite < H; -(* - ngeneralize in match e; - nelim wl;##[#e;#_;@2;//] #x xs IH e;*; #Hx Hxs; ncases (IH Hxs); - ##[##2: #H; nnormalize; nrewrite < H; nrewrite > (append_nil…); - - ncases wl; ##[#_;@2; //] #x xs; *; #Hx Hxs; @; @x; @(flatten ? xs); @; - ##[@;//;##|@xs; @; //] - ngeneralize in match Hx; ngeneralize in match x; nelim e; nnormalize; //; - ##[#e1 e2 IH1 IH2 x; *; #w1; *; #w2; *; *; #defx Hw1 Hw2; - @; @w1; @w2; /4/ by conj; - ##|#e1 e2 IH1 IH2 y;*; #; ##[@|@2] /2/; - ##|#e IH y; *; #wl; *; #delwl Hw2; nrewrite < delwl; - nelim wl in Hw2; ##[#_;@[];@[];@;//; -*) - ncases Admit; -##|*;##[##2: #H; nrewrite < H; @2; //] *; #w1; *; #w2; *; *; #defw Hw1 Hw2; - @; @w1; @w2; /3/;##] +nlemma rcanc_sing : ∀S.∀A,C:word S → Prop.∀b:word S . + ¬ (A b) → A ∪ { (b) } = C → A = C - { (b) }. +#S A C b nbA defC; nrewrite < defC; napply extP; #w; @; +##[ #Aw; /3/| *; *; //; #H nH; ncases nH; #abs; nlapply (abs H); *] nqed. (* theorem 16: 4 *) nlemma star_dot: ∀S.∀e:pre S. 𝐋\p (e^⊛) = 𝐋\p e · (𝐋 .|\fst e|)^*. -#S e; ncases e; #e' b'; ncases b'; -##[ nchange in match (〈e',true〉^⊛) with 〈?,?〉; - nletin e'' ≝ (\fst (•e')); +#S p; ncases p; #e b; ncases b; +##[ nchange in match (〈e,true〉^⊛) with 〈?,?〉; + nletin e' ≝ (\fst (•e)); nletin b' ≝ (\snd (•e)); nchange in ⊢ (??%?) with (?∪?); - nchange in ⊢ (??(??%?)?) with (𝐋\p e'' · 𝐋 .|e''|^* ); - nrewrite > (?: 𝐋\p e'' · 𝐋.|e''|^* ∪ {[]} = (𝐋\p e' ∪ 𝐋.|e'|) · 𝐋.|e''|^* ∪ {[]}); ##[##2: - nrewrite < (bull_cup…); nchange in ⊢ (???(??(??%?)?)) with (?∪?); - nchange in match e'' with e''; - ncases (\snd (•e')); ##[##2: nrewrite > (cup0…); //] - nrewrite > (cup_dotD…); nrewrite > (epsilon_dot…); - nrewrite > (cupA…); nrewrite > (cup_star_nil…); - napply key_id;##] - nrewrite > (cup_dotD…); nrewrite > (cupA…); - nrewrite > (?: ?·? ∪ {[]} = 𝐋.|e'|^* ); ##[##2: - nrewrite > (erase_bull…); nrewrite > (dot_star_epsilon…); //] - nrewrite > (erase_bull…); + nchange in ⊢ (??(??%?)?) with (𝐋\p e' · 𝐋 .|e'|^* ); + nrewrite > (?: 𝐋\p e' = 𝐋\p e ∪ (𝐋 .|e| - ϵ b' )); ##[##2: + nlapply (bull_cup ? e); #bc; + nchange in match (𝐋\p (•e)) in bc with (?∪?); + nchange in match b' in bc with b'; + ncases b' in bc; ##[##2: nrewrite > (cup0…); nrewrite > (sub0…); //] + nrewrite > (cup_sub…); ##[napply rcanc_sing] //;##] + nrewrite > (cup_dotD…); nrewrite > (cupA…);nrewrite > (erase_bull…); + nrewrite > (sub_dot_star…); nchange in match (𝐋\p 〈?,?〉) with (?∪?); - nrewrite > (cup_dotD…);nrewrite > (epsilon_dot…); //; -##| nwhd in match (〈e',false〉^⊛); nchange in match (𝐋\p 〈?,?〉) with (?∪?); + nrewrite > (cup_dotD…); nrewrite > (epsilon_dot…); //; +##| nwhd in match (〈e,false〉^⊛); nchange in match (𝐋\p 〈?,?〉) with (?∪?); nrewrite > (cup0…); - nchange in ⊢ (??%?) with (𝐋\p e' · 𝐋 .|e'|^* ); - nrewrite < (cup0 ? (𝐋\p e')); //;##] + nchange in ⊢ (??%?) with (𝐋\p e · 𝐋 .|e|^* ); + nrewrite < (cup0 ? (𝐋\p e)); //;##] nqed. -(* corollary 17: non tipa *) +nlet rec pre_of_re (S : Alpha) (e : re S) on e : pitem S ≝ + match e with + [ z ⇒ pz ? + | e ⇒ pe ? + | s x ⇒ ps ? x + | c e1 e2 ⇒ pc ? (pre_of_re ? e1) (pre_of_re ? e2) + | o e1 e2 ⇒ po ? (pre_of_re ? e1) (pre_of_re ? e2) + | k e1 ⇒ pk ? (pre_of_re ? e1)]. + +nlemma notFalse : ¬False. @; //; nqed. + +nlemma dot0 : ∀S.∀A:word S → Prop. {} · A = {}. +#S A; nnormalize; napply extP; #w; @; ##[##2: *] +*; #w1; *; #w2; *; *; //; nqed. + +nlemma Lp_pre_of_re : ∀S.∀e:re S. 𝐋\p (pre_of_re ? e) = {}. +#S e; nelim e; ##[##1,2,3: //] +##[ #e1 e2 H1 H2; nchange in match (𝐋\p (pre_of_re S (e1 e2))) with (?∪?); + nrewrite > H1; nrewrite > H2; nrewrite > (dot0…); nrewrite > (cupID…);// +##| #e1 e2 H1 H2; nchange in match (𝐋\p (pre_of_re S (e1+e2))) with (?∪?); + nrewrite > H1; nrewrite > H2; nrewrite > (cupID…); // +##| #e1 H1; nchange in match (𝐋\p (pre_of_re S (e1^* ))) with (𝐋\p (pre_of_re ??) · ?); + nrewrite > H1; napply dot0; ##] +nqed. + +nlemma erase_pre_of_reK : ∀S.∀e. 𝐋 .|pre_of_re S e| = 𝐋 e. +#S A; nelim A; //; +##[ #e1 e2 H1 H2; nchange in match (𝐋 (e1 · e2)) with (𝐋 e1·?); + nrewrite < H1; nrewrite < H2; // +##| #e1 e2 H1 H2; nchange in match (𝐋 (e1 + e2)) with (𝐋 e1 ∪ ?); + nrewrite < H1; nrewrite < H2; // +##| #e1 H1; nchange in match (𝐋 (e1^* )) with ((𝐋 e1)^* ); + nrewrite < H1; //] +nqed. + +(* corollary 17 *) +nlemma L_Lp_bull : ∀S.∀e:re S.𝐋 e = 𝐋\p (•pre_of_re ? e). +#S e; nrewrite > (bull_cup…); nrewrite > (Lp_pre_of_re…); +nrewrite > (cupC…); nrewrite > (cup0…); nrewrite > (erase_pre_of_reK…); //; +nqed. nlemma Pext : ∀S.∀f,g:word S → Prop. f = g → ∀w.f w → g w. #S f g H; nrewrite > H; //; nqed. -- 2.39.2