Zulip Chat Archive

Stream: new members

Topic: How to prove decidable_eq for a basic inductive type


Sebastián Galkin (Aug 13 2020 at 20:35):

I have a trivial type:

inductive Foo : Type
| A : Foo
| B : Foo
-- .... a few more constructors with no arguments

Trying to prove it is a fintype I need to prove decidable_eq Foo. How would I do that without listing all possible combinations of members of foo in a long pattern match?

instance : decidable_eq Foo
| Foo.A Foo.A := is_true rfl
| Foo.B Foo.B := is_true rfl
-- .....  and now I still need all the possible false combinations

Alex J. Best (Aug 13 2020 at 20:35):

Add @[derive decidable_eq] on the line before inductive Foo

Alex J. Best (Aug 13 2020 at 20:37):

Over in a different thread https://leanprover.zulipchat.com/#narrow/stream/113489-new-members/topic/integrable_on/near/206626876 we talked about these proofs very recently too.

Sebastián Galkin (Aug 13 2020 at 20:43):

Oh that's how you automatically derive instances! Thank you!

Is this covered in some reference manual?

Bryan Gin-ge Chen (Aug 13 2020 at 20:46):

Sadly, no. There's an open issue for basic docs here: #3533

Chris B (Aug 13 2020 at 20:51):

I've always meant to ask this; why does instance : decidable_eq MyType := by tactic.mk_dec_eq_instance work in some cases when deriving with @[derive decidable_eq] fails? I don't have an example on hand but I swear this is a thing.

Mario Carneiro (Aug 13 2020 at 21:16):

I've never witnessed that. Please share the example if you find it

Sebastián Galkin (Aug 13 2020 at 21:26):

On the same problem, what is the best way to provide a finset for Foo? (goal is still to prove Foo is a fintype). I have this:

elms  := [A, B].to_finset

but it forces me to list explicitly every constructor. What would be a better way?

In general, shouldn't the fact that Foo is a fintype be automatically derivable?

Kenny Lau (Aug 13 2020 at 21:32):

click on the link.

Sebastián Galkin (Aug 13 2020 at 21:50):

I couldn't find a strategy in there that doesn't involve an exhaustive listing of all constructors. Am I missing one?

Mario Carneiro (Aug 13 2020 at 21:50):

this is on my todo list

Mario Carneiro (Aug 13 2020 at 21:51):

ideally you could write @[derive fintype] but the derive handler isn't written

Mario Carneiro (Aug 13 2020 at 21:51):

so you have to list the constructors for now

Sebastián Galkin (Aug 13 2020 at 21:54):

Thanks for your help folks!

Mario Carneiro (Aug 14 2020 at 07:23):

@Sebastián Galkin This has been checked off the todo list as of #3772:

@[derive fintype]
inductive foo (α : Type)
| A : α  foo
| B : α  α  foo
| C : α × α  foo
| D : foo

Kenny Lau (Aug 15 2020 at 17:24):

Mario Carneiro said:

Sebastián Galkin This has been checked off the todo list as of #3772:

@[derive fintype]
inductive foo (α : Type)
| A : α  foo
| B : α  α  foo
| C : α × α  foo
| D : foo

which has now been merged


Last updated: Dec 20 2023 at 11:08 UTC