Equations
- Lean.Meta.Match.mkNamedPattern x h p = Lean.Meta.mkAppM `namedPattern #[x, p, h]
Instances For
Equations
- Lean.Meta.Match.isNamedPattern e = (e.consumeMData.getAppNumArgs == 4 && e.consumeMData.getAppFn.consumeMData.isConstOf `namedPattern)
Instances For
- inaccessible (e : Lean.Expr) : Lean.Meta.Match.Pattern
- var (fvarId : Lean.FVarId) : Lean.Meta.Match.Pattern
- ctor (ctorName : Lean.Name) (us : List Lean.Level) (params : List Lean.Expr) (fields : List Lean.Meta.Match.Pattern) : Lean.Meta.Match.Pattern
- val (e : Lean.Expr) : Lean.Meta.Match.Pattern
- arrayLit (type : Lean.Expr) (xs : List Lean.Meta.Match.Pattern) : Lean.Meta.Match.Pattern
- as (varId : Lean.FVarId) (p : Lean.Meta.Match.Pattern) (hId : Lean.FVarId) : Lean.Meta.Match.Pattern
Instances For
Equations
- Lean.Meta.Match.instInhabitedPattern = { default := Lean.Meta.Match.Pattern.inaccessible default }
Equations
- p.toExpr annotate = Lean.Meta.Match.Pattern.toExpr.visit annotate p
Instances For
Apply the free variable substitution s
to the given pattern
Equations
- Lean.Meta.Match.Pattern.replaceFVarId fvarId v p = Lean.Meta.Match.Pattern.applyFVarSubst ({ map := ∅ }.insert fvarId v) p
Instances For
- ref : Lean.Syntax
- fvarDecls : List Lean.LocalDecl
- patterns : List Lean.Meta.Match.Pattern
Instances For
Equations
- altLHS.collectFVars = do altLHS.fvarDecls.forM fun (fvarDecl : Lean.LocalDecl) => fvarDecl.collectFVars altLHS.patterns.forM fun (p : Lean.Meta.Match.Pattern) => p.collectFVars
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Match
alternative
- ref : Lean.Syntax
Syntax
object for providing position information - idx : Nat
Original alternative index. Alternatives can be split, this index is the original position of the alternative that generated this one.
- rhs : Lean.Expr
Right-hand-side of the alternative.
- fvarDecls : List Lean.LocalDecl
Alternative pattern variables.
- patterns : List Lean.Meta.Match.Pattern
Alternative patterns.
Instances For
Equations
- Lean.Meta.Match.instInhabitedAlt = { default := { ref := default, idx := default, rhs := default, fvarDecls := default, patterns := default, cnstrs := default } }
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Return true
if fvarId
is one of the alternative pattern variables
Equations
- Lean.Meta.Match.Alt.isLocalDecl fvarId alt = alt.fvarDecls.any fun (d : Lean.LocalDecl) => d.fvarId == fvarId
Instances For
Similar to checkAndReplaceFVarId
, but ensures type of v
is definitionally equal to type of fvarId
.
This extra check is necessary when performing dependent elimination and inaccessible terms have been used.
For example, consider the following code fragment:
inductive Vec (α : Type u) : Nat → Type u where
| nil : Vec α 0
| cons {n} (head : α) (tail : Vec α n) : Vec α (n+1)
inductive VecPred {α : Type u} (P : α → Prop) : {n : Nat} → Vec α n → Prop where
| nil : VecPred P Vec.nil
| cons {n : Nat} {head : α} {tail : Vec α n} : P head → VecPred P tail → VecPred P (Vec.cons head tail)
theorem ex {α : Type u} (P : α → Prop) : {n : Nat} → (v : Vec α (n+1)) → VecPred P v → Exists P
| _, Vec.cons head _, VecPred.cons h (w : VecPred P Vec.nil) => ⟨head, h⟩
Recall that _
in a pattern can be elaborated into pattern variable or an inaccessible term.
The elaborator uses an inaccessible term when typing constraints restrict its value.
Thus, in the example above, the _
at Vec.cons head _
becomes the inaccessible pattern .(Vec.nil)
because the type ascription (w : VecPred P Vec.nil)
propagates typing constraints that restrict its value to be Vec.nil
.
After elaboration the alternative becomes:
| .(0), @Vec.cons .(α) .(0) head .(Vec.nil), @VecPred.cons .(α) .(P) .(0) .(head) .(Vec.nil) h w => ⟨head, h⟩
where
(head : α), (h: P head), (w : VecPred P Vec.nil)
Then, when we process this alternative in this module, the following check will detect that
w
has type VecPred P Vec.nil
, when it is supposed to have type VecPred P tail
.
Note that if we had written
theorem ex {α : Type u} (P : α → Prop) : {n : Nat} → (v : Vec α (n+1)) → VecPred P v → Exists P
| _, Vec.cons head Vec.nil, VecPred.cons h (w : VecPred P Vec.nil) => ⟨head, h⟩
we would get the easier to digest error message
missing cases:
_, (Vec.cons _ _ (Vec.cons _ _ _)), _
Equations
- One or more equations did not get rendered due to their size.
Instances For
- var : Lean.FVarId → Lean.Meta.Match.Example
- underscore : Lean.Meta.Match.Example
- ctor : Lean.Name → List Lean.Meta.Match.Example → Lean.Meta.Match.Example
- val : Lean.Expr → Lean.Meta.Match.Example
- arrayLit : List Lean.Meta.Match.Example → Lean.Meta.Match.Example
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
- mvarId : Lean.MVarId
- alts : List Lean.Meta.Match.Alt
- examples : List Lean.Meta.Match.Example
Instances For
Equations
- Lean.Meta.Match.instInhabitedProblem = { default := { mvarId := default, vars := default, alts := default, examples := default } }
Equations
- Lean.Meta.Match.withGoalOf p x = p.mvarId.withContext x
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Instances For
Equations
Instances For
Equations
Instances For
- matcher : Lean.Expr
- counterExamples : List Lean.Meta.Match.CounterExample
- addMatcher : Lean.MetaM Unit