These commands were trusting that elaboration resulted in type-correct terms, but users testing custom elaborators have found it to be surprising that they do not do typechecking. This adds a `Meta.check` step.
58 lines
1.2 KiB
Text
58 lines
1.2 KiB
Text
import Lean
|
||
|
||
/-- info: And.intro {a b : Prop} (left : a) (right : b) : a ∧ b -/
|
||
#guard_msgs in
|
||
#check And.intro
|
||
|
||
/--
|
||
info: @Or.rec : ∀ {a b : Prop} {motive : a ∨ b → Prop},
|
||
(∀ (h : a), motive ⋯) → (∀ (h : b), motive ⋯) → ∀ (t : a ∨ b), motive t
|
||
-/
|
||
#guard_msgs in
|
||
#check @Or.rec
|
||
|
||
/-- info: Eq.{u_1} {α : Sort u_1} : α → α → Prop -/
|
||
#guard_msgs in
|
||
#check Eq
|
||
|
||
/--
|
||
info: @Eq.rec : {α : Sort u_2} →
|
||
{a : α} → {motive : (a_1 : α) → a = a_1 → Sort u_1} → motive a ⋯ → {a_1 : α} → (t : a = a_1) → motive a_1 t
|
||
-/
|
||
#guard_msgs in
|
||
#check @Eq.rec
|
||
|
||
/-!
|
||
The `#check` command also typechecks the result to help users debug buggy elaborators.
|
||
-/
|
||
section
|
||
open Lean
|
||
|
||
def expr_1eq1 : Expr := mkApp3 (.const ``Eq [0]) (.const ``Nat []) (mkNatLit 1) (mkNatLit 1)
|
||
|
||
elab "elab_1eq1" : term => return expr_1eq1
|
||
|
||
/--
|
||
error: application type mismatch
|
||
@Eq Nat
|
||
argument
|
||
Nat
|
||
has type
|
||
Type : Type 1
|
||
but is expected to have type
|
||
Prop : Type
|
||
-/
|
||
#guard_msgs in #check elab_1eq1
|
||
|
||
/--
|
||
error: application type mismatch
|
||
@Eq Nat
|
||
argument
|
||
Nat
|
||
has type
|
||
Type : Type 1
|
||
but is expected to have type
|
||
Prop : Type
|
||
-/
|
||
#guard_msgs in #reduce elab_1eq1
|
||
end
|