@@ -6,28 +6,25 @@ Authors: Leonardo de Moura
66module
77
88prelude
9- public import Lean.Meta.Tactic.Subst
10- public import Lean.Meta.Match.Value
11-
12- public section
9+ public import Lean.Meta.Basic
10+ public import Lean.Meta.Tactic.FVarSubst
11+ import Lean.Meta.Tactic.Subst
1312
1413namespace Lean.Meta
1514
1615structure CaseValueSubgoal where
1716 mvarId : MVarId
1817 newH : FVarId
19- subst : FVarSubst := {}
2018 deriving Inhabited
2119
2220/--
2321 Split goal `... |- C x` into two subgoals
24- `..., (h : x = value) |- C value `
22+ `..., (h : x = value) |- C x `
2523 `..., (h : x != value) |- C x`
2624 where `fvarId` is `x`s id.
2725 The type of `x` must have decidable equality.
28-
29- Remark: `subst` field of the second subgoal is equal to the input `subst`. -/
30- private def caseValueAux (mvarId : MVarId) (fvarId : FVarId) (value : Expr) (hName : Name := `h) (subst : FVarSubst := {})
26+ -/
27+ def caseValue (mvarId : MVarId) (fvarId : FVarId) (value : Expr) (hName : Name := `h)
3128 : MetaM (CaseValueSubgoal × CaseValueSubgoal) :=
3229 mvarId.withContext do
3330 let tag ← mvarId.getTag
@@ -42,27 +39,16 @@ private def caseValueAux (mvarId : MVarId) (fvarId : FVarId) (value : Expr) (hNa
4239 let val ← mkAppOptM `dite #[none, xEqValue, none, thenMVar, elseMVar]
4340 mvarId.assign val
4441 let (elseH, elseMVarId) ← elseMVar.mvarId!.intro1P
45- let elseSubgoal := { mvarId := elseMVarId, newH := elseH, subst := subst : CaseValueSubgoal }
42+ let elseSubgoal := { mvarId := elseMVarId, newH := elseH }
4643 let (thenH, thenMVarId) ← thenMVar.mvarId!.intro1P
47- let symm := false
48- let clearH := false
49- let (thenSubst, thenMVarId) ← substCore thenMVarId thenH symm subst clearH
5044 thenMVarId.withContext do
51- trace[Meta] "subst domain: {thenSubst.domain.map (·.name)}"
52- let thenH := (thenSubst.get thenH).fvarId!
5345 trace[Meta] "searching for decl"
5446 let _ ← thenH.getDecl
5547 trace[Meta] "found decl"
56- let thenSubgoal := { mvarId := thenMVarId, newH := (thenSubst.get thenH).fvarId!, subst := thenSubst : CaseValueSubgoal }
48+ let thenSubgoal := { mvarId := thenMVarId, newH := thenH }
5749 pure (thenSubgoal, elseSubgoal)
5850
59- def caseValue (mvarId : MVarId) (fvarId : FVarId) (value : Expr) : MetaM (CaseValueSubgoal × CaseValueSubgoal) := do
60- let s ← caseValueAux mvarId fvarId value
61- appendTagSuffix s.1 .mvarId `thenBranch
62- appendTagSuffix s.2 .mvarId `elseBranch
63- pure s
64-
65- structure CaseValuesSubgoal where
51+ public structure CaseValuesSubgoal where
6652 mvarId : MVarId
6753 newHs : Array FVarId := #[]
6854 subst : FVarSubst := {}
@@ -83,22 +69,15 @@ structure CaseValuesSubgoal where
8369
8470 If `substNewEqs = true`, then the new `h_i` equality hypotheses are substituted in the first `n` cases.
8571-/
86- def caseValues (mvarId : MVarId) (fvarId : FVarId) (values : Array Expr) (hNamePrefix := `h) (substNewEqs := false ) : MetaM (Array CaseValuesSubgoal) :=
72+ public def caseValues (mvarId : MVarId) (fvarId : FVarId) (values : Array Expr) (hNamePrefix := `h) : MetaM (Array CaseValuesSubgoal) :=
8773 let rec loop : Nat → MVarId → List Expr → Array FVarId → Array CaseValuesSubgoal → MetaM (Array CaseValuesSubgoal)
8874 | _, mvarId, [], _, _ => throwTacticEx `caseValues mvarId "list of values must not be empty"
8975 | i, mvarId, v::vs, hs, subgoals => do
90- let (thenSubgoal, elseSubgoal) ← caseValueAux mvarId fvarId v (hNamePrefix.appendIndexAfter i) {}
76+ let (thenSubgoal, elseSubgoal) ← caseValue mvarId fvarId v (hNamePrefix.appendIndexAfter i)
9177 appendTagSuffix thenSubgoal.mvarId ((`case).appendIndexAfter i)
92- let thenMVarId ← hs.foldlM
93- (fun thenMVarId h => match thenSubgoal.subst.get h with
94- | Expr.fvar fvarId => thenMVarId.tryClear fvarId
95- | _ => pure thenMVarId)
96- thenSubgoal.mvarId
97- let subgoals ← if substNewEqs then
98- let (subst, mvarId) ← substCore thenMVarId thenSubgoal.newH false thenSubgoal.subst true
99- pure <| subgoals.push { mvarId := mvarId, newHs := #[], subst := subst }
100- else
101- pure <| subgoals.push { mvarId := thenMVarId, newHs := #[thenSubgoal.newH], subst := thenSubgoal.subst }
78+ let thenMVarId ← thenSubgoal.mvarId.tryClearMany hs
79+ let (subst, mvarId) ← substCore thenMVarId thenSubgoal.newH (symm := false ) {} (clearH := true )
80+ let subgoals := subgoals.push { mvarId := mvarId, newHs := #[], subst := subst }
10281 match vs with
10382 | [] => do
10483 appendTagSuffix elseSubgoal.mvarId ((`case).appendIndexAfter (i+1 ))
0 commit comments