160 lines
3.5 KiB
Text
160 lines
3.5 KiB
Text
module
|
||
|
||
public section
|
||
|
||
structure Foo where
|
||
name : String
|
||
val : List Nat
|
||
lower : Nat := List.length val
|
||
inv : val.length >= lower
|
||
flag : Bool
|
||
deriving Repr
|
||
|
||
/--
|
||
info: { name := "Joe",
|
||
val := [40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14,
|
||
13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1],
|
||
lower := 40,
|
||
inv := _,
|
||
flag := true }
|
||
-/
|
||
#guard_msgs in
|
||
#eval { name := "Joe", val := (List.range' 1 40).reverse, flag := true, inv := by decide : Foo }
|
||
|
||
inductive Tree (α : Type) where
|
||
| node : List (Tree α) → Bool → Tree α
|
||
| leaf : α → Tree α
|
||
deriving Repr
|
||
|
||
/--
|
||
info: Tree.node
|
||
[Tree.node [Tree.leaf 10] true,
|
||
Tree.node [Tree.leaf 9] false,
|
||
Tree.node [Tree.leaf 8] true,
|
||
Tree.node [Tree.leaf 7] false,
|
||
Tree.node [Tree.leaf 6] true,
|
||
Tree.node [Tree.leaf 5] false,
|
||
Tree.node [Tree.leaf 4] true,
|
||
Tree.node [Tree.leaf 3] false,
|
||
Tree.node [Tree.leaf 2] true,
|
||
Tree.node [Tree.leaf 1] false]
|
||
true
|
||
-/
|
||
#guard_msgs in
|
||
#eval Tree.node ((List.range' 1 10).reverse |>.map fun i => Tree.node [Tree.leaf i] (i%2==0)) true
|
||
|
||
inductive StructureLikeInductive where
|
||
| field : Nat -> StructureLikeInductive
|
||
deriving Repr
|
||
|
||
/-- info: StructureLikeInductive.field 5 -/
|
||
#guard_msgs in
|
||
#eval StructureLikeInductive.field 5
|
||
|
||
namespace Foo
|
||
mutual
|
||
inductive Tree (α : Type u) where
|
||
| node : TreeList α → Tree α
|
||
| leaf : α → Tree α
|
||
deriving Repr
|
||
|
||
inductive TreeList (α : Type u) where
|
||
| nil : TreeList α
|
||
| cons : Tree α → TreeList α → TreeList α
|
||
deriving Repr
|
||
end
|
||
|
||
/--
|
||
info: Foo.Tree.node
|
||
(Foo.TreeList.cons
|
||
(Foo.Tree.leaf 30)
|
||
(Foo.TreeList.cons (Foo.Tree.leaf 20) (Foo.TreeList.cons (Foo.Tree.leaf 10) (Foo.TreeList.nil))))
|
||
-/
|
||
#guard_msgs in
|
||
#eval Tree.node (TreeList.cons (Tree.leaf 30) (TreeList.cons (Tree.leaf 20) (TreeList.cons (Tree.leaf 10) TreeList.nil)))
|
||
|
||
end Foo
|
||
|
||
/-!
|
||
Check that types and proofs are erased for both `inductive` and `structure`.
|
||
-/
|
||
|
||
inductive test1 : Type 1 where
|
||
| wrap : Type → 2 < 3 → test1
|
||
deriving Repr
|
||
|
||
structure test2 : Type 1 where
|
||
ty : Type
|
||
wrap : 2 < 3
|
||
deriving Repr
|
||
|
||
/-- info: test1.wrap _ _ -/
|
||
#guard_msgs in #eval test1.wrap Nat (by simp)
|
||
/-- info: { ty := _, wrap := _ } -/
|
||
#guard_msgs in #eval test2.mk Nat (by simp)
|
||
|
||
/-!
|
||
Indices promoted to parameters are still explicit. Need to include them as arguments.
|
||
-/
|
||
|
||
inductive Promote : (loc : Int) -> (state : Nat) -> Type where
|
||
| mk : (loc : Int) -> (state : Nat) -> (id : Nat) -> Promote loc state
|
||
deriving Repr
|
||
|
||
/-- info: Promote.mk 3 2 1 -/
|
||
#guard_msgs in #eval Promote.mk 3 2 1
|
||
|
||
/-!
|
||
Promoted indices that are types are represented as `_`.
|
||
-/
|
||
|
||
inductive Promote2 : Type → Type where
|
||
| mk : (α : Type) → Promote2 α
|
||
deriving Repr
|
||
|
||
/-- info: Promote2.mk _ -/
|
||
#guard_msgs in #eval Promote2.mk Nat
|
||
|
||
|
||
/-! Private fields should yield public, no-expose instances. -/
|
||
|
||
structure PrivField where
|
||
private a : Nat
|
||
deriving Repr
|
||
|
||
/--
|
||
info: def instReprPrivField : Repr PrivField :=
|
||
<not imported>
|
||
-/
|
||
#guard_msgs in
|
||
#with_exporting
|
||
#print instReprPrivField
|
||
|
||
end
|
||
|
||
-- Try again without `public section`
|
||
|
||
public structure PrivField2 where
|
||
private a : Nat
|
||
deriving Repr
|
||
|
||
/--
|
||
info: def instReprPrivField2 : Repr PrivField2 :=
|
||
<not imported>
|
||
-/
|
||
#guard_msgs in
|
||
#with_exporting
|
||
#print instReprPrivField2
|
||
|
||
/-! Public structures should yield public instances independent of `public section`. -/
|
||
|
||
public structure Public where
|
||
deriving Repr
|
||
|
||
/--
|
||
info: @[expose] def instReprPublic : Repr Public :=
|
||
{ reprPrec := reprPublic✝ }
|
||
-/
|
||
#guard_msgs in
|
||
#with_exporting
|
||
#print instReprPublic
|