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

feat: Defining Greedoid #10186

Open
wants to merge 212 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
212 commits
Select commit Hold shift + click to select a range
0b47e33
Initial commit.
qawbecrdtey Jul 23, 2023
b1e96ad
cleanup for merge
qawbecrdtey Jul 25, 2023
d52b49a
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 25, 2023
09a6fb5
Proved 'rank_eq_bases_card', added 'unbot_le_iff'
qawbecrdtey Jul 25, 2023
d82f1d4
Added theorem 'bases_singleton'
qawbecrdtey Jul 25, 2023
0568f8d
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 25, 2023
834846f
proved 'rank_eq_bases_card'
qawbecrdtey Jul 25, 2023
b1c2b24
Added some theorems on empty and singleton sets
qawbecrdtey Jul 25, 2023
87e455e
renamed several theorems
qawbecrdtey Jul 25, 2023
7842125
Saving for merge
qawbecrdtey Jul 25, 2023
1f11eca
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 25, 2023
ddb6aa8
Proved 4 theorems
qawbecrdtey Jul 25, 2023
085eef9
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 25, 2023
c1f512f
Reordered theorems.
qawbecrdtey Jul 25, 2023
aab0793
Added 'induction_on_accessible', 'mem_bases_self_iff', 'rank_of_feasi…
qawbecrdtey Jul 25, 2023
a389b79
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 25, 2023
d4d57a0
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 26, 2023
a566271
Added
qawbecrdtey Jul 26, 2023
fe784df
Added 'bases_of_feasible_eq_singleton'
qawbecrdtey Jul 26, 2023
bd5ee39
Proved local_submodularity
qawbecrdtey Jul 26, 2023
2187432
Added closures
qawbecrdtey Jul 26, 2023
29ce4ac
Proved stronger_local_submodularity_left
qawbecrdtey Jul 27, 2023
46761c0
Proved ssubset_of_feasible_rank
qawbecrdtey Jul 27, 2023
3744d42
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 27, 2023
a1bff38
Working
qawbecrdtey Jul 27, 2023
ee1b0e0
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 27, 2023
630ee8c
Working on 'greedoidRankAxioms_unique_greedoid' and 'rank.toGreedoid'
qawbecrdtey Jul 27, 2023
08167e8
Working on 'rank_closure_eq_rank_self'
qawbecrdtey Jul 27, 2023
0631798
small fix
qawbecrdtey Jul 27, 2023
64f1164
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 27, 2023
9e402cf
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 28, 2023
3b85431
Proved several theorems on closure
qawbecrdtey Jul 28, 2023
1eb0fb9
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 30, 2023
4330c1c
Added bases_of_empty, feasible_iff_elem_notin_closure_minus_elem
qawbecrdtey Jul 30, 2023
4055b03
Added some theorems and 'exists_subset_basis_of_subset_bases'
qawbecrdtey Jul 30, 2023
ae6ec73
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 31, 2023
8020839
proved 'exists_subset_basis_of_subset_bases'
qawbecrdtey Jul 31, 2023
41f8b78
removed unused variables.
qawbecrdtey Jul 31, 2023
77d169c
Declared 'bases_subset_of_rank_eq_subset'
qawbecrdtey Jul 31, 2023
c1de823
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 31, 2023
4e8b253
Removed false lemma, prioved bases_subset_of_rank_eq_of_subset
qawbecrdtey Jul 31, 2023
b420969
Proved 'closure_eq_of_subset_adj_closure'
qawbecrdtey Jul 31, 2023
21ccf11
Fixed all errors & Proved all theorems up to now.
qawbecrdtey Jul 31, 2023
a4228ae
Merge branch 'master' into greedoid-defs
qawbecrdtey Jul 31, 2023
6d6f683
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 1, 2023
5121a61
Added more theorems on closure
qawbecrdtey Aug 1, 2023
23e2be3
Added kernel and related stuffs
qawbecrdtey Aug 1, 2023
e36da35
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 2, 2023
e4f8bd8
Added more theorems
qawbecrdtey Aug 2, 2023
1416959
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 2, 2023
b3c5546
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 4, 2023
ea4eb5e
Proved some theorems
qawbecrdtey Aug 4, 2023
2c8b83f
Proved closure_kernel_eq_closure
qawbecrdtey Aug 4, 2023
88515f4
Added two simp lemmas
qawbecrdtey Aug 4, 2023
3fef06f
Added more theorems
qawbecrdtey Aug 4, 2023
25cb403
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 5, 2023
d7f5e73
working..
qawbecrdtey Aug 5, 2023
dc0f2d5
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 8, 2023
e6d84e0
Basic properties of rank & closure of greedoids are ready
qawbecrdtey Aug 8, 2023
6d3e692
Added several theorems on basisRank.
qawbecrdtey Aug 8, 2023
0d85a01
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 8, 2023
6223dd9
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 9, 2023
5fdaae6
Modified
qawbecrdtey Aug 9, 2023
d6b1464
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 10, 2023
9442e3e
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 11, 2023
c6aaecb
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 15, 2023
a2f74f2
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 21, 2023
369ae42
Fixed small error due to update
qawbecrdtey Aug 21, 2023
3b33280
New definition
qawbecrdtey Aug 21, 2023
1f4c237
Merge branch 'master' into greedoid-defs
qawbecrdtey Aug 31, 2023
ae31222
Merge branch 'master' into greedoid-defs
qawbecrdtey Sep 4, 2023
8284af4
Literally stuck. Help.
qawbecrdtey Sep 4, 2023
bf24446
Merge branch 'master' into greedoid-defs
qawbecrdtey Oct 6, 2023
6f9b10f
Version up
qawbecrdtey Oct 6, 2023
c8eb90e
Added 'base_nonempty'
qawbecrdtey Oct 6, 2023
358b1eb
Proved 'exists_feasible_satisfying_basisRank
qawbecrdtey Oct 6, 2023
d5f881c
Many many many fixes
qawbecrdtey Oct 6, 2023
4033a21
Working...
qawbecrdtey Oct 7, 2023
5fb0d80
Merge branch 'master' into greedoid-defs
qawbecrdtey Oct 9, 2023
fe6a691
Proved 'exists_superset_feasible_satisfying_basisRank'
qawbecrdtey Oct 9, 2023
8bb4266
Working on 'rankFeasible_TFAE'
qawbecrdtey Oct 9, 2023
7f00190
Proved 'rankFeasible_TFAE'
qawbecrdtey Oct 10, 2023
8409041
Merge branch 'master' into greedoid-defs
qawbecrdtey Oct 10, 2023
9a19e5d
Working on 'basicRank_union_add_rank_inter_le_basisRank_add_basisRank'
qawbecrdtey Oct 10, 2023
de917e7
Merge branch 'master' into greedoid-defs
qawbecrdtey Oct 11, 2023
b884bf6
Proved 'basisRank_union_add_rank_inter_le_basisRank_add_basisRank'
qawbecrdtey Oct 11, 2023
f729968
Merge branch 'master' into greedoid-defs
qawbecrdtey Oct 13, 2023
d932bc5
Merge branch 'master' into greedoid-defs
qawbecrdtey Oct 14, 2023
c3dc8ce
Merge branch 'master' into greedoid-defs
qawbecrdtey Oct 16, 2023
177ca54
Fixed naming
qawbecrdtey Oct 16, 2023
ada8d72
Working on 'rankFeasible_iff_subset_subset_monotoneClosure'
qawbecrdtey Oct 16, 2023
06f36cd
Merge branch 'master' into greedoid-defs
qawbecrdtey Oct 18, 2023
95409a4
Merge branch 'master' into greedoid-defs
qawbecrdtey Oct 18, 2023
f2993b9
Modified definition
qawbecrdtey Oct 21, 2023
9a80a4b
Modified theorem
qawbecrdtey Oct 21, 2023
6dd73cb
Merge branch 'master' into greedoid-defs
qawbecrdtey Nov 11, 2023
d12935c
Working on 'rankFeasible_iff_subset_subset_monotoneClosure'
qawbecrdtey Nov 11, 2023
cb9586e
Merge branch 'master' into greedoid-defs
qawbecrdtey Nov 12, 2023
0c4c2bc
Fixes, additions, working on 'rankFeasible_iff_subset_subset_monotone…
qawbecrdtey Nov 12, 2023
ef693bf
Merge branch 'master' into greedoid-defs
qawbecrdtey Nov 12, 2023
889d4c4
Refactor
qawbecrdtey Nov 12, 2023
ade2862
Working on 'rankFeasible_iff_subset_subset_monotoneClosure'
qawbecrdtey Nov 12, 2023
1590309
Merge branch 'master' into greedoid-defs
qawbecrdtey Nov 13, 2023
c8d6ae8
Working on 'rankFeasible_iff_subset_subset_monotoneClosure'
qawbecrdtey Nov 13, 2023
73d8fb5
Merge branch 'master' into greedoid-defs
qawbecrdtey Nov 13, 2023
05b8a24
Merge branch 'master' into greedoid-defs
qawbecrdtey Nov 14, 2023
231a2c8
refine
qawbecrdtey Nov 14, 2023
0e66713
Merge branch 'master' into greedoid-defs
qawbecrdtey Nov 14, 2023
f60071d
Merge branch 'master' into greedoid-defs
qawbecrdtey Dec 5, 2023
accafdf
Fixed errors coming from version update
qawbecrdtey Dec 5, 2023
3eeaee8
Added 'mem_base_iff_feasible_and_card_eq_base'
qawbecrdtey Dec 5, 2023
83d62ab
Modified name.
qawbecrdtey Dec 5, 2023
10c486d
Added some more.
qawbecrdtey Dec 5, 2023
a71a157
Merge branch 'master' into greedoid-defs
qawbecrdtey Dec 27, 2023
4b8be0f
Added and removed several theorems.
qawbecrdtey Dec 27, 2023
311dcd1
Proved 'rankFeasible_iff_subset_subset_monotoneClosure'
qawbecrdtey Dec 27, 2023
0d2de3a
Added 'rankFeasible_iff_monotoneClosure_equal_for_all_basis'
qawbecrdtey Dec 27, 2023
8f3d20d
Cleanup
qawbecrdtey Dec 27, 2023
2c6b53b
Merge branch 'master' into greedoid-defs
qawbecrdtey Dec 27, 2023
94f8c47
Added 'closureFeasible'
qawbecrdtey Dec 27, 2023
e798792
Merge branch 'master' into greedoid-defs
qawbecrdtey Dec 27, 2023
dfdf34b
Merge branch 'master' into greedoid-defs
qawbecrdtey Dec 28, 2023
2f3f1ee
Replaced deprecated names
qawbecrdtey Dec 28, 2023
41a96cb
Added 'closure_insert_eq_iff_rank_eq'
qawbecrdtey Dec 28, 2023
62138b3
Added 'rank_le_of_rankFeasible_insert_not_mem_and_kernelClosureOperat…
qawbecrdtey Dec 28, 2023
a65c250
Working on 'kernelClosureOperator_weak_exchange_property_over_rankFea…
qawbecrdtey Dec 28, 2023
b45cb73
Merge branch 'master' into greedoid-defs
qawbecrdtey Dec 28, 2023
5c7e07f
Added 'exists_basis_containing_element_if_rank_insert_increases'
qawbecrdtey Dec 28, 2023
7009db1
Merge branch 'master' into greedoid-defs
qawbecrdtey Dec 29, 2023
3ef32ee
Modified a lot and added several lemmas
qawbecrdtey Dec 30, 2023
07d2ddc
Working on kernelClosureOperator_weak_exchange_property_over_rankFeas…
qawbecrdtey Dec 30, 2023
924e645
Merge branch 'master' into greedoid-defs
qawbecrdtey Dec 30, 2023
43c6575
working
qawbecrdtey Dec 30, 2023
e65e5f2
Merge branch 'master' into greedoid-defs
qawbecrdtey Jan 5, 2024
e038054
Working...
qawbecrdtey Jan 19, 2024
17626f9
Merge branch 'master' into greedoid-defs
qawbecrdtey Jan 19, 2024
0905f5c
Merge branch 'master' into greedoid-defs
qawbecrdtey Jan 23, 2024
e1f7992
Merge branch 'master' into greedoid-defs
qawbecrdtey Jan 24, 2024
88949e4
Merge branch 'master' into greedoid-defs
qawbecrdtey Feb 2, 2024
9a42ee5
Fixed termination_by
qawbecrdtey Feb 2, 2024
3f9e955
Reduced to two separate files for initial contribution of greedoid.
qawbecrdtey Feb 2, 2024
4de12f4
Removed Basic.lean for now, and deleted unnecessary imports.
qawbecrdtey Feb 2, 2024
8815098
Added copyright header
qawbecrdtey Feb 2, 2024
e1d5099
Attached 'Greedoid.' infront of each name.
qawbecrdtey Feb 2, 2024
f1a4ce3
Added Greedoid namespace
qawbecrdtey Feb 2, 2024
2992ed3
Added module doc
qawbecrdtey Feb 2, 2024
85ceeea
Fixed typo in doc
qawbecrdtey Feb 2, 2024
863148e
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Feb 19, 2024
3a5b932
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Mar 12, 2024
d3aa0ea
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Apr 19, 2024
22e5b4e
Fixed several defs and thms, more fixes left.
qawbecrdtey Apr 19, 2024
09f1345
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey May 16, 2024
31f8297
Several changes:
qawbecrdtey May 16, 2024
24996d0
Modified Mathlib.lean
qawbecrdtey May 16, 2024
054eaba
Indent?
qawbecrdtey May 16, 2024
2e00d96
Reformat.
qawbecrdtey May 16, 2024
9169925
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey May 30, 2024
70e2e03
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey May 31, 2024
73854f8
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Jun 20, 2024
d9c1e30
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Jul 17, 2024
2e3463f
Fixed typo.
qawbecrdtey Jul 17, 2024
dcd57ec
branched out of greedoid-for-contrib.
qawbecrdtey Aug 3, 2024
bdba6f3
Merge branch 'master' into greedoid-for-contrib-with-finset-arrow-prop
qawbecrdtey Aug 6, 2024
579fa2d
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Aug 14, 2024
80c9ab7
Merged branch master
qawbecrdtey Aug 14, 2024
57a3131
Merge remote-tracking branch 'origin' into greedoid-for-contrib-with-…
qawbecrdtey Sep 27, 2024
e394379
working..
qawbecrdtey Sep 27, 2024
3415c6d
Merge remote-tracking branch 'origin' into greedoid-for-contrib-with-…
qawbecrdtey Sep 27, 2024
a329bad
small improvements
qawbecrdtey Sep 27, 2024
bcdf3d2
Finished one function
qawbecrdtey Sep 27, 2024
88d2784
Merge remote-tracking branch 'origin' into greedoid-for-contrib-with-…
qawbecrdtey Sep 28, 2024
1dba5b4
Basic Exchange Properties.
qawbecrdtey Sep 28, 2024
3a855d8
Added function nonempty_contains_emptyset'.
qawbecrdtey Sep 28, 2024
bf1f9a1
Added theorem nonempty_contains_emptyset.
qawbecrdtey Sep 28, 2024
598ad0a
Added induction_on_accessible
qawbecrdtey Sep 28, 2024
9c8edf3
Merge remote-tracking branch 'origin' into greedoid-for-contrib-with-…
qawbecrdtey Sep 28, 2024
3c032bd
working...
qawbecrdtey Sep 28, 2024
5ec47af
Merge remote-tracking branch 'origin' into greedoid-for-contrib-with-…
qawbecrdtey Sep 30, 2024
c40359f
working..
qawbecrdtey Sep 30, 2024
926ea8a
Merge remote-tracking branch 'origin' into greedoid-for-contrib-with-…
qawbecrdtey Sep 30, 2024
147be69
Merge remote-tracking branch 'origin' into greedoid-for-contrib-with-…
qawbecrdtey Sep 30, 2024
cd6f301
Finished 'construction_on_accessible'.
qawbecrdtey Sep 30, 2024
8ffb2fc
Merge branch 'master' into greedoid-for-contrib-with-finset-arrow-prop
qawbecrdtey Sep 30, 2024
8af71ff
Cleanup?
qawbecrdtey Sep 30, 2024
8481ee5
Merge branch 'master' into greedoid-for-contrib-with-finset-arrow-prop
qawbecrdtey Sep 30, 2024
d875a6b
Removed repeated definitions in Greedoid/Basic.
qawbecrdtey Sep 30, 2024
f2eb5e1
Merge branch 'master' into greedoid-for-contrib-with-finset-arrow-prop
qawbecrdtey Sep 30, 2024
2d8a1cb
Merge branch 'master' into greedoid-for-contrib-with-finset-arrow-prop
qawbecrdtey Oct 1, 2024
0a9287b
Added documents.
qawbecrdtey Oct 1, 2024
a13ab73
Merge branch 'master' into greedoid-for-contrib-with-finset-arrow-prop
qawbecrdtey Oct 1, 2024
3e6fd6f
Merge branch 'master' into greedoid-for-contrib-with-finset-arrow-prop
qawbecrdtey Oct 1, 2024
9f689d4
Merge branch 'master' into greedoid-for-contrib-with-finset-arrow-prop
qawbecrdtey Oct 2, 2024
6fea9e4
Merge branch 'master' into greedoid-for-contrib-with-finset-arrow-prop
qawbecrdtey Oct 2, 2024
34f53c0
working on theorem.
qawbecrdtey Oct 2, 2024
9e6b0ec
Merge branch 'master' into greedoid-for-contrib-with-finset-arrow-prop
qawbecrdtey Oct 2, 2024
56de32c
working on theorem.
qawbecrdtey Oct 2, 2024
e4e4496
Finished basic building block.
qawbecrdtey Oct 2, 2024
9494d7b
Merge branch 'greedoid-for-contrib-with-finset-arrow-prop' into greed…
qawbecrdtey Oct 2, 2024
a988e66
Added imports to Mathlib.lean
qawbecrdtey Oct 2, 2024
a5a33eb
Lints.
qawbecrdtey Oct 2, 2024
26955d9
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Oct 3, 2024
40eb535
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Oct 4, 2024
459ec80
Removed unnecessary helper theorem from Exchange.lean.
qawbecrdtey Oct 4, 2024
6c92d11
removed unnecessary helper theorem.
qawbecrdtey Oct 4, 2024
00abbf6
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Oct 4, 2024
125a0be
removed name of unused variable.
qawbecrdtey Oct 4, 2024
f8de53a
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Oct 5, 2024
9ab6f23
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Oct 6, 2024
5c2cca6
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Oct 6, 2024
85fdd47
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Oct 8, 2024
bf31af0
Merge branch 'master' into greedoid-for-contrib
qawbecrdtey Oct 9, 2024
971f55c
Removed unnecessary codes.
qawbecrdtey Oct 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Mathlib.lean
Original file line number Diff line number Diff line change
Expand Up @@ -2261,6 +2261,9 @@ import Mathlib.Data.FunLike.Basic
import Mathlib.Data.FunLike.Embedding
import Mathlib.Data.FunLike.Equiv
import Mathlib.Data.FunLike.Fintype
import Mathlib.Data.Greedoid.Accessible
import Mathlib.Data.Greedoid.Basic
import Mathlib.Data.Greedoid.Exchange
import Mathlib.Data.Holor
import Mathlib.Data.Int.AbsoluteValue
import Mathlib.Data.Int.Align
Expand Down
116 changes: 116 additions & 0 deletions Mathlib/Data/Greedoid/Accessible.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/-
Copyright (c) 2024 Jihoon Hyun. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jihoon Hyun
-/
import Mathlib.Data.Finset.Basic
import Mathlib.Data.Finset.Card
import Init.Data.Nat.Basic

