I have files `A.v`

and `B.v`

. In a third file, `C.v`

, I have `Require Import A B.`

which yields a universe problem. To fix it, I added `Require A.`

as the first line of `B.v`

, and all problems are gone. Any idea how that is even possible? (if somebody wants to glance over the real files, the added line is here)

A imposes some constraint

inference for B tries to impose a contradictory constraint but if forced to avoid it still succeeds

eg

```
Universes i j.
Module B.
Axiom f : Type@{i} -> nat.
Definition g := f : Type@{j} -> nat.
Print g.
End B.
Module A.
Constraint j < i.
End A.
```

if A is last as I wrote, `Print g`

says `= f`

and the Constraint fails

if you move A before B, Print g says `= fun x : Type => f x`

ie it had to eta expand (because conversion is not contravariant in the domain of forall)

the difference in generated terms is specific to the example, it's also possible that it unified the wrong universes instead of avoiding the eta expansion

Last updated: Oct 01 2023 at 19:01 UTC