| import Lean | |
| structure A := | |
| x : Nat | |
| a' : x = 1 := by trivial | |
| #check A.a' | |
| example (z : A) : z.x = 1 := by | |
| have := z.a' | |
| trace_state | |
| exact this | |
| example (z : A) : z.x = 1 := by | |
| have := z.2 | |
| trace_state | |
| exact this | |
| #check A.rec | |
| example (z : A) : z.x = 1 := by | |
| have ⟨x, a'⟩ := z | |
| trace_state | |
| subst a' | |
| rfl | |
| example (z : A) : z.x = 1 := by | |
| induction z with | |
| | mk x a' => | |
| trace_state | |
| subst a' | |
| rfl | |
| structure B := | |
| x : Nat | |
| y : Nat := 2 | |
| example (b : B) : b = { x := b.x, y := b.y } := by | |
| cases b with | |
| | mk x y => trace_state; rfl | |
| open Lean | |
| open Lean.Meta | |
| def tst : MetaM Unit := | |
| withLocalDeclD `a (mkConst ``A) fun a => do | |
| let e := mkProj ``A 1 a | |
| IO.println (← Meta.ppExpr (← inferType e)) | |
| #eval tst | |
| example (z : A) : z.x = 1 := by | |
| match z with | |
| | { a' := h } => trace_state; exact h | |
| example (z : A) : z.x = 1 := by | |
| match z with | |
| | A.mk x a' => trace_state; exact a' | |
| example : A := | |
| { x := 1, a' := _ } | |
| example : A := | |
| A.mk 1 _ | |
| def f (x : Nat) (h : x = 1) : A := A.mk x h | |
| example : A := | |
| f 2 _ | |
| example : A := by | |
| apply f | |
| done |