/-!
This file contains the definition of `AccessibleProperty` and `Accessible` typeclass,
along with some main properties of accessible set systems.

# Accessible
A set system `S` is accessible if there is some `x ∈ s` which `s \ {x} ∈ S` for each `s ∈ S`.
This is equivalent to saying that `S` is accessible if there is some `t ⊆ s` which `t ∈ S` and
`t.card + 1 = s.card`, for each `s ∈ S`.
This file uses the latter definition to remove a `DecidableEq` condition which is required
when using the former definition.
-/

namespace Greedoid

open Nat Finset

variable {α : Type*}

/-- The accessible property of greedoid. -/
def AccessibleProperty (Sys : Finset α → Prop) : Prop :=
⦃s : Finset α⦄ → Sys s → s.Nonempty → ∃ t, t ⊆ s ∧ t.card + 1 = s.card ∧ Sys t

/-- A set system is accessible if there is some element `x` in `s` which `s \ {x}` is also in the
set system, for each nonempty set `s` of the set system.
This automatically implies that nonempty accessible set systems contain an empty set. -/
class Accessible (Sys : Finset α → Prop) : Prop where
accessible :
⦃s : Finset α⦄ → Sys s → s.Nonempty → ∃ t, t ⊆ s ∧ t.card + 1 = s.card ∧ Sys t

