Zulip Chat Archive
Stream: lean4
Topic: Application type mismatch due to BEq instance of a Prod type
Zhuanhao Wu (Apr 08 2024 at 03:56):
I'm getting a weird error which I'm not really sure what to do about it.
It seems that the function indexOf_eq_length
is expecting certain generated instance, and does not accept instBEqProd. Is there some way I could work around this limitation?
application type mismatch
List.indexOf_eq_length.mp hh
argument
hh
has type
@List.indexOf A instBEqProd i l = List.length l : Prop
but is expected to have type
@List.indexOf A instBEq i l = List.length l : Prop
Here's the MWE I was able to get:
import Mathlib
import Mathlib.Data.List.Basic
variable {n: Nat}
variable {m: Nat}
abbrev A := (Fin n) × (Fin m)
structure CompletionOrder' where
l: List (@A n m)
l_all_inst: ∀i, i ∈ l
theorem all_elements_are_in_completion_order (ex: @CompletionOrder' n m): ∀i, ex.l.indexOf i != ex.l.length := by
intros i
have h' := ex.l_all_inst i
generalize h: ex.l = l
rw [h] at h'
simp; intro hh
apply (l.indexOf_eq_length (a:= i)).mp hh
Kyle Miller (Apr 08 2024 at 04:07):
Oof, that's a tricky one. In the following, convert hh
is supposed to work to handle this issue of there being multiple BEq instances involved, but it's having a hard time synthesizing the necessary LawfulBEq
instances.
theorem all_elements_are_in_completion_order (ex: @CompletionOrder' n m): ∀i, ex.l.indexOf i != ex.l.length := by
intros i
have h' := ex.l_all_inst i
generalize h: ex.l = l
rw [h] at h'
simp; intro hh
apply (l.indexOf_eq_length (a:= i)).mp
convert hh
apply @lawful_beq_subsingleton A _ _ instLawfulBEqInstBEq
exact h'
Kyle Miller (Apr 08 2024 at 04:08):
(There might be a way to back up and try proving this a different way to avoid this obstacle, but at least there's a way to plow through it.)
Kyle Miller (Apr 08 2024 at 04:10):
(In case you haven't seen convert
, it's like exact
but can handle differences between the expected type and the actual type. It tries to handle differences automatically, but anything it can't handle turns into a new goal.)
Zhuanhao Wu (Apr 08 2024 at 04:56):
Right, it seems that going forward, (by using unfolding etc), I ended up having to show two styles of match
are equivalent, and I don't think I want to spend time on it. So for now, I decided to use a structure
that wraps things up, and use the generated DecidableEq
instead
Thank you!
Eric Wieser (Apr 08 2024 at 08:24):
Something small that would help here is giving docs#instBEq a longer name
Eric Wieser (Apr 08 2024 at 08:24):
Perhaps DecidableEq.toBEq
Zhuanhao Wu (Apr 08 2024 at 13:12):
Eric Wieser said:
Something small that would help here is giving docs#instBEq a longer name
Not sure if this is what you meant, but adding the following would work as well
instance instructionBEq : BEq prog.Instruction := instBEq
Zhuanhao Wu (Apr 08 2024 at 13:14):
(And equivalently?) We can provide it explicity to the theorem:
theorem all_elements_are_in_completion_order' (ex: @CompletionOrder' n m): ∀i, @List.indexOf (@A n m) (instBEq) i ex.l != ex.l.length := by
intros i
have h' := ex.l_all_inst i
generalize h: ex.l = l
rw [h] at h'
simp; intro hh
apply (l.indexOf_eq_length (a:= i)).mp hh
assumption
Kyle Miller (Apr 08 2024 at 14:18):
Eric Wieser said:
Perhaps
DecidableEq.toBEq
I think it will be instBEqOfDecidableEq
in the next Lean release at least.
Last updated: May 02 2025 at 03:31 UTC