Zulip Chat Archive
Stream: mathlib4
Topic: by_contra when goal is an implication
Dan Velleman (Oct 10 2022 at 20:12):
It looks to me like by_contra doesn't work if the goal is an implication. Consider this (silly) example:
example (P : Prop) : P → P := by
by_contra
I get the error message tactic 'apply' failed, failed to unify (¬?p → False) → ?p with P → P.
I assume what's going on here is that by_contra is doing apply Classical.byContradiction, which fails because it tries to unify Classical.byContradiction with P → P and the unification fails. However, apply Classical.byContradiction _ would succeed--the blank gives Lean the clue that it should be applying Classical.byContradiction to something to get P → P. So should by_contra be redefined to use apply Classical.byContradiction _?
Mario Carneiro (Oct 10 2022 at 20:32):
I think it should be refine Classical.byContradiction ?_ then
Mario Carneiro (Oct 10 2022 at 20:32):
apply always seems to be problematic in general code because of this issue
Dan Velleman (Oct 10 2022 at 20:36):
What's the difference between _ and ?_?
Mario Carneiro (Oct 10 2022 at 20:38):
?_ in refine become new proof goals, _ have to be solved by unification. So refine Classical.byContradiction _ would be an error because it can't infer the rest of the proof
Dan Velleman (Oct 10 2022 at 20:41):
Thanks.
Last updated: May 02 2025 at 03:31 UTC