@dselsam The method `try_user_congr` was leaking a temporary
meta-variable into the formula. The problem in the congruence lemma
```
dif_ctx_simp_congr :
∀ {α : Sort u_1} {b c : Prop} [dec_b : decidable b] {x : b → α} {u : c → α} {y : ¬b → α} {v : ¬c → α}
(h_c : b ↔ c),
(∀ (h : c), x (h_c.mpr h) = u h) →
(∀ (h : ¬c), y ((not_iff_not_of_iff h_c).mpr h) = v h) → dite b x y = dite c u v
```
when the hypothesis `(∀ (h : c), x (h_c.mpr h) = u h)` is processed,
`h_c` is still unassigned. `h_c` was being assigned in a second
loop (the one that I deleted). Do you see any reason for having this
second pass? I think it is an optimization, we can skip the potentially
expensive
```
expr hyp = finalize(m_ctx, rel, r_congr_hyp).get_proof();
expr pf = local_factory.mk_lambda(hyp);
```
if the expression has not been simplified.
Anyway, I removed this code and merged both loops.
I don't think it should impact performance since we barely use custom
congruence lemmas.
19 lines
489 B
Text
19 lines
489 B
Text
import data.hash_map
|
||
|
||
open hash_map
|
||
|
||
universes u v w
|
||
section
|
||
parameters {α : Type u} {β : α → Type v} (hash_fn : α → nat)
|
||
parameter [decidable_eq α]
|
||
|
||
attribute [congr] dif_ctx_simp_congr
|
||
attribute [congr] if_ctx_simp_congr
|
||
|
||
theorem mem_insert' : Π (m : hash_map α β) (a b a' b'),
|
||
sigma.mk a' b' ∈ (m.insert a b).entries ↔
|
||
if a = a' then b == b' else sigma.mk a' b' ∈ m.entries
|
||
| ⟨hash_fn, size, n, bkts, v⟩ a b a' b' :=
|
||
by simp[hash_map.insert]; exact sorry
|
||
|
||
end
|