namespace Accessible

variable {Sys : Finset α → Prop} [Accessible Sys]

/-- A helper lemma for `nonempty_contains_emptyset`.-/
theorem nonempty_contains_emptyset'
{s : Finset α} (hs : Sys s) {n : ℕ} (hn : n = s.card) :
Sys ∅ := by
induction n generalizing s with
| zero => exact card_eq_zero.mp hn.symm ▸ hs
| succ _ ih =>
rcases Accessible.accessible hs (by rw[← card_ne_zero]; omega) with ⟨t, _, _, ht⟩
exact ih ht (by omega)

theorem nonempty_contains_emptyset
(h : ∃ s, Sys s) :
Sys ∅ :=
have ⟨_, h⟩ := h; nonempty_contains_emptyset' h rfl

@[simp]
theorem nonempty_contains_emptyset_iff :
(∃ s, Sys s) ↔ Sys ∅ :=
⟨fun h => nonempty_contains_emptyset h, fun h => ⟨∅, h⟩⟩

-- TODO: Find better name.
-- TODO: Find a better way to inform `hS`.
-- `hS` can be obtained by `hs`.
theorem induction_on_accessible
(hS : Sys ∅)
{p : ⦃s : Finset α⦄ → Sys s → Prop}
(empty : p hS)
(insert :
∀ ⦃s₁ : Finset α⦄, (hs₁ : Sys s₁) →
∀ ⦃s₂ : Finset α⦄, (hs₂ : Sys s₂) →
s₂ ⊆ s₁ → s₂.card + 1 = s₁.card → p hs₂ → p hs₁)
{s : Finset α} (hs : Sys s):
p hs := by
induction' hn : s.card generalizing s
case zero => exact card_eq_zero.mp hn ▸ empty
case succ n ih =>
rcases accessible hs (one_le_card.mp (by omega)) with ⟨t, ht₁, ht₂, ht₃⟩
exact insert hs ht₃ ht₁ ht₂ (ih ht₃ (by omega))

