Open yallop opened 3 years ago
In fact, the following simpler program suffers from the same issue:
data D : Type where Abs : (D -> Void) -> D
app : D -> D -> Void
app (Abs f) d = f d
omega : D
omega = Abs (\x => app x x)
total
Omega : Void
Omega = app omega omega
That last one is properly rejected if you use %default total
.
The totality checker somehow forgets to check that D
is positive
despite being in Omega
's dependency graph. I've tried to track down
this issue in the past but haven't found where the problem is.
In Agda, this piece of code is rejected because the universe of the type of the constructor Abs
is Set_1
, which is higher than Set_0
, the universe of the data type itself. Therefore, I think that adding universe levels to Idris might solve this problem, provided that data type definitions like this are rejected.
data D : Type where Abs : (D = e) -> (e -> Void) -> D
lam : (D -> Void) -> D
lam f = Abs Refl f
app : D -> D -> Void
app (Abs Refl f) d = f d
omega : D
omega = lam (\x => app x x)
total
Omega : Void
Omega = app omega omega
still causes problems
While trying to understand the differences between Agda's and Idris's positivity checkers, I came across Andreas Abel's message from 2012, which passes the totality checker when translated to Idris: