[Agda] struggling `with'
Sergei Meshveliani
mechvel at botik.ru
Fri Jan 2 14:40:53 CET 2015
People,
After two days struggle against `with' in my example, I find the
following way out:
---------------------------------------------------------
foo ... = prove (k ≟ k')
where
...
case≈ : k ≈ k' →
ins kv (ins ku (k'w ∷ ps)) =pn ins (k , ckvu) (k'w ∷ ps)
case≈ k≈k' =
begin-pn
ins kv (ins ku (k'w ∷ ps)) =pn[ =pn-reflexive $
PE.cong (ins kv) e1 ]
ins kv ((k' , ckuw) ∷ ps) =pn[ =pn-reflexive e2 ]
(k' , comb k v ckuw) ∷ ps =pn[ e0 ∷pn =pn-refl ]
(k' , comb k ckvu w) ∷ ps =pn[ =pn-reflexive $ PE.sym e3 ]
ins (k , ckvu) (k'w ∷ ps)
end-pn
where
e0 : (k' , comb k v ckuw) =p (k' , comb k ckvu w)
e0 = (≈refl , sym-assoc-comb)
e1 : ins ku ((k' , w) ∷ ps) ≡ (k' , ckuw) ∷ ps
e1 with k ≟ k'
... | yes _ = PE.refl
... | no k≉k' = ⊥-elim $ k≉k' k≈k'
e2 : ins kv ((k' , ckuw) ∷ ps) ≡ (k' , comb k v ckuw) ∷ ps
e2 with k ≟ k'
... | yes _ = PE.refl
... | no k≉k' = ⊥-elim $ k≉k' k≈k'
e3 : k'w ∷ (ins (k , ckvu) ps) ≡ ins (k , ckvu) (k'w ∷ ps)
e3 with k ≟ k'
... | no _ = PE.refl
... | yes k≈k' = ⊥-elim $ k≉k' k≈k'
------------------------------------------------
case≉ : ¬ k ≈ k' →
ins kv (ins ku (k'w ∷ ps)) =pn ins (k , ckvu) (k'w ∷ ps)
case≉ k≉k' = ...
-- a similar junk
------------------------------------------------
prove : Dec (k ≈ k') → ins kv (ins ku (k'w ∷ ps)) =pn
ins (k , comb k v u) (k'w ∷ ps)
prove (no k≉k') = case≉ k≉k'
prove (yes k≈k') = case≈ k≈k'
----------------------------------------------------------------------
The code is type-checked, but looks ugly.
For example, e1, e2, e3 have the same implementation
(each of them stupidly asking "k ≟ k'" despite that k≈k' is ready).
I expected that "with k ≟ k'" needs to be asked not more than once in
case≈. But I fail to arrange this.
For example,
e00 : ins kv (ins ku (k'w ∷ ps)) ≡ (k' , comb k v ckuw) ∷ ps
e00 with k ≟ k'
... | yes _ = PE.refl
... | no k≉k' = ⊥-elim $ k≉k' k≈k'
presents the two steps of normalization for `ins' ('ins' is applied
twice in the LHS, and its implmentation asks "k ≟ k'"),
and the value (k' , comb k v ckuw) ∷ ps
is the normal form.
But Agda-2.4.2.2 does not see this, and rejects this proof.
To prove e00, I need to split it to the two equations, and to apply
"with k ≟ k'" for each equation.
Can the goal be written in a nicer way?
Thanks,
------
Sergei
More information about the Agda
mailing list