-- TODO: Find better name.
theorem construction_on_accessible
[DecidableEq α] {s : Finset α} (hs : Sys s) :
∃ l : List α, l.Nodup ∧ Multiset.ofList l = s.val ∧ ∀ l', l' <:+ l →
∃ s', Multiset.ofList l' = s'.val ∧ Sys s' := by
have hS := nonempty_contains_emptyset ⟨s, hs⟩
induction hs using induction_on_accessible hS with
| empty => use []; simp; use ∅; simp [hS]
| insert hs hs₂ h₁ h₂ h₃ =>
rename_i s₁ s₂; clear hs₂; rcases h₃ with ⟨l₀, hl₀₁, hl₀₂, hl₀₃⟩
have h₃ : ∃! a, a ∈ s₁ ∧ a ∉ l₀ := by
have h₃ : (s₁ \ s₂).card = 1 := by rw [card_sdiff h₁]; omega
rcases card_eq_one.mp h₃ with ⟨a, ha⟩; rw [eq_singleton_iff_unique_mem] at ha
rcases ha with ⟨h₄, h₅⟩; simp at h₄ h₅
rw [← @mem_val _ _ s₂, ← hl₀₂, Multiset.mem_coe] at h₄
use a; simp [h₄, h₅]; intro _ h₁ h₂; apply h₅ _ h₁
intro h; apply h₂; rw [← Multiset.mem_coe, hl₀₂, mem_val]; exact h
let x : α := s₁.choose (· ∉ l₀) h₃; have hx : x ∉ l₀ := choose_property _ _ h₃; use x :: l₀
have h₄ : ↑(x :: l₀) ≤ s₁.val := by
rw [Multiset.le_iff_count]; intro a
by_cases ha : a = x
· simp_all [Multiset.nodup_iff_count_eq_one.mp s₁.nodup x (choose_mem _ _ h₃)]
· simp [ha]; rw [← Multiset.coe_count, hl₀₂]
exact Multiset.count_le_of_le _ (val_le_iff.mpr h₁)
have h₅ : Multiset.card s₁.val ≤ Multiset.card (Multiset.ofList (x :: l₀)) := by
simp [← h₂, ← card_val s₂, ← hl₀₂]
have h₆ := Multiset.eq_of_le_of_card_le h₄ h₅
apply And.intro (by simp [hl₀₁, hx]) (And.intro h₆ _)
intro l' hl'; rw [List.suffix_cons_iff] at hl'; apply hl'.elim _ (fun h => hl₀₃ _ h)
intro hl'; use s₁; simp [hs, hl', h₆]

