177 lines
3.2 KiB
Text
177 lines
3.2 KiB
Text
set_option pp.all true
|
||
universe variables u v w
|
||
|
||
namespace X1
|
||
|
||
#print "\n1. ?U does not unify with anything"
|
||
|
||
inductive foo (A : Type u) (B : Type (v+1))
|
||
| mk : A → B → foo
|
||
|
||
#check @foo.{u v} -- : Type (max u (v+1))
|
||
|
||
end X1
|
||
|
||
namespace X2
|
||
|
||
#print "\n2. ?U unifies with a constant, no others above: done"
|
||
|
||
inductive bar (A : Sort 2) : Sort 2
|
||
| mk : A → bar
|
||
|
||
inductive foo
|
||
| mk : Type → bar foo → foo
|
||
|
||
#check @foo -- : Type 1
|
||
|
||
end X2
|
||
|
||
namespace X3
|
||
#print "\n3. ?U unifies with a constant, and one above: error"
|
||
|
||
inductive bar (A : Sort 2) : Sort 2
|
||
| mk : A → bar
|
||
|
||
inductive foo (A : Sort u)
|
||
| mk : A → bar foo → foo
|
||
|
||
end X3
|
||
|
||
namespace X4
|
||
#print "\n4. ?U unifies with a meta, but nesting recursor goes to Prop: error"
|
||
|
||
inductive bar (A : Sort u) : Sort u
|
||
| mk : A → bar
|
||
|
||
inductive foo
|
||
| mk : bar foo → foo
|
||
|
||
end X4
|
||
|
||
namespace X5
|
||
#print "\n5. ?U unifies with a meta: old approach, set level-param"
|
||
|
||
inductive bar (A : Sort u) : Sort (max u 1)
|
||
| mk : A → bar
|
||
|
||
inductive foo (A : Sort u)
|
||
| mk : A → bar foo → foo
|
||
|
||
#check @foo.{u} -- Sort u → Sort (max u 1)
|
||
|
||
end X5
|
||
|
||
namespace X6
|
||
#print "\n6. ?U unifies with a shifted meta, no others above: set level-param to be inverse of meta"
|
||
|
||
inductive bar (A : Sort (u + 3)) : Sort (u + 3)
|
||
| mk : A → bar
|
||
|
||
inductive foo (A : Sort u)
|
||
| mk : A → bar foo → foo
|
||
|
||
#check @foo.{u} -- Sort u → Sort (u+3)
|
||
|
||
end X6
|
||
|
||
namespace X7
|
||
#print "\n7. ?U unifies with a max: error"
|
||
inductive bar (A : Sort (max u v)) : Sort (max u v 7)
|
||
| mk : A → bar
|
||
|
||
inductive foo (A : Sort v)
|
||
| mk : A → bar foo → foo
|
||
|
||
end X7
|
||
|
||
namespace X8
|
||
#print "\n8. wrapping inductive returns element in different universe: error"
|
||
inductive bar (A : Sort u) : Sort (u + 1)
|
||
| mk : A → bar
|
||
|
||
inductive foo (A : Sort v)
|
||
| mk : A → bar foo → foo
|
||
|
||
end X8
|
||
|
||
namespace X9
|
||
|
||
#print "\n9. nesting with no other level params"
|
||
|
||
inductive bar (A : Sort u) : Sort (max u 1)
|
||
| mk : A → bar
|
||
|
||
inductive foo
|
||
| mk : bar foo → foo
|
||
|
||
#check @foo
|
||
|
||
end X9
|
||
|
||
namespace X10
|
||
#print "\n10. original 1343"
|
||
|
||
inductive foo (α : Sort (u+1)) : Sort (u+1)
|
||
| mk : α → foo
|
||
|
||
inductive bug
|
||
| mk : foo bug → bug
|
||
|
||
#check @bug
|
||
|
||
end X10
|
||
|
||
namespace X11
|
||
#print "\n11. unifies with constant, result sort different: error"
|
||
|
||
inductive foo (α : Sort 2) : Sort 1
|
||
| mk : foo
|
||
|
||
inductive bug
|
||
| mk : foo bug → bug
|
||
|
||
end X11
|
||
|
||
namespace X12
|
||
#print "\n12. multiple nestings"
|
||
|
||
inductive foo₁ (α : Sort u) : Sort (max u 1)
|
||
| mk : foo₁
|
||
|
||
inductive foo₂ (α : Type u) : Type u
|
||
| mk : foo₂
|
||
|
||
inductive foo₃ (α : Type (u+1)) : Type (u+1)
|
||
| mk : foo₃
|
||
|
||
inductive bug
|
||
| mk₁ : foo₁ bug → foo₂ bug → foo₃ bug → foo₃ (foo₂ (foo₁ bug)) → foo₁ (foo₂ (foo₃ bug)) → bug
|
||
| mk₂ : foo₁ bug → foo₂ bug → foo₃ bug → foo₃ (foo₂ (foo₁ bug)) → foo₁ (foo₂ (foo₃ bug)) → bug
|
||
|
||
#check @bug
|
||
|
||
end X12
|
||
|
||
namespace X13
|
||
#print "\n13. ?U indirectly assigned to a constant"
|
||
|
||
inductive foo (α β : Sort u) : Sort (max u 1)
|
||
| mk : foo
|
||
|
||
inductive bug
|
||
| mk₁ : foo bug (Type 3) → bug
|
||
|
||
#check @bug
|
||
|
||
end X13
|
||
|
||
namespace X14
|
||
#print "\n14. No resultant level and lps are used in intro rule: error"
|
||
|
||
inductive foo (α : Type u) : Type u
|
||
| mk : foo
|
||
|
||
inductive bug
|
||
| mk : foo.{u} bug → bug
|
||
|
||
end X14
|