Zulip Chat Archive
Stream: general
Topic: How to prove this seemingly trivial lemma?
Yufan Lou (Feb 21 2020 at 18:20):
lemma append_is_prefix [decidable_eq α] (l₁ : list α) (l₂ : list α) : is_prefix_of l₁ (l₁ ++ l₂) = tt := sorry
Mario Carneiro (Feb 21 2020 at 18:22):
is_prefix_of
is a Prop
, right? So there is a bool coercion there that you should first get rid of
Patrick Massot (Feb 21 2020 at 18:22):
It's a bool
Patrick Massot (Feb 21 2020 at 18:23):
crazy computer science thing
Mario Carneiro (Feb 21 2020 at 18:23):
In that case there should be a theorem relating it to <:+
which is a prop
Yufan Lou (Feb 21 2020 at 18:23):
XD
yeah I had no idea how to work with bool in lean
Yufan Lou (Feb 21 2020 at 18:24):
what is <:+
Mario Carneiro (Feb 21 2020 at 18:24):
I think its actual name is list.is_prefix
Yufan Lou (Feb 21 2020 at 18:24):
oh wow
Mario Carneiro (Feb 21 2020 at 18:24):
that's where you will find the theorems
Mario Carneiro (Feb 21 2020 at 18:26):
Oops, prefix is <+:
, suffix is <:+
Yufan Lou (Feb 21 2020 at 18:26):
ah ok
Yufan Lou (Feb 21 2020 at 18:26):
I was only looking in init.list.basic
Yufan Lou (Feb 21 2020 at 18:27):
ah ok prefix_append
already proved
Mario Carneiro (Feb 21 2020 at 18:28):
Oh, looks like you found a hole in the library. The equivalence of list.is_prefix
and list.is_prefix_of
is not proved
Mario Carneiro (Feb 21 2020 at 18:29):
You should just use list.is_prefix
anyway, it has a decidable instance so it's better than a bool function
Mario Carneiro (Feb 21 2020 at 18:29):
but list.is_prefix_of
is in core... maybe now we can finally do something about these bits and bobs
Yufan Lou (Feb 21 2020 at 18:34):
thx y'all, I've finished it
Mario Carneiro (Feb 21 2020 at 18:48):
import data.list.basic data.bool namespace list theorem is_prefix_of_iff {α} [decidable_eq α] : ∀ {l₁ l₂ : list α}, is_prefix_of l₁ l₂ ↔ l₁ <+: l₂ | [] l₂ := ⟨λ _, nil_prefix _, λ _, by cases l₂; exact rfl⟩ | (_::_) [] := ⟨by rintro ⟨⟩, λ h, by cases eq_nil_of_prefix_nil h⟩ | (a::l₁) (b::l₂) := begin rw [is_prefix_of, band_coe_iff, bool.coe_to_bool, is_prefix_of_iff], split, { rintro ⟨rfl, h⟩, exact (prefix_cons_inj _).2 h }, { rintro ⟨l, e⟩, injection e with h₁ h₂, exact ⟨h₁, _, h₂⟩ } end end list
Last updated: Dec 20 2023 at 11:08 UTC