Zulip Chat Archive
Stream: general
Topic: hypotheses in term and tactic mode
Sorawee Porncharoenwase (May 05 2021 at 04:09):
Consider:
inductive day : Type
| mon : day
| tues : day
| wed : day
| thu : day
| fri : day
| sat : day
| sun : day
def foo : day → ℕ
| day.sun := 1
| d :=
begin
sorry
end
Is there a way to get the fact that d is not day.sun at sorry?
Similarly:
def foo (n : ℕ) : ℕ :=
if n > 13 then
begin
sorry
end
else
42
Is there a way to get the fact that n > 13 at sorry?
My workaround for both issues to to write the entire thing in the tactic mode. For the first one, I can use cases, and deal with all non day.sun with all_goals while retaining the hypothesis that d is not day.sun. For the second one, I can use by_cases to get the desired hypothesis. However, it would be nice if there is a better way to do things.
Yakov Pechersky (May 05 2021 at 04:12):
If you do if h : d = day.sun then _ else _ in the then case you should be able to use foo.no_confusion to generate whatever you need using the h hypothesis
Yakov Pechersky (May 05 2021 at 04:13):
In the def foo case, by writing if h : n > 13 then _ else 42, the dependent hypothesis h : n > 13 will be available in the then case. In the else case, you'll have the negation of that hypothesis
Sorawee Porncharoenwase (May 05 2021 at 04:14):
thanks! :)
Yakov Pechersky (May 05 2021 at 04:15):
if c then p else q statements get interpreted as ite c p q. The dependent if h : c ... instead get interpreted as dite c ....
Sorawee Porncharoenwase (May 05 2021 at 04:19):
well, that solves the second issue, but for the first one, my above example is probably too minimal. It would be very inconvenient if I can't use pattern matching, since the function is something like:
def foo : sth → ℕ
| (sth.a (a.b (b.c x))) := x
| y := -- deal with sth.a (a.c ...), sth.a (a.d ...), sth.b ..., sth.c ...
sorry
Mario Carneiro (May 05 2021 at 04:52):
The usual workaround I use for this is to use cases and then all_goals { proof } in all the cases other than the main one. That way you have access to the fact that y is some particular constructor different from sth.a and so on
Mario Carneiro (May 05 2021 at 04:53):
the short answer is "no, lean does not provide a way to know that y is not sth.a in the wildcard case"
Last updated: May 02 2025 at 03:31 UTC