/-
Copyright 2025 The Formal Conjectures Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-/
import FormalConjecturesUtilPebbling number conjecture
References:
variable {V : Type} {G : SimpleGraph V} [DecidableEq V]namespace PebblingNumberConjectureA Pebble distribution is an assignment of zero or more pebbles to each of the vertices.
def PebbleDistribution (V : Type) := V → ℕThe number of pebbles of a distribution is the total number summed over all vertices.
def NumberOfPebbles [Fintype V] : (PebbleDistribution V) → ℕ := fun D => ∑ v, D vA pebbling move on a graph consists of choosing a vertex with at least two pebbles, removing two pebbles from it, and adding one to an adjacent vertex (the second removed pebble is discarded from play).
def IsPebblingMove (G : SimpleGraph V) (A B : PebbleDistribution V) : Prop :=
∃ v w : V, (A v) ≥ 2 ∧ G.Adj v w ∧
B = (fun u =>
if u = w then A u + 1
else if u = v then A u - 2
else A u)@[category API, AMS 5]
theorem IsPebblingMove.refl (G : SimpleGraph V) (A : PebbleDistribution V) {v w : V} (hv : 2 ≤ A v)
(hvw : G.Adj v w) :
IsPebblingMove G A fun u =>
if u = w then A u + 1
else if u = v then A u - 2
else A u :=
⟨v, w, hv, hvw, rfl⟩A pebble path is a series of pebbling moves.
inductive PebblePath {α : Type} (r : α → α → Prop) : α → α → Type
| refl (a : α) : PebblePath r a a
| step {a b c : α} (p : PebblePath r a b) (h : r b c) : PebblePath r a cIndicates whether there exists a sequence of pebbling moves transforming one pebble distribution to another.
def ExistsPebblePath {α : Type} (r : α → α → Prop) (a b : α) : Prop :=
Nonempty (PebblePath r a b)
A pebble distribution B is reachable from another pebble distribution A, if there exists a
sequence of pebbling moves transforming the first into the second.
def IsReachable (G : SimpleGraph V) (A B : PebbleDistribution V) : Prop :=
ExistsPebblePath (IsPebblingMove G) A B@[simp, category API, AMS 5]
theorem IsReachable.refl (G : SimpleGraph V) (A : PebbleDistribution V) : IsReachable G A A := V:Typeinst✝:DecidableEq VG:SimpleGraph VA:PebbleDistribution V⊢ IsReachable G A A
All goals completed! 🐙
The pebbling number of a graph G, is the lowest natural number n that satisfies the
following condition: Given any target or 'root' vertex in the graph and any initial
pebbles distribution with n pebbles on the graph, another pebble distribution is reachable
in which the designated root vertex has one or more pebbles.
noncomputable def PebblingNumber [Fintype V] (G : SimpleGraph V) : ℕ :=
sInf { n | ∀ D, NumberOfPebbles D = n → ∀ v, ∃ D', IsReachable G D D' ∧ 1 ≤ D' v }
The pebbling number of the complete graph on n vertices is n.
refine_2 V:Typeinst✝¹:DecidableEq Vinst✝:Fintype Va:ℕha:a ∈
{n |
∀ (D : PebbleDistribution V),
NumberOfPebbles D = n → ∀ (v : V), ∃ D', IsReachable (SimpleGraph.completeGraph V) D D' ∧ 1 ≤ D' v}ha_lt:a < Fintype.card VR:↥Finset.univ ≃ Fin (Fintype.card V) := Finset.equivFinOfCardEq ⋯D:PebbleDistribution V := fun x ↦ if ↑(R ⟨x, ⋯⟩) < a then 1 else 0hD:NumberOfPebbles D = a⊢ False
obtain ⟨D', ⟨P⟩, h⟩ := ha D hD (R.symm ⟨a, ha_lt⟩) refine_2 V:Typeinst✝¹:DecidableEq Vinst✝:Fintype Va:ℕha:a ∈
{n |
∀ (D : PebbleDistribution V),
NumberOfPebbles D = n → ∀ (v : V), ∃ D', IsReachable (SimpleGraph.completeGraph V) D D' ∧ 1 ≤ D' v}ha_lt:a < Fintype.card VR:↥Finset.univ ≃ Fin (Fintype.card V) := Finset.equivFinOfCardEq ⋯D:PebbleDistribution V := fun x ↦ if ↑(R ⟨x, ⋯⟩) < a then 1 else 0hD:NumberOfPebbles D = aD':PebbleDistribution Vh:1 ≤ D' ↑(R.symm ⟨a, ha_lt⟩)P:PebblePath (IsPebblingMove (SimpleGraph.completeGraph V)) D D'⊢ False
cases P with
| refl => refine_2.refl V:Typeinst✝¹:DecidableEq Vinst✝:Fintype Va:ℕha:a ∈
{n |
∀ (D : PebbleDistribution V),
NumberOfPebbles D = n → ∀ (v : V), ∃ D', IsReachable (SimpleGraph.completeGraph V) D D' ∧ 1 ≤ D' v}ha_lt:a < Fintype.card VR:↥Finset.univ ≃ Fin (Fintype.card V) := Finset.equivFinOfCardEq ⋯D:PebbleDistribution V := fun x ↦ if ↑(R ⟨x, ⋯⟩) < a then 1 else 0hD:NumberOfPebbles D = ah:1 ≤ D ↑(R.symm ⟨a, ha_lt⟩)⊢ False aesop All goals completed! 🐙
| step p h => refine_2.step V:Typeinst✝¹:DecidableEq Vinst✝:Fintype Va:ℕha:a ∈
{n |
∀ (D : PebbleDistribution V),
NumberOfPebbles D = n → ∀ (v : V), ∃ D', IsReachable (SimpleGraph.completeGraph V) D D' ∧ 1 ≤ D' v}ha_lt:a < Fintype.card VR:↥Finset.univ ≃ Fin (Fintype.card V) := Finset.equivFinOfCardEq ⋯D:PebbleDistribution V := fun x ↦ if ↑(R ⟨x, ⋯⟩) < a then 1 else 0hD:NumberOfPebbles D = aD':PebbleDistribution Vh✝:1 ≤ D' ↑(R.symm ⟨a, ha_lt⟩)b✝:PebbleDistribution Vp:PebblePath (IsPebblingMove (SimpleGraph.completeGraph V)) D b✝h:IsPebblingMove (SimpleGraph.completeGraph V) b✝ D'⊢ False
obtain ⟨v, _, h, _, _⟩ := h refine_2.step V:Typeinst✝¹:DecidableEq Vinst✝:Fintype Va:ℕha:a ∈
{n |
∀ (D : PebbleDistribution V),
NumberOfPebbles D = n → ∀ (v : V), ∃ D', IsReachable (SimpleGraph.completeGraph V) D D' ∧ 1 ≤ D' v}ha_lt:a < Fintype.card VR:↥Finset.univ ≃ Fin (Fintype.card V) := Finset.equivFinOfCardEq ⋯D:PebbleDistribution V := fun x ↦ if ↑(R ⟨x, ⋯⟩) < a then 1 else 0hD:NumberOfPebbles D = aD':PebbleDistribution Vh✝:1 ≤ D' ↑(R.symm ⟨a, ha_lt⟩)b✝:PebbleDistribution Vp:PebblePath (IsPebblingMove (SimpleGraph.completeGraph V)) D b✝v:Vw✝:Vh:b✝ v ≥ 2left✝:(SimpleGraph.completeGraph V).Adj v w✝right✝:D' = fun u ↦ if u = w✝ then b✝ u + 1 else if u = v then b✝ u - 2 else b✝ u⊢ False
exact absurd h (p.rec (by V:Typeinst✝¹:DecidableEq Vinst✝:Fintype Va:ℕha:a ∈
{n |
∀ (D : PebbleDistribution V),
NumberOfPebbles D = n → ∀ (v : V), ∃ D', IsReachable (SimpleGraph.completeGraph V) D D' ∧ 1 ≤ D' v}ha_lt:a < Fintype.card VR:↥Finset.univ ≃ Fin (Fintype.card V) := Finset.equivFinOfCardEq ⋯D:PebbleDistribution V := fun x ↦ if ↑(R ⟨x, ⋯⟩) < a then 1 else 0hD:NumberOfPebbles D = aD':PebbleDistribution Vh✝:1 ≤ D' ↑(R.symm ⟨a, ha_lt⟩)b✝:PebbleDistribution Vp:PebblePath (IsPebblingMove (SimpleGraph.completeGraph V)) D b✝v:Vw✝:Vh:b✝ v ≥ 2left✝:(SimpleGraph.completeGraph V).Adj v w✝right✝:D' = fun u ↦ if u = w✝ then b✝ u + 1 else if u = v then b✝ u - 2 else b✝ u⊢ ∀ (x : V), ¬D x ≥ 2 aesop All goals completed! 🐙) (by V:Typeinst✝¹:DecidableEq Vinst✝:Fintype Va:ℕha:a ∈
{n |
∀ (D : PebbleDistribution V),
NumberOfPebbles D = n → ∀ (v : V), ∃ D', IsReachable (SimpleGraph.completeGraph V) D D' ∧ 1 ≤ D' v}ha_lt:a < Fintype.card VR:↥Finset.univ ≃ Fin (Fintype.card V) := Finset.equivFinOfCardEq ⋯D:PebbleDistribution V := fun x ↦ if ↑(R ⟨x, ⋯⟩) < a then 1 else 0hD:NumberOfPebbles D = aD':PebbleDistribution Vh✝:1 ≤ D' ↑(R.symm ⟨a, ha_lt⟩)b✝:PebbleDistribution Vp:PebblePath (IsPebblingMove (SimpleGraph.completeGraph V)) D b✝v:Vw✝:Vh:b✝ v ≥ 2left✝:(SimpleGraph.completeGraph V).Adj v w✝right✝:D' = fun u ↦ if u = w✝ then b✝ u + 1 else if u = v then b✝ u - 2 else b✝ u⊢ ∀ {b c : PebbleDistribution V} (p : PebblePath (IsPebblingMove (SimpleGraph.completeGraph V)) D b),
IsPebblingMove (SimpleGraph.completeGraph V) b c → (∀ (x : V), ¬b x ≥ 2) → ∀ (x : V), ¬c x ≥ 2 simp_all only [IsReachable, IsPebblingMove] V:Typeinst✝¹:DecidableEq Vinst✝:Fintype Va:ℕha_lt:a < Fintype.card VR:↥Finset.univ ≃ Fin (Fintype.card V) := Finset.equivFinOfCardEq ⋯D:PebbleDistribution V := fun x ↦ if ↑(R ⟨x, ⋯⟩) < a then 1 else 0D':PebbleDistribution Vb✝:PebbleDistribution Vp:PebblePath (IsPebblingMove (SimpleGraph.completeGraph V)) D b✝v:Vw✝:Vha:a ∈
{n |
∀ (D : PebbleDistribution V),
NumberOfPebbles D = n →
∀ (v : V), ∃ D', ExistsPebblePath (IsPebblingMove (SimpleGraph.completeGraph V)) D D' ∧ 1 ≤ D' v}hD:NumberOfPebbles D = ah✝:1 ≤
if ↑(R.symm ⟨a, ha_lt⟩) = w✝ then b✝ w✝ + 1
else if ↑(R.symm ⟨a, ha_lt⟩) = v then b✝ v - 2 else b✝ ↑(R.symm ⟨a, ha_lt⟩)h:b✝ v ≥ 2left✝:(SimpleGraph.completeGraph V).Adj v w✝right✝:D' = fun u ↦ if u = w✝ then b✝ w✝ + 1 else if u = v then b✝ v - 2 else b✝ u⊢ ∀ {b c : PebbleDistribution V} (p : PebblePath (IsPebblingMove (SimpleGraph.completeGraph V)) D b),
(∃ v w,
b v ≥ 2 ∧
(SimpleGraph.completeGraph V).Adj v w ∧ c = fun u ↦ if u = w then b w + 1 else if u = v then b v - 2 else b u) →
(∀ (x : V), ¬b x ≥ 2) → ∀ (x : V), ¬c x ≥ 2; aesop All goals completed! 🐙) v)The pebbling number conjecture: the pebbling number of a Cartesian product of connected graphs is at most equal to the product of the pebbling numbers of the factors. See Asplund, Hurlbert, and Kenter.
@[category research open, AMS 5]
theorem pebbling_number_conjecture {W : Type} [Fintype V] [Fintype W] [DecidableEq W]
(G : SimpleGraph V) (H : SimpleGraph W) (hG : G.Connected) (hH : H.Connected) :
PebblingNumber (G □ H) ≤ PebblingNumber G * PebblingNumber H := by V:Typeinst✝³:DecidableEq VW:Typeinst✝²:Fintype Vinst✝¹:Fintype Winst✝:DecidableEq WG:SimpleGraph VH:SimpleGraph WhG:G.ConnectedhH:H.Connected⊢ PebblingNumber (G □ H) ≤ PebblingNumber G * PebblingNumber H
sorry All goals completed! 🐙end PebblingNumberConjecture