Zulip Chat Archive
Stream: lean4
Topic: How to indicate empty matches in Lean 4
François G. Dorais (Jan 05 2021 at 11:22):
In Lean 3, a period can be used to indicate an empty match:
inductive test : bool → Type | of_tt : test tt
def test_ff_is_empty : test ff → empty .
Is there a similar thing in Lean 4? I can make it work using tactic mode:
inductive Test : Bool → Type | ofTrue : Test true
def testFalseIsEmpty : Test false → Empty := by {intro x; cases x}
Since Test has a parameter, using recursors directly is a major pain. Nothing else I tried seems to work.
François G. Dorais (Jan 05 2021 at 12:01):
Perhaps I should have waited a few minutes and posted to #lean4
Notification Bot (Jan 05 2021 at 12:02):
This topic was moved here from #general > How to indicate empty matches in Lean 4 by Rob Lewis
Mario Carneiro (Jan 05 2021 at 12:04):
I started trying to port logic.basic and got stuck on the very first proof for this reason :)
Sebastian Ullrich (Jan 05 2021 at 12:07):
def testFalseIsEmpty (t : Test false) : Empty := nomatch t
Sebastian Ullrich (Jan 05 2021 at 12:07):
Zero-case match
doesn't exactly work after we removed the end
token from it, so a new keyword it is
Mario Carneiro (Jan 05 2021 at 12:08):
We use .
in lean3
Sebastian Ullrich (Jan 05 2021 at 12:11):
Which really is a workaround using a feature no-one uses in any other case. I much prefer this very explicit form.
Mario Carneiro (Jan 05 2021 at 12:12):
Does it still create equation lemmas? In lean 3 there is a difference between match and def match in the equation lemmas you get out
Jannis Limperg (Jan 05 2021 at 12:13):
Is this equivalent to Agda's solution? They have a separate pattern for impossible matches; in Lean it would look like this:
def testFalseIsEmpty (t : Test false) : Empty
| ()
The paper about Agda's method argued, afair, that having a separate form for this is crucial, particularly when the impossibility only becomes apparent after you've matched on some other things.
Mario Carneiro (Jan 05 2021 at 12:14):
Obviously we've got by in lean 3 without having to explicitly indicate this, although occasionally lean will miss an impossible case in a dependent pattern match situation like matching on fin 3
Sebastian Ullrich (Jan 05 2021 at 12:25):
Mario Carneiro said:
Does it still create equation lemmas? In lean 3 there is a difference between match and def match in the equation lemmas you get out
Equation lemmas are TBD AFAIK. But syntactic equations are expanded to match
, so there should not be any difference: https://github.com/leanprover/lean4/blob/master/src/Lean/Elab/Binders.lean#L415-L442
Jacques Carette (Jan 05 2021 at 20:15):
Yes, @Jannis Limperg , that is equivalent to Agda's solution.
Leonardo de Moura (Jan 05 2021 at 20:36):
The paper about Agda's method argued, afair, that having a separate form for this is crucial, particularly when the impossibility only becomes apparent after you've matched on some other things.
It is not crucial for Lean since we can have nested (dependent) match
-expressions. We also have tactics (i.e., we can always use by cases x
).
I consider this feature as a very low priority.
Jannis Limperg (Jan 05 2021 at 20:51):
That's fair -- I guess in Lean we can always give the case tree that Agda compiles to. Thanks for the responses!
Last updated: Dec 20 2023 at 11:08 UTC