[Agda] Weird behaviour with record normalisation
Simon Foster
s.foster at dcs.shef.ac.uk
Fri Nov 12 09:56:31 CET 2010
Hi,
> While the terms differs only in their hidden argument, they are
> nontheless unequal. Hidden arguments are not irrelevant.
Sure, and I understand that's why x can't be used as the inhabitant for
"fails". What I don't understand is how function "fails" can be given
type "Fin (R2.g {R1C (R1.f1 r1) (suc (R1.f2 r1))} r2)" at all, when Agda
says this isn't a valid type (try deducing it), since r2 is not indexed
by "R1C (R1.f1 r1) (suc (R1.f2 r1))" but by r1.
Fundamentally, I don't understand why "mg r2" normalises to r2 when the
two have different types (even though they they contain the same
fields), namely "R2 (R1C (R1.f1 r1) (suc (R1.f2 r1))})" and "R2 r1"
respectively.
Thanks,
-Si.
> On 11/11/10 5:32 PM, Simon Foster wrote:
> > Hi,
> >
> > I'm experiencing some strange behaviour when trying to manipulate the
> > fields of a record parametrised over another record. Consider this toy
> > example:
> >
> > module Test where
> >
> > open import Data.Fin
> > open import Data.Nat
> >
> > record R1 : Set where
> > constructor R1C
> > field
> > f1 : ℕ
> > f2 : ℕ
> >
> > record R2 (r1 : R1) : Set where
> > constructor R2C
> > open R1 r1
> > field
> > g : ℕ
> >
> > mf : R1 → R1
> > mf r1 = R1C (R1.f1 r1) (suc (R1.f2 r1))
> >
> > mg : ∀ {r1 : R1} → R2 r1 → R2 (mf r1)
> > mg r2 = R2C (R2.g r2)
> >
> > fails : ∀ r1 (r2 : R2 r1) → Fin (R2.g r2) → Fin (R2.g (mg r2))
> > fails r1 r2 x = {!x!}
> >
> > Under the current darcs version of Agda, the function "fails" cannot be
> > inhabited. The type of this function normalises to "Fin (R2.g r2)",
> > which it ought to be possible to inhabit with x. However on closer
> > inspection of the hidden variables the actual type is "Fin (R2.g {R1C
> > (R1.f1 r1) (suc (R1.f2 r1))} r2)", that is r1 has been instantiated to
> > "R1C (R1.f1 r1) (suc (R1.f2 r1))", and therefore the output doesn't seem
> > to be a valid type since r2 is parametrised over r1.
> >
> > I'm not sure what's going on here, but somehow the function mg seems to
> > be normalising in a strange way - "mg r2" normalises to r2, but has type
> > "R2 (R1C (R1.f1 r1) (suc (R1.f2 r1)))" which is not equal to "R2 r1".
> > Either that or there is somehow two versions of r2.
More information about the Agda
mailing list