[Agda] record field ambiguity
Sergei Meshveliani
mechvel at botik.ru
Thu May 9 13:07:45 CEST 2013
Dear all,
Can you, please, explain the checker behavior
(Agda-2.3.2, MAlonzo, lib-0.7)
in the below program?
(1) M.ResidueLI is a record parameterized by (I : DReductionLIdeal);
the function residueSetoid takes rdI : DReductionLIdeal
and uses
rCarr = M.ResidueLI rdI as a carrier for operations.
But I need to use Res-rdI = M.ResidueLI rdI
as a module, with the value rdI instantiated, and use the field value
resRepr of Res-rdI.
And my attempts with module Res-rdI = ResidueLI rdI,
with ResidueLI.resRepr rdI,
with resRepr = ResidueLI.resRepr rCarr
-- are rejected, because the checker requires for rdI some strange
type instead of DReductionLIdeal declared for rdI.
The philosophy is that the same value c : C is a representative
resRepr r,
for r : ResidueLI I over C, с is considered "modulo and ideal I",
and there are possible different I for the same C.
And C is defined globally in the parametric module ResidueLIPack
where ResidueLI is defined.
(2) Without understanding of what is happening, I tried to continue: to
import resRepr without instantiating rdI to ResidueLI,
and to see further.
Then, it goes up to
f x = resRepr (resI x) -- (*),
and reports there "unsolved metas".
Then, I use
g : rCarr -> C
g = resRepr
(C is the base carrier, rCarr is the carrier of the ResidueLI domain
over C),
and apply g instead of resRepr in (*). And it is type checked!
I worry more of the point (1), because resRepr needs to be taken by
this concrete parameter value rdI, and the checker forces me to ignore
this rdI value.
And as I do not understand this, the further usage of ResidueLI looks
like senseless.
But the point (2) is also interesting.
By the way, instead of resRepr (resI x),
can one write some equivalent of (resRepr : rCarr -> C) (resI x)
(to insert a signature in-place) ?
The full precise code is on
http://botik.ru/pub/local/Mechveliani/agdaNotes/rep4.zip
The modules code is small, because `postulate' is set for this purpose.
This letter is copied in readme.agda of this archive.
Compilation:
agda -c -i . -i $agdaStLib +RTS -K200m -M6G -H6G -RTS Main.agda,
where $agdaStLib points to Standard library.
The responsible fragment is in the end of AlgClasses3.agda,
and looks like this:
------------------------------------------------------------------
module IdealPack (c l : Level) (upR1 : UpRingWithOne c l)
where
...
record DReductionLIdeal : Set (setoidLevel c l)
where
field upLeftIdeal : UpLeftIdeal
...
record ResidueLI (I : DReductionLIdeal) : Set (setoidLevel c l)
where
constructor resI
field preRepr : C
dReductionIdeal = I
open DReductionLIdeal I
private reduction = reductionByGens
open ReductionByLIdealGens reduction
using (in-I) renaming (genRemainder to gRem)
resRepr : C
resRepr = gRem preRepr
module ResidueLIPack (c l : Level) (upR1 : UpRingWithOne c l)
where -- Items for
ResidueLI
module M = IdealPack c l upR1
open M using (Subring; module Subring; LeftIdeal; module LeftIdeal;
DReductionLIdeal; module DReductionLIdeal; ResidueLI;
module ResidueLI; resI
)
R1 = UpRingWithOne.ringWithOne upR1
open RingWithOne R1 using (_≈_; _-_)
renaming (Carrier to C; isEquivalence to ≈equiv)
residueSetoid : DReductionLIdeal → Setoid (setoidLevel c l) 0L
residueSetoid rdI =
record{ Carrier = rCarr; _≈_ = _=r_; isEquivalence = isEq-r }
where
rCarr = ResidueLI rdI
-- module Res-rdI = ResidueLI rdI
-- open Res-rdI using (resRepr)
-- resRepr = ResidueLI.resRepr rCarr
open ResidueLI using (resRepr)
open DReductionLIdeal rdI using ()
renaming (leftIdeal to I; reductionByGens to reduction)
open LeftIdeal I using (extSubring)
open Subring extSubring using (extSubDSet)
open SubDSet extSubDSet using (member?; memberC?)
congMem : {x y : C} → x ≈ y → memberC? x ≡ memberC? y
congMem x=y = Π.cong member? x=y
_-rr_ : rCarr → rCarr → C
_-rr_ = _-_ on resRepr
postulate _=r_ : Rel rCarr _
postulate isEq-r : IsEquivalence _=r_
g : rCarr -> C
g = resRepr
f : C -> C
f x = resRepr (resI x) -- (*)
----------------------------------------------------------------------
Thank you in advance for explanation,
------
Sergei
More information about the Agda
mailing list