Zulip Chat Archive

Stream: mathlib4

Topic: zmod decidability


Heather Macbeth (Dec 01 2023 at 15:00):

I'm very confused by a decidability failure involving ZMod, see below. The failure is very fragile - - reversing argument order makes it go away, as does removing an intro/revert pair, changing ZMod to Fin, or changing the associativity in P. I was also not able to make it smaller by removing clauses of P (I'm not sure I tried each clause, but I tried several).

Any ideas what the issue is here?

import Mathlib.Data.ZMod.Basic
import Mathlib.Tactic.DeriveFintype

structure Foo :=
  (x : ZMod 3)
  (i : ZMod 2)
deriving Fintype, DecidableEq

abbrev f (e : Foo) : Finset Foo := {e}

abbrev P (j k : ZMod 2) (x : ZMod 3) : Prop :=
  let a := Foo.mk 0 0
  ¬ ((Foo.mk x 0  0, 0  Foo.mk 0 0  0, k  x, 0  f (Foo.mk 0 0))
   (Foo.mk 0 0  0, 0  Foo.mk 0 k  0, j  0, 0  f (Foo.mk 0 k)  0, 0  f (Foo.mk 0 j))
   (Foo.mk 0 0  x, 0  Foo.mk 0 j  a  0, 0  f (Foo.mk 0 j)  0, 0  f a))

example {j k : ZMod 2} {x : ZMod 3} : P j k x := by
  dsimp only [P]
  intro h
  revert x j k
  decide -- fails

-- bug disappears after reversing argument order
example {x : ZMod 3} {j k : ZMod 2} : P j k x := by
  dsimp only [P]
  intro h
  revert x j k
  decide -- works

-- bug disappears after pattern-matching part of the goal
example {j k : ZMod 2} {x : ZMod 3} : P j k x := by
  dsimp only [P]
  intro h1, h2
  revert x j k
  decide -- works

-- bug disappears without spurious introduction/reversion of negation in goal
example {j k : ZMod 2} {x : ZMod 3} : P j k x := by
  dsimp only [P]
  revert x j k
  decide -- works

-- bug disappears if use `Fin` rather than `ZMod`
example {j k : Fin 2} {x : Fin 3} : P j k x := by
  dsimp only [P]
  intro h
  revert x j k
  decide -- works

Eric Wieser (Dec 01 2023 at 15:14):

This is a lot less painful to debug as

abbrev nP (j k : ZMod 2) (x : ZMod 3) : Prop :=
  let a := Foo.mk 0 0
  ((Foo.mk x 0  0, 0  Foo.mk 0 0  0, k  x, 0  f (Foo.mk 0 0))
   (Foo.mk 0 0  0, 0  Foo.mk 0 k  0, j  0, 0  f (Foo.mk 0 k)  0, 0  f (Foo.mk 0 j))
   (Foo.mk 0 0  x, 0  Foo.mk 0 j  a  0, 0  f (Foo.mk 0 j)  0, 0  f a))

abbrev P (j k : ZMod 2) (x : ZMod 3) : Prop :=
  ¬ nP j k x

Heather Macbeth (Dec 01 2023 at 15:19):

Sorry Eric, I didn't understand this comment ... what is the issue? (Thanks for looking)

Eric Wieser (Dec 01 2023 at 15:20):

Oh I have no idea what the issue is, but that makes the goal view at the failure a lot shorter!

Heather Macbeth (Dec 01 2023 at 15:20):

Ah! :)

Mario Carneiro (Dec 01 2023 at 19:08):

It appears to be an issue with the instance size limit. set_option synthInstance.maxSize 200 in decide fixes the issue


Last updated: Dec 20 2023 at 11:08 UTC