This PR changes the structure instance notation pretty printer so that fields are omitted if their value is definitionally equal to the default value for the field (up to reducible transparancy). Setting `pp.structureInstances.defaults` to true forces such fields to be pretty printed anyway. Closes #1100
161 lines
3 KiB
Text
161 lines
3 KiB
Text
/-!
|
||
# Tests for structure instance notation
|
||
-/
|
||
|
||
-- Make sure defaults pretty print so we can see what they elaborate to.
|
||
set_option pp.structureInstances.defaults true
|
||
|
||
namespace Ex1
|
||
|
||
structure A where
|
||
(x : Nat)
|
||
|
||
structure B extends A where
|
||
(y : Nat := x + 2) (x := y + 1)
|
||
|
||
structure C extends B where
|
||
(z : Nat) (x := z + 10)
|
||
|
||
/-- info: { x := 1 + 1, y := 1 } : B -/
|
||
#guard_msgs in #check { y := 1 : B }
|
||
/-- info: { x := 1 + 10, y := 1 + 10 + 2, z := 1 } : C -/
|
||
#guard_msgs in #check { z := 1 : C }
|
||
/-! Make sure `z` is parsed as an abbreviation: -/
|
||
/-- info: fun z => { x := z + 10, y := z + 10 + 2, z := z } : Nat → C -/
|
||
#guard_msgs in #check fun z : Nat => { z : C }
|
||
|
||
def test1 : B where
|
||
y := 1
|
||
def test2 : C where
|
||
z := 1
|
||
|
||
end Ex1
|
||
|
||
namespace Ex2
|
||
|
||
structure A where
|
||
(x : Nat) (y : Nat)
|
||
|
||
structure B extends A where
|
||
(z : Nat := x + 1) (y := z + x)
|
||
|
||
/-- info: { x := 1, y := 1 + 1 + 1, z := 1 + 1 } : B -/
|
||
#guard_msgs in #check { x := 1 : B }
|
||
|
||
def test1 : B where
|
||
x := 1
|
||
|
||
end Ex2
|
||
|
||
namespace Ex3
|
||
|
||
structure A where
|
||
(x : Nat)
|
||
|
||
structure B extends A where
|
||
(y : Nat := x + 2) (x := y + 1)
|
||
|
||
structure C extends B where
|
||
(z : Nat := 2*y) (x := z + 2) (y := z + 3)
|
||
|
||
/-- info: { x := 1, y := 1 + 2, z := 2 * (1 + 2) } : C -/
|
||
#guard_msgs in #check { x := 1 : C }
|
||
/-- info: { x := 2 * 1 + 2, y := 1, z := 2 * 1 } : C -/
|
||
#guard_msgs in #check { y := 1 : C }
|
||
/-- info: { x := 1 + 2, y := 1 + 3, z := 1 } : C -/
|
||
#guard_msgs in #check { z := 1 : C }
|
||
|
||
def test1 : C where
|
||
x := 1
|
||
def test2 : C where
|
||
y := 1
|
||
def test3 : C where
|
||
z := 1
|
||
|
||
end Ex3
|
||
|
||
namespace Ex4
|
||
|
||
structure A where
|
||
(x : Nat)
|
||
|
||
structure B extends A where
|
||
(y : Nat := x + 1) (x := y + 1)
|
||
|
||
structure C extends B where
|
||
(z : Nat := 2*y) (x := z + 3)
|
||
|
||
/-- info: { x := 1, y := 1 + 1, z := 2 * (1 + 1) } : C -/
|
||
#guard_msgs in #check { x := 1 : C }
|
||
/-- info: { x := 2 * 1 + 3, y := 1, z := 2 * 1 } : C -/
|
||
#guard_msgs in #check { y := 1 : C }
|
||
/-- info: { x := 1 + 3, y := 1 + 3 + 1, z := 1 } : C -/
|
||
#guard_msgs in #check { z := 1 : C }
|
||
/-- info: { x := 2, y := 2 + 1, z := 1 } : C -/
|
||
#guard_msgs in #check { z := 1, x := 2 : C }
|
||
/-- info: { x := 1 + 1, y := 1 } : B -/
|
||
#guard_msgs in #check { y := 1 : B }
|
||
|
||
def test1 : C where
|
||
x := 1
|
||
def test2 : C where
|
||
y := 1
|
||
def test3 : C where
|
||
z := 1
|
||
def test4 : C where
|
||
z := 1
|
||
x := 2
|
||
def test5 : C where
|
||
y := 1
|
||
|
||
end Ex4
|
||
|
||
/-!
|
||
Binders example
|
||
-/
|
||
structure PosFun where
|
||
f : Nat → Nat
|
||
pos : ∀ n, 0 < f n
|
||
|
||
def p : PosFun :=
|
||
{ f n := n + 1
|
||
pos := by simp }
|
||
|
||
def p_where : PosFun where
|
||
f n := n + 1
|
||
pos := by simp
|
||
|
||
/-!
|
||
Equations
|
||
-/
|
||
def p' : PosFun :=
|
||
{ f
|
||
| 0 => 1
|
||
| n + 1 => n + 1
|
||
pos := by rintro (_|_) <;> simp }
|
||
|
||
def p'_where : PosFun where
|
||
f
|
||
| 0 => 1
|
||
| n + 1 => n + 1
|
||
pos := by rintro (_|_) <;> simp
|
||
|
||
/-!
|
||
Binders and type ascriptions
|
||
-/
|
||
namespace Ex5
|
||
|
||
structure A (α : Type) (β : Type) where
|
||
x : α
|
||
f : β → β
|
||
z : α
|
||
|
||
/-- info: fun z => { x := 1, f := fun n => n + 1, z := z } : Int → A Int Int -/
|
||
#guard_msgs in #check fun z => { x : Int := 1, f n : Int := n + 1, z : A _ _ }
|
||
|
||
def test1 (z : Int) : A Int Int where
|
||
x : Int := 1
|
||
f n : Int := n + 1
|
||
z
|
||
|
||
end Ex5
|