[Agda] Value-recursive records?

Andreas Abel andreas.abel at ifi.lmu.de
Wed May 20 09:09:23 CEST 2020


 > My current approach is to make a size-indexed version of D, and build
 > SomeRec for size n out of SomeRec for size < n. But this is dramatically
 > increasing the complexity of what I'm doing, and I'm having to use
 > Brouwer ordinals to get size bounds on what I'm doing.

Either this, or you can experiment with Agda's sized types, but I cannot 
foretell whether they will work for your case.

Best,
Andreas

On 2020-05-18 21:52, Joey Eremondi wrote:
> Disclaimer: X-posted on Stack Overflow: 
> https://stackoverflow.com/questions/61877871/agda-constructing-a-recursive-record-value
> 
> I'm wondering, is it possible to have records whose *values* depend on 
> each other, without being recursively defined in terms of types?
> 
> Basically, I have a record type that looks like this:
> 
> record SomeRec (a : Set) : Set where
>     method1 : a -> a -> Foo
>     method2 : a -> a -> Bar
>    ...
>    method n : a -> a -> Baz
> 
> where n is large enough that I want to actually bundle all of these up 
> as records, instead of just having a bunch of mutually recursive 
> functions. (Also, I'm using SomeRec as an instance argument).
> 
> Notably, SomeRec is not recursive: none of its fields types refer to 
> SomeRec.
> 
> Right now, I have a Description D, where FD : Set -> Set is the functor 
> described by D. What I'm trying to show is the following:
> 
>    muRec : ( FRec : (a : Set) -> SomeRec a -> SomeRec (FD a) ) -> 
> SomeRec (mu D)
> 
> That is, if I can take a (SomeRec a) to a (SomeRec (F a)), then I can 
> tie the knot recursively and show the instance for the whole thing.
> 
> In principle this can be done: each recursive call to a field of SomeRec 
> would happen with strictly smaller arguments. If I were to just have 10 
> mutually recursive methods, it would work. But if I try to build the 
> record, I end up passing muRec to FRec *without its arguments decreasing*.
> 
> So, what I'm wondering is: is there a way to show that this is 
> well-founded? Can induction or coinduction help, even though the record 
> type is not inductive or coinductive?
> 
> My current approach is to make a size-indexed version of D, and build 
> SomeRec for size n out of SomeRec for size < n. But this is dramatically 
> increasing the complexity of what I'm doing, and I'm having to use 
> Brouwer ordinals to get size bounds on what I'm doing. So I'm wondering 
> if there's a better way.
> 
> Thanks!
> 
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
> 


More information about the Agda mailing list