/- 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 FormalConjecturesUtil variable {V : Type} {G : SimpleGraph V} [DecidableEq V]namespace PebblingNumberConjecture

A 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 v

A 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 c

Indicates 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 VIsReachable 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.

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 = aFalse 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 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 All goals completed! 🐙 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 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✝ uFalse exact absurd h (p.rec (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 All goals completed! 🐙) (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 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; 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 := V:Typeinst✝³:DecidableEq VW:Typeinst✝²:Fintype Vinst✝¹:Fintype Winst✝:DecidableEq WG:SimpleGraph VH:SimpleGraph WhG:G.ConnectedhH:H.ConnectedPebblingNumber (G H) PebblingNumber G * PebblingNumber H All goals completed! 🐙end PebblingNumberConjecture