end Accessible

end Greedoid

127 changes: 127 additions & 0 deletions Mathlib/Data/Greedoid/Basic.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
/-
Copyright (c) 2024 Jihoon Hyun. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jihoon Hyun
-/
import Mathlib.Data.Greedoid.Accessible
import Mathlib.Data.Greedoid.Exchange

/-!
This file contains the definition of `ExchangeProperty` and `AccessibleProperty`, along with the
main subject `Greedoid α`.

# Greedoid
Greedoid is a set system, i.e., a family of sets, over a finite ground set, which satisfies both
exchange and accessible properties.
-/

/-- Greedoid is a nonempty (finite) set system satisfying both accessible and exchange property. -/
structure Greedoid (α : Type*) where
/-- The ground set which every element lies on. -/
ground_set : Finset α
/-- The feasible set of the greedoid. -/
feasible : Finset α → Prop
contains_emptyset : feasible ∅
exchange_property : Greedoid.ExchangeProperty feasible
subset_ground : ∀ s, feasible s → s ⊆ ground_set

section Greedoid

variable {α : Type*}

/-- Definition of `Finset` in `Greedoid`.
This is often called 'feasible'· -/
protected def Greedoid.mem (G : Greedoid α) (s : Finset α) := G.feasible s

instance : Membership (Finset α) (Greedoid α) :=
⟨Greedoid.mem⟩

