lean4-htt/tests/lean/run/nested_inductive.lean
2017-03-09 18:41:19 -08:00

166 lines
3.3 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

set_option trace.inductive_compiler.nested.define.failure true
set_option max_memory 1000000
inductive {u} vec (A : Type u) : nat -> Type u
| vnil : vec 0
| vcons : Pi (n : nat), A -> vec n -> vec (n+1)
namespace X1
#print "simple"
inductive foo : Type
| mk : list foo -> foo
end X1
namespace X2
#print "with param"
inductive {u} foo (A : Type u) : Type u
| mk : A -> list foo -> foo
end X2
namespace X3
#print "with indices"
inductive {u} foo (A B : Type u) : Type u
| mk : A -> B -> vec foo 0 -> foo
end X3
namespace X4
#print "with locals in indices"
inductive {u} foo (A : Type u) : Type u
| mk : Pi (n : nat), A -> vec foo n -> foo
end X4
namespace X5
#print "nested-reflexive"
inductive {u} foo (A : Type u) : Type u
| mk : A -> (Pi (m : nat), vec foo m) -> foo
end X5
namespace X6
#print "locals + nested-reflexive locals in indices"
inductive {u} foo (A : Type u) : Type u
| mk : Pi (n : nat), A -> (Pi (m : nat), vec foo (n + m)) -> foo
end X6
namespace X7
#print "many different nestings"
inductive {u} foo (A : Type u) : Type u
| mk : Pi (n : nat), A -> list A -> prod A A -> (Pi (m : nat), vec foo (n + m)) -> vec foo n -> foo
end X7
namespace X8
#print "many different nestings, some sharing"
inductive {u} foo (A : Type u) : Type u
| mk₁ : Pi (n : nat), A -> (Pi (m : nat), vec (list foo) (n + m)) -> vec foo n -> foo
| mk₂ : Pi (n : nat), A -> list A -> prod A A -> (Pi (m : nat), vec foo (n + m)) -> vec foo n -> foo
end X8
namespace X9b
#print "mutual + nesting"
mutual inductive {u} foo, bar
with foo : Type u
| mk : list (list foo) -> foo
with bar : Type u
| mk : list foo -> bar
end X9b
namespace X10
#print "many layers of nesting nested inductive types"
inductive wrap (A : Sort*)
| mk : A -> wrap
inductive box (A : Sort*)
| mk : A -> wrap box -> box
inductive foo (A : Sort*)
| mk : A -> box foo -> foo
inductive bar
| mk : foo bar -> bar
end X10
namespace X11
#print "intro rule that introduces additional nesting"
inductive {u} wrap (A : Type u) : Type u
| mk : list A -> wrap
inductive {u} foo : Type u
| mk : wrap foo -> foo
end X11
namespace X12
#print "intro rule that introduces a lot of additional nesting"
inductive wrap (A : Sort*) : Sort*
| mk : list (list A) -> wrap
inductive {u} box (A : Type u) : Type u
| mk : A -> wrap box -> box
end X12
namespace X13
#print "with reducible definitions"
attribute [reducible] definition list' := @list
inductive wrap (A : Sort*) : Sort*
| mk : A -> list' A -> wrap
attribute [reducible] definition wrap' := @wrap
inductive {u} foo (A : Type u) : Type u
| mk : A -> wrap' (list' foo) -> foo
end X13
namespace X14
#print "with indices in original"
inductive Foo : bool -> Type
| mk : list (Foo ff) -> Foo tt
end X14
namespace X15
#print "nested inductive propositions eliminating to Prop"
universe variable l
inductive plist (A : Sort l) : Sort l
| nil : plist
| cons : A → plist → plist
inductive foo (A : Type l) : → Prop
| mk : A → plist (plist (foo 0)) → or (foo 1) (foo 2) → foo 1
end X15
namespace X16
#print "multiply nested inductive propositions"
universe variable l
inductive wrap (A : Sort l) : Sort l
| mk : A -> wrap
inductive box (A : Prop) : Prop
| mk : A -> wrap box -> box
inductive foo (A : Sort*) : Prop
| mk : A -> box foo -> foo
inductive bar : Prop
| mk : foo bar -> bar
end X16