Zulip Chat Archive
Stream: general
Topic: proving properties of recursive functions with let/match
Alexandre Rademaker (Mar 09 2021 at 13:36):
After some experimenting I realise that using either let or match in a recursive definition like this is a lousy idea.
Thank you @Kevin Buzzard for your ideas. But the main point here is precise that your second -- and the standard definition -- for splitAt traverses the list twice. The implementation of splitAt with only one traverse of the list was proposed as an exercise in https://www.amazon.com/Thinking-Functionally-Haskell-Richard-Bird/dp/1107452643. During the Haskell course, I am trying to use Lean to formalize some informal (equational) proofs from the book. But clearly, not all of them are obvious to formalize...
Kevin Buzzard (Mar 09 2021 at 14:26):
I conjecture that most of them will not be too bad if you know some of the tricks. Would you like to post some #mwe examples of things which you think might not be obvious to formalise?
Alexandre Rademaker (Mar 09 2021 at 18:48):
Sure, I will share more examples. The problem is that once functions are optimized in a way or another, proofs became more difficult, as the example above. But for some properties such as map f . map g = map (f . g)
we done, see https://github.com/emap-aa/demo-lean/blob/main/src/fp.lean#L60-L69
Alexandre Rademaker (Mar 23 2021 at 13:43):
One more case @Kevin Buzzard , the reverse (reverse xs)
was fine.
theorem rev_rev_id {a : Type } (xs : list a) : (reverse ∘ reverse) xs = id xs :=
begin
induction xs with b bs hi,
simp [reverse,append],
unfold comp, rw reverse,
unfold comp at hi,
rw rev_aux,
rw hi, simp,
end
But why I can't use the point-free Haskell style in the declaration?
theorem rev_rev_id : (reverse ∘ reverse) = id := sorry
Eric Wieser (Mar 23 2021 at 13:45):
Because lean doesn't know what type of list you're stating it aabout
Eric Wieser (Mar 23 2021 at 13:45):
(reverse ∘ reverse) = (id : list a → list a)
should work
Alexandre Rademaker (Mar 23 2021 at 13:46):
Hum, but Lean understood #check reverse ∘ reverse = id
.
Eric Wieser (Mar 23 2021 at 13:46):
yes, but it put wildcards in. Those aren't allowed in lemma statements.
Alexandre Rademaker (Mar 23 2021 at 13:48):
Thank you
Alexandre Rademaker (Mar 23 2021 at 13:48):
Turns out the proof is more complex anyway.
Yakov Pechersky (Mar 23 2021 at 14:43):
The proof should only have two more steps of
funext,
rw [function.comp_app, id.def],
and then your proof above.
Last updated: Dec 20 2023 at 11:08 UTC