end Greedoid

namespace Greedoid

variable {α : Type*}

open Nat List Finset

theorem eq_of_veq : ∀ {G₁ G₂ : Greedoid α},
G₁.ground_set = G₂.ground_set → G₁.feasible = G₂.feasible → G₁ = G₂
| ⟨_, _, _, _, _⟩, ⟨_, _, _, _, _⟩, h₁, h₂ => by cases h₁; cases h₂; rfl

@[simp]
theorem feasible_set_injective :
Function.Injective (fun G : Greedoid α => (G.ground_set, G.feasible)) :=
fun _ _ => by simp; exact eq_of_veq

@[simp]
theorem feasible_set_inj {G₁ G₂ : Greedoid α} :
G₁.ground_set = G₂.ground_set ∧ G₁.feasible = G₂.feasible ↔ G₁ = G₂ :=
⟨fun h => by apply eq_of_veq <;> simp [h], fun h => by simp [h]⟩



variable {G : Greedoid α}

variable {s : Finset α}
variable {s₁ : Finset α} (hs₁ : s₁ ∈ G)
variable {s₂ : Finset α} (hs₂ : s₂ ∈ G)

protected theorem accessible_property :
AccessibleProperty G.feasible := by
intro s hs₁ hs₂
by_contra h'; simp at h'
let F : Set (Finset α) :=
{t | G.feasible t ∧ t.card < s.card}
have hF : ∅ ∈ F := by simp [F, G.contains_emptyset, hs₂]
let F' : Finset α → Prop := fun t ↦
t ∈ F ∧ ∀ t', G.feasible t' → t'.card < s.card → t'.card ≤ t.card
have hF' : ∃ x, F' x := by
by_contra h''; simp [F', F] at h''
have h₁ : ∀ n, ∃ t, t ∈ F ∧ t.card = n := by
intro n; induction n with
| zero => use ∅; simp [hF]
| succ n ih =>
rcases ih with ⟨t, ht₁, ht₂⟩
rcases ht₁ with ⟨ht₁, ht₃⟩
rcases h'' t ht₁ ht₃ with ⟨u, hu₁, hu₂, hu₃⟩
rcases G.exchange_property hu₁ ht₁ hu₃ with ⟨_, _, hx₁, hx₂⟩
use t.cons _ hx₁
simp [F, ht₂, hx₂]; omega
rcases h₁ s.card with ⟨t, ht₁, ht₂⟩
simp [F, ht₂] at ht₁
rcases hF' with ⟨u, hu₁, hu₂⟩
rcases hu₁ with ⟨_, hu₁⟩
rcases ExchangeProperty.exists_superset_of_card_le
G.exchange_property hs₁ G.contains_emptyset (le_of_lt hu₁) (zero_le _)
with ⟨t, ht₁, _, ht₂, ht₃⟩
simp at ht₂
rw [← ht₃] at hu₁
rcases G.exchange_property hs₁ ht₁ hu₁ with ⟨_, _, hx₁, hx₂⟩
have h : (t.cons _ hx₁).card < s.card := by
by_contra h''; simp at h''; apply h' _ ht₂ _ ht₁; omega
have := card_cons _ ▸ ht₃ ▸ hu₂ _ hx₂ h; omega

instance : Accessible G.feasible := ⟨G.accessible_property⟩

section Membership

@[simp]
theorem system_feasible_set_mem_mem : G.feasible s ↔ s ∈ G := by rfl

theorem mem_accessible
(hs₁ : s ∈ G) (hs₂ : s.Nonempty) :
∃ t, t ⊆ s ∧ t.card + 1 = s.card ∧ t ∈ G :=
G.accessible_property hs₁ hs₂

theorem mem_exchange
(hs₁ : G.feasible s₁) (hs₂ : G.feasible s₂) (hs : s₂.card < s₁.card) :
∃ x ∈ s₁, ∃ h : x ∉ s₂, cons x s₂ h ∈ G :=
G.exchange_property hs₁ hs₂ hs

end Membership

@[simp]
theorem emptyset_feasible : ∅ ∈ G := G.contains_emptyset

end Greedoid

81 changes: 81 additions & 0 deletions Mathlib/Data/Greedoid/Exchange.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/-
Copyright (c) 2024 Jihoon Hyun. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jihoon Hyun
-/
import Mathlib.Data.Finset.Basic
import Mathlib.Data.Finset.Card
import Init.Data.Nat.Basic

/-!
This file contains the definition of `ExchangeProperty`,
along with some main properties of set systems with the exchange property.
Not to be confused with 'Exchange System'. [Brylawski & Dieter, 1986]

# Exchange property
A set system `S` satisfies the exchange property if there is some `x ∈ s \ t` for `s, t ∈ S`
which `t.card < s.card`, that `t ∪ {x} ∈ S`.
-/

namespace Greedoid

open Nat Finset

variable {α : Type*}

-- TODO: Is typeclass `Exchange` required?
/-- The exchange property of greedoid.
Note that the exchange property also hold for (finite) matroids.

A set system satisfies the exchange property if there is some element `x` in some feasible
`s₁`, which is not in `s₂` with smaller cardinaliy, and `s₂ ∪ {x}` is also feasible.
This implies that all maximal feasible sets are actually maximum. -/
def ExchangeProperty (Sys : Finset α → Prop) : Prop :=
⦃s₁ : Finset α⦄ → Sys s₁ →
⦃s₂ : Finset α⦄ → Sys s₂ →
s₂.card < s₁.card →
∃ x ∈ s₁, ∃ h : x ∉ s₂, Sys (cons x s₂ h)

namespace ExchangeProperty

open Nat Finset

variable {Sys : Finset α → Prop}
variable {s₁ : Finset α} {s₂ : Finset α}

-- TODO: Find a better name.
theorem exists_superset_of_card_le
(hS : ExchangeProperty Sys) (hs₁ : Sys s₁) (hs₂ : Sys s₂)
{n : ℕ} (hn₁ : n ≤ s₁.card) (hn₂ : s₂.card ≤ n) :
∃ s, Sys s ∧ s₂ ⊆ s ∧ (∀ e ∈ s, e ∈ s₁ ∨ e ∈ s₂) ∧ s.card = n := by
induction n, hn₂ using le_induction with
| base => use s₂; simp [hs₂]; intro _ h; exact .inr h
| succ _ h ih =>
rcases ih (by omega) with ⟨s, hs, h₁, h₂, rfl⟩
rcases hS hs₁ hs hn₁ with ⟨a, ha₁, ha₂, ha₃⟩
use cons a s ha₂; simp_all
intro _ h; simp [h₁ h]

-- TODO: Find a better name.
theorem exists_feasible_superset_add_element_feasible
(hS : ExchangeProperty Sys) (hs₁ : Sys s₁) (hs₂ : Sys s₂) (hs : s₂ ⊆ s₁)
{a : α} (ha₁ : a ∈ s₁) (ha₂ : a ∉ s₂) :
∃ s, Sys s ∧ s₂ ⊆ s ∧ s ⊆ s₁ ∧ ∃ h : a ∉ s, Sys (cons a s h) := by
induction' hn : s₁.card - s₂.card generalizing s₂
case zero =>
exact False.elim ((eq_of_subset_of_card_le hs (Nat.le_of_sub_eq_zero hn) ▸ ha₂) ha₁)
case succ _ ih =>
rcases exists_superset_of_card_le hS hs₁ hs₂ (by omega) (le_succ _)
with ⟨s, hs₃, hs₄, hs₅, hs₆⟩
by_cases h : a ∈ s
· use s₂; simp [hs₂, hs, ha₂]
exact (eq_of_subset_of_card_le
((@cons_subset _ _ _ _ ha₂).mpr ⟨h, hs₄⟩) (hs₆ ▸ card_cons ha₂ ▸ le_rfl)) ▸ hs₃
· rcases ih hs₃ (fun e h ↦ (hs₅ _ h).elim id (fun f ↦ hs f)) h (by omega)
with ⟨t, ht⟩
use t; simp [ht, subset_trans hs₄]

end ExchangeProperty

end Greedoid

Loading