Enderton. Verify theorem 3I.

finite-set-exercises
Joshua Potter 2023-06-26 15:11:19 -06:00
parent 9b6af648f2
commit 644660d197
3 changed files with 113 additions and 34 deletions

View File

@ -3293,7 +3293,7 @@ For any one-to-one function $F$, $F^{-1}$ is also one-to-one.
\end{proof}
\subsection{\partial{Theorem 3I}}%
\subsection{\verified{Theorem 3I}}%
\label{sub:theorem-3i}
\begin{theorem}[3I]
@ -3304,6 +3304,9 @@ For any one-to-one function $F$, $F^{-1}$ is also one-to-one.
\begin{proof}
\lean{Common/Set/Relation}
{Set.Relation.comp\_inv\_eq\_inv\_comp\_inv}
By definition of the \nameref{ref:composition} of $F$ and $G$,
$$F \circ G = \{\left< u, v \right> \mid \exists t(uGt \land tFv)\}.$$
By definition of the \nameref{ref:inverse} of a function,

View File

@ -66,7 +66,7 @@ theorem exercise_5_2b {A : Set α} {B C : Set β}
(h : Set.prod A B = Set.prod A C) (hA : Set.Nonempty A)
: B = C := by
by_cases hB : Set.Nonempty B
· suffices B ⊆ C ∧ C ⊆ B from Set.Subset.antisymm_iff.mpr this
· rw [Set.Subset.antisymm_iff]
have ⟨a, ha⟩ := hA
apply And.intro
· show ∀ t, t ∈ B → t ∈ C
@ -189,9 +189,7 @@ With `A`, `B`, and `C` as above, show that `A × B = C`.
-/
theorem exercise_5_5b {A : Set α} (B : Set β)
: Set.prod A B = ⋃₀ {Set.prod ({x} : Set α) B | x ∈ A} := by
suffices Set.prod A B ⊆ ⋃₀ {Set.prod {x} B | x ∈ A} ∧
⋃₀ {Set.prod {x} B | x ∈ A} ⊆ Set.prod A B from
Set.Subset.antisymm_iff.mpr this
rw [Set.Subset.antisymm_iff]
apply And.intro
· show ∀ t, t ∈ Set.prod A B → t ∈ ⋃₀ {Set.prod {x} B | x ∈ A}
intro t h
@ -255,9 +253,7 @@ Show that if `R` is a relation, then `fld R = R`.
theorem exercise_6_7 {R : Set.Relation α}
: R.fld = ⋃₀ ⋃₀ R.toOrderedPairs := by
let img := R.toOrderedPairs
suffices R.fld ⊆ ⋃₀ ⋃₀ img ∧ ⋃₀ ⋃₀ img ⊆ R.fld from
Set.Subset.antisymm_iff.mpr this
rw [Set.Subset.antisymm_iff]
apply And.intro
· show ∀ x, x ∈ R.fld → x ∈ ⋃₀ ⋃₀ img
intro x hx
@ -440,8 +436,8 @@ theorem exercise_6_9_ii {A : Set (Set.Relation α)}
Assume that `F` is a one-to-one function. If `x ∈ dom F`, then `F⁻¹(F(x)) = x`.
-/
theorem theorem_3g_i {α : Type _} {x y : α} {F : Set.Relation α}
(hF : isOneToOne F) (hx : x ∈ dom F)
theorem theorem_3g_i {F : Set.Relation α}
(hF : F.isOneToOne) (hx : x ∈ dom F)
: ∃! y, (x, y) ∈ F ∧ (y, x) ∈ F.inv := by
simp only [mem_self_comm_mem_inv, and_self]
have ⟨y, hy⟩ := dom_exists hx
@ -455,7 +451,7 @@ theorem theorem_3g_i {α : Type _} {x y : α} {F : Set.Relation α}
Assume that `F` is a one-to-one function. If `y ∈ ran F`, then `F(F⁻¹(y)) = y`.
-/
theorem theorem_3g_ii {F : Set.Relation α}
(hF : isOneToOne F) (hy : y ∈ F.ran)
(hF : F.isOneToOne) (hy : y ∈ F.ran)
: ∃! x, (x, y) ∈ F ∧ (y, x) ∈ F.inv := by
simp only [mem_self_comm_mem_inv, and_self]
have ⟨x, hx⟩ := ran_exists hy
@ -472,13 +468,12 @@ dom (F ∘ G) = {x ∈ dom G | G(x) ∈ dom F}.
```
-/
theorem theorem_3h_dom {F G : Set.Relation α}
(_ : isSingleValued F) (hG : isSingleValued G)
: dom (comp F G) = {x ∈ dom G | ∃! y, (x, y) ∈ G ∧ y ∈ dom F } := by
(_ : F.isSingleValued) (hG : G.isSingleValued)
: dom (F.comp G) = {x ∈ dom G | ∃! y, (x, y) ∈ G ∧ y ∈ dom F } := by
let rhs := {x ∈ dom G | ∃! y, (x, y) ∈ G ∧ y ∈ dom F }
suffices dom (comp F G) ⊆ rhs ∧ rhs ⊆ dom (comp F G) from
Set.Subset.antisymm_iff.mpr this
rw [Set.Subset.antisymm_iff]
apply And.intro
· show ∀ t, t ∈ dom (comp F G) → t ∈ rhs
· show ∀ t, t ∈ dom (F.comp G) → t ∈ rhs
intro t ht
simp only [Set.mem_setOf_eq]
have ⟨z, hz⟩ := dom_exists ht
@ -492,7 +487,7 @@ theorem theorem_3h_dom {F G : Set.Relation α}
refine ⟨a, ⟨ha.left, z, ha.right⟩, ?_⟩
intro y₁ hy₁
exact fun _ _ => single_valued_eq_unique hG hy₁ ha.left
· show ∀ t, t ∈ rhs → t ∈ dom (comp F G)
· show ∀ t, t ∈ rhs → t ∈ dom (F.comp G)
intro t ht
simp only [Set.mem_setOf_eq] at ht
unfold dom
@ -505,6 +500,30 @@ theorem theorem_3h_dom {F G : Set.Relation α}
simp only [Set.mem_setOf_eq]
exact ⟨a, ha.left.left, hb⟩
/-- ### Theorem 3J (a)
Assume that `F : A → B`, and that `A` is nonempty. There exists a function
`G : B → A` (a "left inverse") such that `G ∘ F` is the identity function on `A`
**iff** `F` is one-to-one.
-/
theorem theorem_3j_a {F : Set.Relation α} {A B : Set α}
(hF : F.mapsInto A B) (hA : Set.Nonempty A)
: (∃ G : Set.Relation α,
G.mapsInto B A ∧ (∀ p ∈ G.comp F, p.1 = p.2)) ↔ F.isOneToOne := by
sorry
/-- ### Theorem 3J (b)
Assume that `F : A → B`, and that `A` is nonempty. There exists a function
`H : B → A` (a "right inverse") such that `F ∘ H` is the identity function on
`B` **iff** `F` maps `A` onto `B`.
-/
theorem theorem_3j_b {F : Set.Relation α} {A B : Set α}
(hF : F.mapsInto A B) (hA : Set.Nonempty A)
: (∃ H : Set.Relation α,
H.mapsInto B A ∧ (∀ p ∈ F.comp H, p.1 = p.2)) ↔ F.mapsOnto A B := by
sorry
end
end Enderton.Set.Chapter_3

View File

@ -99,7 +99,7 @@ The inverse of the inverse of a `Relation` is the `Relation`.
@[simp]
theorem inv_inv_eq_self (R : Relation α)
: R.inv.inv = R := by
unfold Set.Relation.inv
unfold inv
simp only [Prod.exists, Set.mem_setOf_eq, Prod.mk.injEq]
ext x
apply Iff.intro
@ -117,10 +117,10 @@ theorem inv_inv_eq_self (R : Relation α)
For a set `F`, `dom F⁻¹ = ran F`.
-/
@[simp]
theorem dom_inv_eq_ran_self {F : Set.Relation α}
: Set.Relation.dom (F.inv) = Set.Relation.ran F := by
theorem dom_inv_eq_ran_self {F : Relation α}
: dom (F.inv) = ran F := by
ext x
unfold Set.Relation.dom Set.Relation.ran Set.Relation.inv
unfold dom ran inv
simp only [
Prod.exists,
Set.mem_image,
@ -140,10 +140,10 @@ theorem dom_inv_eq_ran_self {F : Set.Relation α}
For a set `F`, `ran F⁻¹ = dom F`.
-/
@[simp]
theorem ran_inv_eq_dom_self {F : Set.Relation α}
: Set.Relation.ran (F.inv) = Set.Relation.dom F := by
theorem ran_inv_eq_dom_self {F : Relation α}
: ran (F.inv) = dom F := by
ext x
unfold Set.Relation.dom Set.Relation.ran Set.Relation.inv
unfold dom ran inv
simp only [
Prod.exists,
Set.mem_image,
@ -188,7 +188,7 @@ def isSingleRooted (R : Relation α) : Prop :=
A single-rooted `Relation` should map the same output to the same input.
-/
theorem single_rooted_eq_unique {R : Relation α} {x₁ x₂ y : α}
(hR : isSingleRooted R)
(hR : R.isSingleRooted)
: (x₁, y) ∈ R → (x₂, y) ∈ R → x₁ = x₂ := by
intro hx₁ hx₂
unfold isSingleRooted at hR
@ -212,7 +212,7 @@ def isSingleValued (R : Relation α) : Prop :=
A single-valued `Relation` should map the same input to the same output.
-/
theorem single_valued_eq_unique {R : Relation α} {x y₁ y₂ : α}
(hR : isSingleValued R)
(hR : R.isSingleValued)
: (x, y₁) ∈ R → (x, y₂) ∈ R → y₁ = y₂ := by
intro hy₁ hy₂
unfold isSingleValued at hR
@ -227,7 +227,7 @@ theorem single_valued_eq_unique {R : Relation α} {x y₁ y₂ : α}
For a set `F`, `F⁻¹` is a function **iff** `F` is single-rooted.
-/
theorem single_valued_inv_iff_single_rooted_self {F : Set.Relation α}
: isSingleValued F.inv ↔ isSingleRooted F := by
: F.inv.isSingleValued ↔ F.isSingleRooted := by
apply Iff.intro
· intro hF
unfold isSingleValued at hF
@ -261,7 +261,7 @@ theorem single_valued_inv_iff_single_rooted_self {F : Set.Relation α}
For a relation `F`, `F` is a function **iff** `F⁻¹` is single-rooted.
-/
theorem single_valued_self_iff_single_rooted_inv {F : Set.Relation α}
: Set.Relation.isSingleValued F ↔ Set.Relation.isSingleRooted F.inv := by
: F.isSingleValued ↔ F.inv.isSingleRooted := by
conv => lhs; rw [← inv_inv_eq_self F]
rw [single_valued_inv_iff_single_rooted_self]
@ -269,13 +269,13 @@ theorem single_valued_self_iff_single_rooted_inv {F : Set.Relation α}
A `Relation` `R` is one-to-one if it is a single-rooted function.
-/
def isOneToOne (R : Relation α) : Prop :=
isSingleValued R ∧ isSingleRooted R
R.isSingleValued ∧ R.isSingleRooted
/--
A `Relation` is one-to-one **iff** it's inverse is.
-/
theorem one_to_one_self_iff_one_to_one_inv {R : Relation α}
: isOneToOne R ↔ isOneToOne R.inv := by
: R.isOneToOne ↔ R.inv.isOneToOne := by
unfold isOneToOne isSingleValued isSingleRooted
conv => rhs; simp only [
dom_inv_eq_ran_self,
@ -300,7 +300,7 @@ def comp (F G : Relation α) : Relation α :=
If `x ∈ dom (F ∘ G)`, then `x ∈ dom G`.
-/
theorem dom_comp_imp_dom_self {F G : Relation α}
: x ∈ dom (comp F G) → x ∈ dom G := by
: x ∈ dom (F.comp G) → x ∈ dom G := by
unfold dom comp
simp only [
mem_image,
@ -317,7 +317,7 @@ theorem dom_comp_imp_dom_self {F G : Relation α}
If `y ∈ ran (F ∘ G)`, then `y ∈ ran F`.
-/
theorem ran_comp_imp_ran_self {F G : Relation α}
: y ∈ ran (comp F G) → y ∈ ran F := by
: y ∈ ran (F.comp G) → y ∈ ran F := by
unfold ran comp
simp only [
mem_image,
@ -333,8 +333,8 @@ theorem ran_comp_imp_ran_self {F G : Relation α}
The composition of two functions is itself a function.
-/
theorem single_valued_comp_is_single_valued {F G : Relation α}
(hF : isSingleValued F) (hG : isSingleValued G)
: isSingleValued (comp F G) := by
(hF : F.isSingleValued) (hG : G.isSingleValued)
: (F.comp G).isSingleValued := by
unfold isSingleValued
intro x hx
have ⟨y, hxy⟩ := dom_exists hx
@ -365,6 +365,63 @@ theorem single_valued_comp_is_single_valued {F G : Relation α}
have hk₂ := hy'.right y₁ (mem_pair_imp_snd_mem_ran ht₂.right) ht₂.right
rw [hk₁, hk₂]
/--
For `Relation`s `F` and `G`, `(F ∘ G)⁻¹ = G⁻¹ ∘ F⁻¹`.
-/
theorem comp_inv_eq_inv_comp_inv {F G : Relation α}
: (F.comp G).inv = G.inv.comp F.inv := by
calc (F.comp G).inv
_ = {p | ∃ t, (p.2, t) ∈ G ∧ (t, p.1) ∈ F} := by
rw [Set.Subset.antisymm_iff]
apply And.intro
· unfold inv comp
intro t ht
simp only [mem_setOf_eq, Prod.exists] at ht
have ⟨a, b, ⟨⟨p, hp⟩, hab⟩⟩ := ht
rw [← hab]
exact ⟨p, hp⟩
· unfold inv comp
intro (a, b) ⟨p, hp⟩
simp only [mem_setOf_eq, Prod.exists, Prod.mk.injEq]
exact ⟨b, a, ⟨p, hp⟩, rfl, rfl⟩
_ = {p | ∃ t, (t, p.1) ∈ F ∧ (p.2, t) ∈ G} := by
rw [Set.Subset.antisymm_iff]
apply And.intro
· intro (a, b) ht
simp only [mem_setOf_eq] at *
have ⟨t, p, q⟩ := ht
exact ⟨t, q, p⟩
· intro (a, b) ht
simp only [mem_setOf_eq] at *
have ⟨t, p, q⟩ := ht
exact ⟨t, q, p⟩
_ = {p | ∃ t, (p.1, t) ∈ F.inv ∧ (t, p.2) ∈ G.inv } := by
rw [Set.Subset.antisymm_iff]
apply And.intro
· intro (a, b) ht
simp only [mem_setOf_eq] at *
have ⟨t, p, q⟩ := ht
refine ⟨t, ?_, ?_⟩ <;> rwa [mem_self_comm_mem_inv]
· intro (a, b) ht
simp only [mem_setOf_eq] at *
have ⟨t, p, q⟩ := ht
refine ⟨t, ?_, ?_⟩ <;> rwa [← mem_self_comm_mem_inv]
_ = comp (inv G) (inv F) := rfl
/--
Indicates `Relation` `F` is a function from `A` to `B`.
This is usually denoted as `F : A → B`.
-/
def mapsInto (F : Relation α) (A B : Set α) :=
F.isSingleValued ∧ dom F = A ∧ ran F ⊆ B
/--
Indicates `Relation` `F` is a function from `A` to `ran F = B`.
-/
def mapsOnto (F : Relation α) (A B : Set α) :=
F.isSingleValued ∧ dom F = A ∧ ran F = B
/-! ## Ordered Pairs -/
/--