lean4-htt/tests/lean/run/structInst.lean
Kyle Miller c066b5cf1c
feat: pretty printing structures, omit default values (#7589)
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
2025-03-20 15:32:13 +00:00

161 lines
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.

/-!
# 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