Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - feat(computability/language): le on languages #5704

Closed
wants to merge 17 commits into from
152 changes: 140 additions & 12 deletions src/computability/language.lean
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ The operations in this file define a [Kleene algebra](https://en.wikipedia.org/w
over the languages.
-/

universe u
universes u v

variables {α : Type u} [dec : decidable_eq α]

/-- A language is a set of strings over an alphabet. -/
@[derive [has_mem (list α), has_singleton (list α), has_insert (list α)]]
@[derive [has_mem (list α), has_singleton (list α), has_insert (list α), complete_lattice]]
def language (α) := set (list α)

namespace language
Expand Down Expand Up @@ -47,16 +47,24 @@ def star (l : language α) : language α :=
lemma star_def (l : language α) :
l.star = { x | ∃ S : list (list α), x = S.join ∧ ∀ y ∈ S, y ∈ l} := rfl

private lemma mul_assoc (l m n : language α) : (l * m) * n = l * (m * n) :=
lemma mem_one (x : list α) : x ∈ (1 : language α) ↔ x = [] := by refl
lemma mem_add (l m : language α) (x : list α) : x ∈ l + m ↔ x ∈ l ∨ x ∈ m := by simp [add_def]
foxthomson marked this conversation as resolved.
Show resolved Hide resolved
lemma mem_mul (l m : language α) (x : list α) : x ∈ l * m ↔ ∃ a b, a ∈ l ∧ b ∈ m ∧ a ++ b = x :=
by simp [mul_def]
lemma mem_star (l : language α) (x : list α) :
x ∈ l.star ↔ ∃ S : list (list α), x = S.join ∧ ∀ y ∈ S, y ∈ l :=
by refl

private lemma mul_assoc_lang (l m n : language α) : (l * m) * n = l * (m * n) :=
by { ext x, simp [mul_def], tauto {closer := `[subst_vars, simp *] } }

private lemma one_mul (l : language α) : 1 * l = l :=
private lemma one_mul_lang (l : language α) : 1 * l = l :=
by { ext x, simp [mul_def, one_def], tauto {closer := `[subst_vars, simp [*]] } }

private lemma mul_one (l : language α) : l * 1 = l :=
private lemma mul_one_lang (l : language α) : l * 1 = l :=
by { ext x, simp [mul_def, one_def], tauto {closer := `[subst_vars, simp *] } }

private lemma left_distrib (l m n : language α) : l * (m + n) = (l * m) + (l * n) :=
private lemma left_distrib_lang (l m n : language α) : l * (m + n) = (l * m) + (l * n) :=
begin
ext x,
simp only [mul_def, add_def, exists_and_distrib_left, set.mem_image2, set.image_prod,
Expand All @@ -75,7 +83,7 @@ begin
exact ⟨ hy, hz ⟩ } }
end

private lemma right_distrib (l m n : language α) : (l + m) * n = (l * n) + (m * n) :=
private lemma right_distrib_lang (l m n : language α) : (l + m) * n = (l * n) + (m * n) :=
begin
ext x,
simp only [mul_def, set.mem_image, add_def, set.mem_prod, exists_and_distrib_left, set.mem_image2,
Expand All @@ -102,14 +110,14 @@ instance : semiring (language α) :=
add_zero := by simp [zero_def, add_def],
add_comm := by simp [add_def, set.union_comm],
mul := (*),
mul_assoc := mul_assoc,
mul_assoc := mul_assoc_lang,
zero_mul := by simp [zero_def, mul_def],
mul_zero := by simp [zero_def, mul_def],
one := 1,
one_mul := one_mul,
mul_one := mul_one,
left_distrib := left_distrib,
right_distrib := right_distrib }
one_mul := one_mul_lang,
mul_one := mul_one_lang,
left_distrib := left_distrib_lang,
right_distrib := right_distrib_lang }

@[simp] lemma add_self (l : language α) : l + l = l := by finish [add_def]
foxthomson marked this conversation as resolved.
Show resolved Hide resolved

Expand Down Expand Up @@ -151,4 +159,124 @@ begin
finish }
end

lemma le_iff (l m : language α) : l ≤ m ↔ l + m = m := sup_eq_right.symm

lemma le_mul_congr {l₁ l₂ m₁ m₂ : language α} : l₁ ≤ m₁ → l₂ ≤ m₂ → l₁ * l₂ ≤ m₁ * m₂ :=
begin
intros h₁ h₂ x hx,
simp only [mul_def, exists_and_distrib_left, set.mem_image2, set.image_prod] at hx ⊢,
tauto
end

lemma le_add_congr {l₁ l₂ m₁ m₂ : language α} : l₁ ≤ m₁ → l₂ ≤ m₂ → l₁ + l₂ ≤ m₁ + m₂ :=
begin
intros h₁ h₂ x hx,
simp only [add_def, set.mem_union_eq] at hx ⊢,
tauto
end
foxthomson marked this conversation as resolved.
Show resolved Hide resolved

lemma supr_mul {ι : Type v} (l : ι → language α) (m : language α) :
(⨆ i, l i) * m = ⨆ i, l i * m :=
begin
ext x,
simp only [mem_mul, set.mem_Union, exists_and_distrib_left],
tauto
end

lemma mul_supr {ι : Type v} (l : ι → language α) (m : language α) :
m * (⨆ i, l i) = ⨆ i, m * l i :=
begin
ext x,
simp only [mem_mul, set.mem_Union, exists_and_distrib_left],
tauto
end

lemma supr_add {ι : Type v} [nonempty ι] (l : ι → language α) (m : language α) :
(⨆ i, l i) + m = ⨆ i, l i + m := supr_sup

lemma add_supr {ι : Type v} [nonempty ι] (l : ι → language α) (m : language α) :
m + (⨆ i, l i) = ⨆ i, m + l i := sup_supr
foxthomson marked this conversation as resolved.
Show resolved Hide resolved

lemma star_eq_supr_pow (l : language α) : l.star = ⨆ i : ℕ, l ^ i :=
begin
ext x,
simp only [star_def, set.mem_Union, set.mem_set_of_eq],
split,
{ revert x,
rintros _ ⟨ S, rfl, hS ⟩,
induction S with x S ih,
{ use 0,
tauto },
{ specialize ih _,
{ cases ih with i ih,
use i.succ,
rw [pow_succ, mem_mul],
exact ⟨ x, S.join, hS x (list.mem_cons_self _ _), ih, rfl ⟩ },
{ finish } } },
foxthomson marked this conversation as resolved.
Show resolved Hide resolved
{ rintro ⟨ i, hx ⟩,
induction i with i ih generalizing x,
{ rw [pow_zero, mem_one] at hx,
subst hx,
use [[]],
tauto },
{ rw [pow_succ, mem_mul] at hx,
rcases hx with ⟨ a, b, ha, hb, hx ⟩,
rcases ih b hb with ⟨ S, hb, hS ⟩,
use a :: S,
finish } }
foxthomson marked this conversation as resolved.
Show resolved Hide resolved
end

lemma mul_self_star_comm (l : language α) : l.star * l = l * l.star :=
begin
rw [star_eq_supr_pow, mul_supr, supr_mul],
congr,
ext i,
rw [←pow_succ, ←pow_succ']
end
foxthomson marked this conversation as resolved.
Show resolved Hide resolved

@[simp] lemma one_add_self_mul_star_eq_star (l : language α) : 1 + l * l.star = l.star :=
begin
rw [star_eq_supr_pow, mul_supr, add_def, supr_split_single (λ i, l ^ i) 0],
have h : (⨆ (i : ℕ), l * l ^ i) = ⨆ (i : ℕ) (h : i ≠ 0), (λ (i : ℕ), l ^ i) i,
{ ext x,
simp only [exists_prop, set.mem_Union, ne.def],
split,
{ rintro ⟨ i, hi ⟩,
use [i.succ, nat.succ_ne_zero i],
rwa pow_succ },
{ rintro ⟨ (_ | i), h0, hi ⟩,
{ contradiction },
use i,
rwa ←pow_succ } },
rw h,
refl
end

@[simp] lemma one_add_star_mul_self_eq_star (l : language α) : 1 + l.star * l = l.star :=
by rw [mul_self_star_comm, one_add_self_mul_star_eq_star]

lemma star_mul_le_right_of_mul_le_right (l m : language α) : l * m ≤ m → l.star * m ≤ m :=
begin
intro h,
rw [star_eq_supr_pow, supr_mul],
refine supr_le _,
intro n,
induction n with n ih,
{ simp },
rw [pow_succ', mul_assoc (l^n) l m],
exact le_trans (le_mul_congr (le_refl _) h) ih,
end

lemma star_mul_le_left_of_mul_le_left (l m : language α) : m * l ≤ m → m * l.star ≤ m :=
begin
intro h,
rw [star_eq_supr_pow, mul_supr],
refine supr_le _,
intro n,
induction n with n ih,
{ simp },
rw [pow_succ, ←mul_assoc m l (l^n)],
exact le_trans (le_mul_congr h (le_refl _)) ih
end

end language
6 changes: 6 additions & 0 deletions src/order/complete_lattice.lean
Original file line number Diff line number Diff line change
Expand Up @@ -651,6 +651,12 @@ by simpa only [inf_comm] using binfi_inf h
theorem supr_sup_eq {f g : β → α} : (⨆ x, f x ⊔ g x) = (⨆ x, f x) ⊔ (⨆ x, g x) :=
@infi_inf_eq (order_dual α) β _ _ _

lemma supr_sup [h : nonempty ι] {f : ι → α} {a : α} : (⨆ x, f x) ⊔ a = (⨆ x, f x ⊔ a) :=
@infi_inf (order_dual α) _ _ _ _ _

lemma sup_supr [nonempty ι] {f : ι → α} {a : α} : a ⊔ (⨆ x, f x) = (⨆ x, a ⊔ f x) :=
@inf_infi (order_dual α) _ _ _ _ _

/- supr and infi under Prop -/

@[simp] theorem infi_false {s : false → α} : infi s = ⊤ :=
Expand Down