|
| 1 | +import Mathlib.Algebra.Group.PUnit |
| 2 | +import TraceTheory.Language |
1 | 3 | import TraceTheory.Lemmas |
2 | 4 | import TraceTheory.MyhillNerode |
3 | 5 | import TraceTheory.RegularExpressions |
4 | 6 |
|
5 | 7 | namespace TraceTheory |
6 | 8 |
|
| 9 | +open scoped Pointwise |
| 10 | + |
7 | 11 | open RegularExpression |
8 | 12 |
|
9 | | -variable {α : Type*} {I : Independence α} |
| 13 | +variable {α : Type} {I : Independence α} |
10 | 14 |
|
11 | 15 | /-- Main component of Theorem 4.1 (ii) => (iii). |
12 | 16 |
|
@@ -120,4 +124,176 @@ theorem cRational_of_isStarConnected (X : RegularExpression α) (h : IsStarConne |
120 | 124 | rw [connectedComponents_of_connected _ hP_conn] |
121 | 125 | rw [kstar_eq_minusEps_trace] |
122 | 126 |
|
| 127 | +lemma recognizable_zero : IsRecognizable (∅ : Set (Trace I)) := |
| 128 | + ⟨PUnit, inferInstance, inferInstance, inferInstance, 1, by simp⟩ |
| 129 | + |
| 130 | +lemma recognizable_epsilon : IsRecognizable ({ 1 } : Set (Trace I)) := by |
| 131 | + sorry |
| 132 | + |
| 133 | +lemma recognizable_char (a : α) : IsRecognizable ({ ⟦[a]⟧ } : Set (Trace I)) := by |
| 134 | + sorry |
| 135 | + |
| 136 | +lemma recognizable_union {M : Type} [Monoid M] {P Q : Set M} |
| 137 | + (hP : IsRecognizable P) (hQ : IsRecognizable Q) : IsRecognizable (P ∪ Q) := by |
| 138 | + sorry |
| 139 | + |
| 140 | +lemma recognizable_mul {P Q : Set (Trace I)} |
| 141 | + (hP : IsRecognizable P) (hQ : IsRecognizable Q) : IsRecognizable (P * Q) := by |
| 142 | + sorry |
| 143 | + |
| 144 | +lemma recognizable_cstar {P : Set (Trace I)} |
| 145 | + (hP : IsRecognizable P) : IsRecognizable (kstar (connectedComponents P)) := by |
| 146 | + sorry |
| 147 | + |
| 148 | +/-- Theorem 4.1 (iv) => (i) -/ |
| 149 | +theorem recognizable_of_cRational (X : RegularExpression α) : |
| 150 | + IsRecognizable (matches_cstar_trace I X) := by |
| 151 | + induction X with |
| 152 | + | zero => exact recognizable_zero |
| 153 | + | epsilon => exact recognizable_epsilon |
| 154 | + | char a => exact recognizable_char a |
| 155 | + | plus P Q ihP ihQ => exact recognizable_union ihP ihQ |
| 156 | + | comp P Q ihP ihQ => exact recognizable_mul ihP ihQ |
| 157 | + | star P ih => exact recognizable_cstar ih |
| 158 | + |
| 159 | +variable [Fintype α] [LinearOrder α] [DecidableRel I.rel] |
| 160 | + |
| 161 | +lemma connected_of_lexNf_sq {w : List α} |
| 162 | + (hw : w ∈ LexNfLanguage I) |
| 163 | + (hww : w ++ w ∈ LexNfLanguage I) : |
| 164 | + IsConnected I ⟦w⟧ := by |
| 165 | + sorry |
| 166 | + |
| 167 | +omit [Fintype α] [LinearOrder α] in |
| 168 | +lemma mem_sigma (x : List α) : x ∈ KStar.kstar (Sigma : Language α) := by |
| 169 | + rw [Language.mem_kstar] |
| 170 | + use [x] |
| 171 | + simp only [List.flatten_cons, List.flatten_nil, List.append_nil, List.mem_cons, |
| 172 | + List.not_mem_nil, or_false, Sigma, forall_eq, true_and] |
| 173 | + apply Set.mem_univ |
| 174 | + |
| 175 | +omit [LinearOrder α] in |
| 176 | +lemma forbidden_of_subword {u w v : List α} {a b : α} |
| 177 | + (hw : w ∈ ForbiddenPattern I a b) : |
| 178 | + u ++ w ++ v ∈ ForbiddenPattern I a b := by |
| 179 | + unfold ForbiddenPattern at * |
| 180 | + simp [Language.mem_mul] at hw |
| 181 | + rcases hw with ⟨a1, b1, b2, b3, ⟨⟨ha1, hb1, hb2⟩, hb3⟩, ⟨x, hx, rfl⟩⟩ |
| 182 | + simp [Language.mem_mul] |
| 183 | + use u ++ a1, b1, b2, b3 |
| 184 | + and_intros |
| 185 | + · apply mem_sigma |
| 186 | + · exact hb1 |
| 187 | + · exact hb2 |
| 188 | + · exact hb3 |
| 189 | + · use x ++ v |
| 190 | + simp [mem_sigma] |
| 191 | + |
| 192 | +lemma sum_forbidden_of_subword {S : Finset (α × α)} {u w v : List α} |
| 193 | + (hw : w ∈ ∑ p ∈ S, ForbiddenPattern I p.1 p.2) : |
| 194 | + u ++ w ++ v ∈ ∑ p ∈ S, ForbiddenPattern I p.1 p.2 := by |
| 195 | + induction S using Finset.induction_on generalizing w with |
| 196 | + | empty => |
| 197 | + simp only [Finset.sum_empty] at hw |
| 198 | + contradiction |
| 199 | + | insert p' S' hp ih => |
| 200 | + rw [Finset.sum_insert hp] at hw ⊢ |
| 201 | + cases hw with |
| 202 | + | inl h_left => |
| 203 | + left |
| 204 | + exact forbidden_of_subword h_left |
| 205 | + | inr h_right => |
| 206 | + right |
| 207 | + exact ih h_right |
| 208 | + |
| 209 | +lemma lexNf_of_subword {u w v : List α} (h : u ++ w ++ v ∈ LexNfLanguage I) : |
| 210 | + w ∈ LexNfLanguage I := by |
| 211 | + unfold LexNfLanguage at h ⊢ |
| 212 | + rw [Set.mem_compl_iff] at h ⊢ |
| 213 | + unfold AllForbiddenPatterns at h ⊢ |
| 214 | + contrapose! h |
| 215 | + exact sum_forbidden_of_subword h |
| 216 | + |
| 217 | +lemma connected_iterativeFactor_of_subset_lexNf {X : Language α} |
| 218 | + (hX : X ≤ LexNfLanguage I) {w : List α} |
| 219 | + (hw : IsIterativeFactor X w) : |
| 220 | + IsConnected I ⟦w⟧ := by |
| 221 | + rcases hw with ⟨u, v, hw⟩ |
| 222 | + have h_lex1 : u ++ w ++ v ∈ LexNfLanguage I := hX (hw 1) |
| 223 | + have h_lex2 : u ++ (w ++ w) ++ v ∈ LexNfLanguage I := hX (hw 2) |
| 224 | + have h_w_lex : w ∈ LexNfLanguage I := lexNf_of_subword h_lex1 |
| 225 | + have h_ww_lex : w ++ w ∈ LexNfLanguage I := lexNf_of_subword h_lex2 |
| 226 | + exact connected_of_lexNf_sq h_w_lex h_ww_lex |
| 227 | + |
| 228 | +omit [Fintype α] [LinearOrder α] in |
| 229 | +lemma isRegular_of_recognizable {L : Language α} (h : IsRecognizable L) : |
| 230 | + L.IsRegular := by |
| 231 | + rcases recognizable_is_recognizableDFMA L h with ⟨σ, h_fin, h_decide, M, hM⟩ |
| 232 | + rw [Language.isRegular_iff] |
| 233 | + let M_DFA : DFA α σ := { |
| 234 | + step := fun q a => M.step q [a] |
| 235 | + start := M.start |
| 236 | + accept := M.accept |
| 237 | + } |
| 238 | + use σ, h_fin, M_DFA |
| 239 | + rw [hM] |
| 240 | + ext w |
| 241 | + simp [DFA.accepts, DFA.acceptsFrom, DFA.evalFrom] |
| 242 | + unfold DFMA.accepts DFMA.eval |
| 243 | + rw [Set.mem_setOf, Set.mem_setOf] |
| 244 | + have h_eval : ∀ q, List.foldl M_DFA.step q w = M.step q w := by |
| 245 | + induction w with |
| 246 | + | nil => |
| 247 | + intro q |
| 248 | + simp only [List.foldl_nil] |
| 249 | + exact (M.idempotent q).symm |
| 250 | + | cons a ws ih => |
| 251 | + intro q |
| 252 | + simp only [List.foldl_cons] |
| 253 | + rw [ih (M.step q [a])] |
| 254 | + exact (M.composition q [a] ws) |
| 255 | + rw [h_eval M_DFA.start] |
| 256 | + |
| 257 | +/-- Theorem 4.1 (i) => (ii) -/ |
| 258 | +theorem connectedIterativeFactors_of_recognizable {T : Set (Trace I)} |
| 259 | + (hT : IsRecognizable T) : |
| 260 | + ∃ X : RegularExpression α, |
| 261 | + (∀ s, IsIterativeFactor X.matches' s → IsConnected I ⟦s⟧) ∧ |
| 262 | + toTrace I X.matches' = T := by |
| 263 | + let L : Language α := (mk' (I := I) ⁻¹' T) ⊓ LexNfLanguage I |
| 264 | + have hL_reg : L.IsRegular := by |
| 265 | + apply Language.IsRegular.inf |
| 266 | + · apply isRegular_of_recognizable |
| 267 | + apply recognizable_has_recognizablePreImage |
| 268 | + exact hT |
| 269 | + · apply isRegular_lexNf |
| 270 | + have ⟨R, hR_matches⟩ : ∃ R : RegularExpression α, R.matches' = L := by |
| 271 | + classical |
| 272 | + have ⟨σ, h_fin, M, hL⟩ : ∃ (σ : Type) (_ : Fintype σ) (M : DFA α σ), M.accepts = L := |
| 273 | + Language.isRegular_iff.mp hL_reg |
| 274 | + haveI : FinEnum σ := FinEnum.ofEquiv (Fin (Fintype.card σ)) (Fintype.equivFin σ) |
| 275 | + use M.toNFA.toεNFA.toRegex |
| 276 | + rw [← hL, εNFA.accepts_toRegex, NFA.toεNFA_correct, DFA.toNFA_correct] |
| 277 | + use R |
| 278 | + constructor |
| 279 | + · intro s hs |
| 280 | + have h_subset : R.matches' ≤ LexNfLanguage I := by |
| 281 | + simp_all only [inf_le_right, L] |
| 282 | + exact connected_iterativeFactor_of_subset_lexNf h_subset hs |
| 283 | + · rw [hR_matches] |
| 284 | + ext t |
| 285 | + constructor |
| 286 | + · rintro ⟨s, hs, rfl⟩ |
| 287 | + exact hs.left |
| 288 | + · intro ht |
| 289 | + rcases exists_lexNf_rep I t with ⟨s, hs_eq, hs_lex⟩ |
| 290 | + refine ⟨s, ?_, hs_eq⟩ |
| 291 | + unfold L |
| 292 | + change s ∈ ⇑mk' ⁻¹' T ∩ LexNfLanguage I |
| 293 | + constructor |
| 294 | + · rw [Set.mem_preimage] |
| 295 | + subst hs_eq |
| 296 | + exact ht |
| 297 | + · exact hs_lex |
| 298 | + |
123 | 299 | end TraceTheory |
0 commit comments