[Agda] How safe is Type:Type?
Stefan Monnier
monnier at iro.umontreal.ca
Wed Mar 8 23:59:51 CET 2017
> 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
More information about the Agda
mailing list