]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/re_complete/lang.ma
initial properies of the "same top term constructor" predicate
[helm.git] / matita / matita / re_complete / lang.ma
1 include "basics/list.ma".
2 include "basics/sets.ma".
3 include "basics/deqsets.ma".
4
5 definition word ≝ λS:DeqSet.list S.
6
7 notation "ϵ" non associative with precedence 90 for @{ 'epsilon }.
8 interpretation "epsilon" 'epsilon = (nil ?).
9
10 (* concatenation *)
11 definition cat : ∀S,l1,l2,w.Prop ≝ 
12   λS.λl1,l2.λw:word S.∃w1,w2.w1 @ w2 = w ∧ l1 w1 ∧ l2 w2.
13 notation "a · b" non associative with precedence 60 for @{ 'middot $a $b}.
14 interpretation "cat lang" 'middot a b = (cat ? a b).
15
16 let rec flatten (S : DeqSet) (l : list (word S)) on l : word S ≝ 
17 match l with [ nil ⇒ [ ] | cons w tl ⇒ w @ flatten ? tl ].
18
19 let rec conjunct (S : DeqSet) (l : list (word S)) (r : word S → Prop) on l: Prop ≝
20 match l with [ nil ⇒ True | cons w tl ⇒ r w ∧ conjunct ? tl r ]. 
21
22 (* kleene's star *)
23 definition star ≝ λS.λl.λw:word S.∃lw.flatten ? lw = w ∧ conjunct ? lw l. 
24 notation "a ^ *" non associative with precedence 90 for @{ 'star $a}.
25 interpretation "star lang" 'star l = (star ? l).
26
27 lemma cat_ext_l: ∀S.∀A,B,C:word S →Prop. 
28   A =1 C  → A · B =1 C · B.
29 #S #A #B #C #H #w % * #w1 * #w2 * * #eqw #inw1 #inw2
30 cases (H w1) /6/ 
31 qed.
32
33 lemma cat_ext_r: ∀S.∀A,B,C:word S →Prop. 
34   B =1 C → A · B =1 A · C.
35 #S #A #B #C #H #w % * #w1 * #w2 * * #eqw #inw1 #inw2
36 cases (H w2) /6/ 
37 qed.
38   
39 lemma cat_empty_l: ∀S.∀A:word S→Prop. ∅ · A =1 ∅.
40 #S #A #w % [|*] * #w1 * #w2 * * #_ *
41 qed.
42
43 lemma distr_cat_r: ∀S.∀A,B,C:word S →Prop.
44   (A ∪ B) · C =1  A · C ∪ B · C. 
45 #S #A #B #C #w %
46   [* #w1 * #w2 * * #eqw * /6/ |* * #w1 * #w2 * * /6/] 
47 qed.
48
49 (* derivative *)
50
51 definition deriv ≝ λS.λA:word S → Prop.λa,w. A (a::w).
52
53 lemma deriv_middot: ∀S,A,B,a. ¬ A ϵ → 
54   deriv S (A·B) a =1 (deriv S A a) · B.
55 #S #A #B #a #noteps #w normalize %
56   [* #w1 cases w1 
57     [* #w2 * * #_ #Aeps @False_ind /2/
58     |#b #w2 * #w3 * * whd in ⊢ ((??%?)→?); #H destruct
59      #H #H1 @(ex_intro … w2) @(ex_intro … w3) % // % //
60     ]
61   |* #w1 * #w2 * * #H #H1 #H2 @(ex_intro … (a::w1))
62    @(ex_intro … w2) % // % normalize //
63   ]
64 qed. 
65
66 (* star properties *)
67 lemma espilon_in_star: ∀S.∀A:word S → Prop.
68   A^* ϵ.
69 #S #A @(ex_intro … [ ]) normalize /2/
70 qed.
71
72 lemma cat_to_star:∀S.∀A:word S → Prop.
73   ∀w1,w2. A w1 → A^* w2 → A^* (w1@w2).
74 #S #A #w1 #w2 #Aw * #l * #H #H1 @(ex_intro … (w1::l)) 
75 % normalize /2/
76 qed.
77
78 lemma fix_star: ∀S.∀A:word S → Prop. 
79   A^* =1 A · A^* ∪ {ϵ}.
80 #S #A #w %
81   [* #l generalize in match w; -w cases l [normalize #w * /2/]
82    #w1 #tl #w * whd in ⊢ ((??%?)→?); #eqw whd in ⊢ (%→?); *
83    #w1A #cw1 %1 @(ex_intro … w1) @(ex_intro … (flatten S tl))
84    % /2/ whd @(ex_intro … tl) /2/
85   |* [2: whd in ⊢ (%→?); #eqw <eqw //]
86    * #w1 * #w2 * * #eqw <eqw @cat_to_star 
87   ]
88 qed.
89
90 lemma star_fix_eps : ∀S.∀A:word S → Prop.
91   A^* =1 (A - {ϵ}) · A^* ∪ {ϵ}.  
92 #S #A #w %
93   [* #l elim l 
94     [* whd in ⊢ ((??%?)→?); #eqw #_ %2 <eqw // 
95     |* [#tl #Hind * #H * #_ #H2 @Hind % [@H | //]
96        |#a #w1 #tl #Hind * whd in ⊢ ((??%?)→?); #H1 * #H2 #H3 %1 
97         @(ex_intro … (a::w1)) @(ex_intro … (flatten S tl)) %
98          [% [@H1 | normalize % /2/] |whd @(ex_intro … tl) /2/]
99        ]
100     ]
101   |* [* #w1 * #w2 * * #eqw * #H1 #_ <eqw @cat_to_star //
102      | whd in ⊢ (%→?); #H <H //
103      ]
104   ]
105 qed. 
106      
107 lemma star_epsilon: ∀S:DeqSet.∀A:word S → Prop.
108   A^* ∪ {ϵ} =1 A^*.
109 #S #A #w % /2/ * // 
110 qed.
111   
112 lemma epsilon_cat_r: ∀S.∀A:word S →Prop.
113    A · {ϵ} =1  A. 
114 #S #A #w %
115   [* #w1 * #w2 * * #eqw #inw1 normalize #eqw2 <eqw //
116   |#inA @(ex_intro … w) @(ex_intro … [ ]) /3/
117   ]
118 qed.
119
120 lemma epsilon_cat_l: ∀S.∀A:word S →Prop.
121    {ϵ} · A =1  A. 
122 #S #A #w %
123   [* #w1 * #w2 * * #eqw normalize #eqw2 <eqw <eqw2 //
124   |#inA @(ex_intro … ϵ) @(ex_intro … w) /3/
125   ]
126 qed.
127
128 lemma distr_cat_r_eps: ∀S.∀A,C:word S →Prop.
129   (A ∪ {ϵ}) · C =1  A · C ∪ C. 
130 #S #A #C @eqP_trans [|@distr_cat_r |@eqP_union_l @epsilon_cat_l]
131 qed.
132