Zulip Chat Archive

Stream: general

Topic: lemma surprisingly not proved by rfl


Chris Hughes (Jul 02 2018 at 15:13):

Is there a shorter way to prove this and why isn't rfl working? Is it because the type of the lhs is with_bot ℕ and the rhs is option ℕ? (The types are defeq)

import algebra.ordered_group

example : (0 : with_bot ) = some 0 := rfl -- doesn't work

example : (0 : with_bot ) = some 0 :=
by unfold has_zero.zero add_monoid.zero has_one.one monoid.one
  add_comm_monoid.zero semiring.zero ordered_semiring.zero linear_ordered_semiring.zero
  decidable_linear_ordered_semiring.zero comm_semiring.zero

Chris Hughes (Jul 02 2018 at 15:32):

Looked a little deeper and it seems (0 : with_bot ℕ) is defeq to some (1 : multplicative ℕ). I feel like perhaps the fact that this lemma is not rfl means the definition ought to be changed.

Mario Carneiro (Jul 02 2018 at 20:56):

Oh, this is weird! It is in fact the case that (0 : with_bot ℕ) = some 0, but the tactics are very confused about it. Here's simp proving that they are different, and then the kernel says it's a wrong proof:

example : (0 : with_bot ℕ) ≠ (some 0 : option ℕ) :=
show some _ ≠ some 0, begin
  simp [multiplicative.monoid],
end

Mario Carneiro (Jul 02 2018 at 20:56):

I will add a lemma for it

Mario Carneiro (Jul 02 2018 at 20:57):

as a slight hack, you can instead prove it by dec_trivial

Kevin Buzzard (Jul 02 2018 at 21:06):

failed to synthesize type class instance for
⊢ has_zero (with_bot ℕ)

-- am I missing an import?

Mario Carneiro (Jul 02 2018 at 21:11):

algebra.ordered_group

Mario Carneiro (Jul 02 2018 at 21:23):

@Sebastian Ullrich Minimized:

def nat2 := nat
instance : has_one nat2 := ⟨(0 : ℕ)⟩
example : (0 : ℕ) ≠ (1 : nat2) := by simp

Mario Carneiro (Jul 02 2018 at 21:24):

In this example example : (0 : ℕ) = (1 : nat2) := rfl also fails

Sebastian Ullrich (Jul 02 2018 at 21:36):

@Mario Carneiro Thanks, this seems to be an imprecise term pattern match at https://github.com/leanprover/lean/blob/master/src/library/type_context.cpp#L2906-L2907

Mario Carneiro (Jul 02 2018 at 21:37):

Ooh, that's a tricky one. I'd hate for you to have to do defeq checks constantly there out of paranoia for tricks like I showed...

Sebastian Ullrich (Jul 02 2018 at 21:49):

Yeah. It's probably not a good idea in general to declare instances on semireducible defs like multiplicative. Is it feasible to change that?

Mario Carneiro (Jul 02 2018 at 21:49):

Not really, I mean that is the point

Sebastian Ullrich (Jul 02 2018 at 21:49):

Sorry, I meant making it irreducible or a newtype.

Mario Carneiro (Jul 02 2018 at 21:50):

Probably not. An important aspect of the semireducible part is that you can prove multiplicative versions of additive theorems by defeq

Mario Carneiro (Jul 02 2018 at 21:51):

It's fine as long as it gives way to a sufficiently forceful "unfold", but I'm not sure irreducible will

Mario Carneiro (Jul 02 2018 at 21:52):

I would say that users should avoid having things of type multiplicative A in their goal at all

Mario Carneiro (Jul 02 2018 at 21:54):

so I think I will change the definition of the with_bot instance so that it unfolds directly rather than showing the multiplicative stuff

Mario Carneiro (Jul 02 2018 at 22:56):

fixed


Last updated: Dec 20 2023 at 11:08 UTC