|
| 1 | +/- |
| 2 | +Copyright (c) 2025-present Ching-Tsun Chou All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Ching-Tsun Chou |
| 5 | +-/ |
| 6 | +import Cslib.Foundations.Data.OmegaSequence.Init |
| 7 | +import Mathlib.Computability.Language |
| 8 | +import Mathlib.Order.Filter.AtTopBot.Defs |
| 9 | +import Mathlib.Tactic |
| 10 | + |
| 11 | +/-! |
| 12 | +# ωLanguage |
| 13 | +
|
| 14 | +This file contains the definition and operations on formal ω-languages, which |
| 15 | +are sets of infinite sequences over an alphabet `α`, namely, objects of type |
| 16 | +`ωSequence α`. |
| 17 | +
|
| 18 | +## Notations |
| 19 | +
|
| 20 | +In general we will use `p` and `q` to denote ω-languages and `l` and `m` to |
| 21 | +denote languages (namely, sets of finite sequences of type `List α`). |
| 22 | +
|
| 23 | +* `p ∪ q`, `p ∩ q`, `pᶜ`, `∅`: the usual set operations. |
| 24 | +* `l * p`: ω-language of `x ++ω y` where `x ∈ l` and `y ∈ p`. |
| 25 | +* `l ^ω`: ω-language of infinite sequences each of which is the concatenation of |
| 26 | + infinitely many (non-nil) members of `l`. |
| 27 | +* `l ↗ω`: ω-language of infinite sequences each of which has infinitely many |
| 28 | + prefixes in `l`. |
| 29 | +
|
| 30 | +## Main definitions |
| 31 | +
|
| 32 | +* `ωLanguage α`: a set of infinite sequences over the alphabet `α` |
| 33 | +* `p.map f`: transform an ω-language `p` over `α` into an ω-language over `β` |
| 34 | + by translating through `f : α → β` |
| 35 | +
|
| 36 | +## Main theorems |
| 37 | +
|
| 38 | +-/ |
| 39 | + |
| 40 | +open List Set Filter Computability |
| 41 | + |
| 42 | +universe v |
| 43 | + |
| 44 | +variable {α β γ : Type*} |
| 45 | + |
| 46 | +/-- An ω-language is a set of strings over an alphabet. -/ |
| 47 | +def ωLanguage (α) := |
| 48 | + Set (ωSequence α) |
| 49 | + |
| 50 | +namespace ωLanguage |
| 51 | + |
| 52 | +instance : Membership (ωSequence α) (ωLanguage α) := ⟨Set.Mem⟩ |
| 53 | +instance : Singleton (ωSequence α) (ωLanguage α) := ⟨Set.singleton⟩ |
| 54 | +instance : Insert (ωSequence α) (ωLanguage α) := ⟨Set.insert⟩ |
| 55 | +instance instCompleteAtomicBooleanAlgebra : CompleteAtomicBooleanAlgebra (ωLanguage α) := |
| 56 | + Set.instCompleteAtomicBooleanAlgebra |
| 57 | + |
| 58 | +variable {l m : Language α} {p q : ωLanguage α} {a b x : List α} {s t : ωSequence α} |
| 59 | + |
| 60 | +instance : Inhabited (ωLanguage α) := ⟨(∅ : Set _)⟩ |
| 61 | + |
| 62 | +/-- ω-language ∅ has no elements. -/ |
| 63 | +instance : EmptyCollection (ωLanguage α) := |
| 64 | + ⟨(∅ : Set _)⟩ |
| 65 | + |
| 66 | +theorem empty_def : (∅ : ωLanguage α) = (∅ : Set (ωSequence α)) := |
| 67 | + rfl |
| 68 | + |
| 69 | +/-- The union of two ω-languages. -/ |
| 70 | +instance : Union (ωLanguage α) := |
| 71 | + ⟨((· ∪ ·) : Set (ωSequence α) → Set (ωSequence α) → Set (ωSequence α))⟩ |
| 72 | + |
| 73 | +theorem union_def (p q : ωLanguage α) : p ∪ q = (p ∪ q : Set (ωSequence α)) := |
| 74 | + rfl |
| 75 | + |
| 76 | +/-- The intersection of two ω-languages. -/ |
| 77 | +instance : Inter (ωLanguage α) := |
| 78 | + ⟨((· ∩ ·) : Set (ωSequence α) → Set (ωSequence α) → Set (ωSequence α))⟩ |
| 79 | + |
| 80 | +theorem inter_def (p q : ωLanguage α) : p ∩ q = (p ∩ q : Set (ωSequence α)) := |
| 81 | + rfl |
| 82 | + |
| 83 | +theorem compl_def (p : ωLanguage α) : pᶜ = (pᶜ : Set (ωSequence α)) := |
| 84 | + rfl |
| 85 | + |
| 86 | +/-- The product of a language l and an ω-language `p` is the ω-language made of |
| 87 | +infinite sequences `x ++ω y` where `x ∈ l` and `y ∈ p`. -/ |
| 88 | +instance : HMul (Language α) (ωLanguage α) (ωLanguage α) := |
| 89 | + ⟨image2 (· ++ω ·)⟩ |
| 90 | + |
| 91 | +theorem hmul_def (l : Language α) (p : ωLanguage α) : l * p = image2 (· ++ω ·) l p := |
| 92 | + rfl |
| 93 | + |
| 94 | +/-- Concatenation of infinitely many copies of a languages, resulting in an ω-language. |
| 95 | +A.k.a. ω-power. |
| 96 | +-/ |
| 97 | +def omegaPower (l : Language α) : ωLanguage α := |
| 98 | + { s | ∃ φ : ωSequence ℕ, StrictMono φ ∧ φ 0 = 0 ∧ ∀ m, s.extract (φ m) (φ (m + 1)) ∈ l } |
| 99 | + |
| 100 | +/-- Use the postfix notation ^ω` for `omegaPower`. -/ |
| 101 | +@[notation_class] |
| 102 | +class OmegaPower (α : Type*) (β : outParam (Type*)) where |
| 103 | + omegaPower : α → β |
| 104 | + |
| 105 | +postfix:1024 "^ω" => OmegaPower.omegaPower |
| 106 | + |
| 107 | +instance : OmegaPower (Language α) (ωLanguage α) := |
| 108 | + { omegaPower := omegaPower } |
| 109 | + |
| 110 | +theorem omegaPower_def (l : Language α) : |
| 111 | + l^ω = { s | ∃ φ : ωSequence ℕ, StrictMono φ ∧ φ 0 = 0 ∧ ∀ m, s.extract (φ m) (φ (m + 1)) ∈ l } |
| 112 | + := rfl |
| 113 | + |
| 114 | +/- The ω-limit of a language `l` is the ω-language of infinite sequences each of which |
| 115 | +contains infinitely many prefixes in `l`. |
| 116 | +-/ |
| 117 | +def omegaLimit (l : Language α) : ωLanguage α := |
| 118 | + { s | ∃ᶠ m in atTop, s.extract 0 m ∈ l } |
| 119 | + |
| 120 | +/-- Use the postfix notation ↗ω` for `omegaLimit`. -/ |
| 121 | +@[notation_class] |
| 122 | +class OmegaLimit (α : Type*) (β : outParam (Type*)) where |
| 123 | + omegaLimit : α → β |
| 124 | + |
| 125 | +postfix:1024 "↗ω" => OmegaLimit.omegaLimit |
| 126 | + |
| 127 | +instance instOmegaLimit : OmegaLimit (Language α) (ωLanguage α) := |
| 128 | + { omegaLimit := omegaLimit } |
| 129 | + |
| 130 | +theorem omegaLimit_def (l : Language α) : |
| 131 | + l↗ω = { s | ∃ᶠ m in atTop, s.extract 0 m ∈ l } := |
| 132 | + rfl |
| 133 | + |
| 134 | +def map (f : α → β) : ωLanguage α → ωLanguage β := image (ωSequence.map f) |
| 135 | + |
| 136 | +theorem map_def (f : α → β) (p : ωLanguage α) : |
| 137 | + p.map f = image (ωSequence.map f) p := |
| 138 | + rfl |
| 139 | + |
| 140 | +@[ext] |
| 141 | +theorem ext (h : ∀ (s : ωSequence α), s ∈ p ↔ s ∈ q) : p = q := |
| 142 | + Set.ext h |
| 143 | + |
| 144 | +@[simp] |
| 145 | +theorem notMem_empty (s : ωSequence α) : s ∉ (∅ : ωLanguage α) := |
| 146 | + id |
| 147 | + |
| 148 | +@[simp] |
| 149 | +theorem mem_union (p q : ωLanguage α) (s : ωSequence α) : s ∈ p ∪ q ↔ s ∈ p ∨ s ∈ q := |
| 150 | + Iff.rfl |
| 151 | + |
| 152 | +@[simp] |
| 153 | +theorem mem_inter (p q : ωLanguage α) (s : ωSequence α) : s ∈ p ∩ q ↔ s ∈ p ∧ s ∈ q := |
| 154 | + Iff.rfl |
| 155 | + |
| 156 | +@[simp] |
| 157 | +theorem mem_compl (p : ωLanguage α) (s : ωSequence α) : s ∈ pᶜ ↔ ¬ s ∈ p := |
| 158 | + Iff.rfl |
| 159 | + |
| 160 | +theorem mem_hmul : s ∈ l * p ↔ ∃ x ∈ l, ∃ t ∈ p, x ++ω t = s := |
| 161 | + mem_image2 |
| 162 | + |
| 163 | +theorem append_mem_hmul : x ∈ l → s ∈ p → x ++ω s ∈ l * p := |
| 164 | + mem_image2_of_mem |
| 165 | + |
| 166 | +@[simp] |
| 167 | +theorem map_id (p : ωLanguage α) : map id p = p := |
| 168 | + by simp [map] |
| 169 | + |
| 170 | +@[simp] |
| 171 | +theorem map_map (g : β → γ) (f : α → β) (p : ωLanguage α) : map g (map f p) = map (g ∘ f) p := by |
| 172 | + simp [map, image_image] |
| 173 | + |
| 174 | +end ωLanguage |
0 commit comments