Zulip Chat Archive
Stream: graph theory
Topic: Turan's theorem rewrite error
John Talbot (Aug 04 2022 at 11:52):
While proving Turan's theorem I had a problem with rewriting that I think is captured by the example below.
I managed to work around it but I'd like to understand what I'm doing wrong. (Probably something very basic..)
In particular, why does the 1st lemma below work fine while the 2nd fails?
(Anyone interested in seeing the longest known proof of Turan's theorem can find it here:
https://github.com/jt496/extremal_graph/blob/master/src/theorems.lean )
import combinatorics.simple_graph.basic
open simple_graph
variables {α : Type*} {G H : simple_graph α}[fintype α][nonempty α]{s : finset α}
[decidable_eq α][decidable_rel G.adj][decidable_rel H.adj]
set_option trace.check true
lemma no_error (h: G = H): G.edge_set = H.edge_set :=
begin
rwa h,
end
lemma error (h: G = H): G.edge_finset = H.edge_finset :=
begin
rwa h,
/-
[check] application type mismatch at
_a.edges_fintype
argument type
Π (a b : α), decidable (G.adj a b)
expected type
decidable_rel _a.adj
-/
/-
rewrite tactic failed, motive is not type correct
λ (_a : simple_graph α), G.edge_finset = H.edge_finset = (_a.edge_finset = H.edge_finset)
state:
α : Type u_1,
G H : simple_graph α,
_inst_1 : fintype α,
_inst_2 : nonempty α,
_inst_3 : decidable_eq α,
_inst_4 : decidable_rel G.adj,
_inst_5 : decidable_rel H.adj,
h : G = H
⊢ G.edge_finset = H.edge_finset
-/
end
Yaël Dillies (Aug 04 2022 at 11:54):
Try simp_rw
Kevin Buzzard (Aug 04 2022 at 12:02):
That doesn't work either, and neither does simp only
. Furthermore subst
doesn't work because _inst_5
is frozen! This works:
lemma fixed_error (h: G = H): G.edge_finset = H.edge_finset :=
begin
unfreezingI {subst h},
congr',
end
I guess you need congr'
rather than refl
because Lean doesn't know that the two instances of decidable_rel
are definitionally equal.
Kevin Buzzard (Aug 04 2022 at 12:04):
@John Talbot those proofs look lovely to me -- you should look at some of the long proofs my undergraduates produce!
John Talbot (Aug 04 2022 at 12:06):
Thanks both! What should I be reading to understand this stuff properly?
Kevin Buzzard (Aug 04 2022 at 12:06):
finset
is constructive finiteness and this might be part of the problem. There is set.finite
which is another way to assert finiteness of a set; set.finite
is a Prop
whereas finset
is data.
John Talbot (Aug 04 2022 at 12:08):
Ah ok, thanks I'll look at this.
Kevin Buzzard (Aug 04 2022 at 12:13):
What is going on is that because finset
is constructive, simple_graph.edge_finset
is demanding a constructive proof of finiteness (i.e. data, not a proposition) from the type class inference system, hence all this wacky decidable_stuff. One of the things Lean is griping about is that you have assumed that there's an algorithm which decides whether two vertices in G are equal, and you've assumed that there's an algorithm which decides whether two vertices in H are equal, and then you've assumed that G and H are equal, but you haven't assumed that the algorithms are equal. This is the kind of price you pay when doing constructive mathematics.
Kevin Buzzard (Aug 04 2022 at 12:14):
import combinatorics.simple_graph.basic
open simple_graph
variables {α : Type*} {G H : simple_graph α}[fintype α][nonempty α]{s : finset α}
-- Let's work in classical mathematics
open_locale classical
-- now we don't need any of this stuff
--[decidable_eq α][decidable_rel G.adj][decidable_rel H.adj]
-- and this now works fine
lemma error (h: G = H): G.edge_finset = H.edge_finset :=
begin
rwa h,
end
John Talbot (Aug 04 2022 at 12:19):
Thanks, that makes a lot of sense. I have to admit I quite enjoy the wacky decidable_stuff but its good to see an easy workaround.
Yaël Dillies (Aug 25 2023 at 15:47):
Hey, @John Talbot! Did you ever finish your formalisation of Turán's theorem?
John Talbot (Aug 29 2023 at 07:36):
Yes I finished it about a year ago, but it was my first attempt at learning Lean so it's not pretty!
https://github.com/jt496/extremal_graph
John Talbot (Aug 29 2023 at 12:31):
I also ported it to Lean4 a few months back (part of my attempt to learn Lean4). I've just updated that and made it public:
https://github.com/jt496/Turan_4
Yaël Dillies (Aug 29 2023 at 12:35):
Nice! I've actually been golfing your proof over at https://github.com/YaelDillies/LeanTuran. The idea is to then port the golfed version to Lean 4 and PR it to mathlib.
John Talbot (Aug 29 2023 at 12:36):
Great!
Last updated: Dec 20 2023 at 11:08 UTC