[Agda] How safe is Type:Type?

Michael Shulman shulman at sandiego.edu
Thu Mar 9 11:37:10 CET 2017


Pardon my ignorance, but I don't understand why anyone would accept the
definition of "empty".  The datatype D is not recursive; it's basically of
the form

data D : Set where
  c : X -> D

for some fixed type X, which just happens to be large in this case.  So its
induction principle says that we get a map D -> Y whenever we have a map X
-> Y.  What justifies any sort of recursive call?


On Wed, Mar 8, 2017 at 2:59 PM, Stefan Monnier <monnier at iro.umontreal.ca>
wrote:

> >   data D : Set where
> >     c : (f : (A : Set) → A → A) → D
> >   -- Structural recursion with  f args < c f  is no longer valid.
> >   -- We should not be able to demonstrated that D is empty.
>
> Coq lets us define this datatype (in Prop).
>
> >   empty : D → ⊥
> >   empty (c f) = empty (f D (c f))
>
> But rejects this definition:
>
>     Error:
>     Recursive definition of empty is ill-formed.
>     In environment
>     empty : D -> False
>     x : D
>     f : forall A : Prop, A -> A
>     Recursive call to empty has principal argument equal to
>     "f D (c f)" instead of a subterm of "x".
>     Recursive definition is:
>     "fun x : D => match x with
>                   | c f => empty (f D (c f))
>                   end".
>
> Not sure exactly what is the rule they use to decide whether a recursive
> call is considered as valid structural recursion.  I suspect it depends
> on the notion of a "large inductive type" or something along these lines.
>
>
>         Stefan
>
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.chalmers.se/pipermail/agda/attachments/20170309/69767746/attachment.html>


More information about the Agda mailing list