Skip to content

Commit f39938d

Browse files
committed
Reduce code entropy
1 parent ca4cb0c commit f39938d

File tree

4 files changed

+24
-40
lines changed

4 files changed

+24
-40
lines changed

src/Lean/Meta/Match/CaseArraySizes.lean

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,26 +68,24 @@ def caseArraySizes (mvarId : MVarId) (fvarId : FVarId) (sizes : Array Nat) (xNam
6868
let mvarId ← mvarId.assertExt `aSize (mkConst `Nat) aSize
6969
let (aSizeFVarId, mvarId) ← mvarId.intro1
7070
let (hEq, mvarId) ← mvarId.intro1
71-
let subgoals ← caseValues mvarId aSizeFVarId (sizes.map mkRawNatLit) hNamePrefix (substNewEqs := false)
71+
let subgoals ← caseValues mvarId aSizeFVarId (sizes.map mkRawNatLit) hNamePrefix
7272
subgoals.mapIdxM fun i subgoal => do
7373
let subst := subgoal.subst
7474
let mvarId := subgoal.mvarId
75-
let hEqSz := (subst.get hEq).fvarId!
7675
if h : i < sizes.size then
77-
let n := sizes[i]
78-
let mvarId ← mvarId.clear subgoal.newHs[0]!
79-
let mvarId ← mvarId.clear (subst.get aSizeFVarId).fvarId!
80-
mvarId.withContext do
81-
let hEqSzSymm ← mkEqSymm (mkFVar hEqSz)
82-
let mvarId ← introArrayLit mvarId a n xNamePrefix hEqSzSymm
83-
let (xs, mvarId) ← mvarId.introN n
84-
let (hEqLit, mvarId) ← mvarId.intro1
85-
let mvarId ← mvarId.clear hEqSz
86-
let (subst, mvarId) ← substCore mvarId hEqLit false subst
87-
pure { mvarId := mvarId, elems := xs, subst := subst }
76+
let hEqSz := (subst.get hEq).fvarId!
77+
let n := sizes[i]
78+
mvarId.withContext do
79+
let hEqSzSymm ← mkEqSymm (mkFVar hEqSz)
80+
let mvarId ← introArrayLit mvarId a n xNamePrefix hEqSzSymm
81+
let (xs, mvarId) ← mvarId.introN n
82+
let (hEqLit, mvarId) ← mvarId.intro1
83+
let mvarId ← mvarId.clear hEqSz
84+
let (subst, mvarId) ← substCore mvarId hEqLit (symm := false) subst
85+
pure { mvarId := mvarId, elems := xs, subst := subst }
8886
else
89-
let (subst, mvarId) ← substCore mvarId hEq false subst
90-
let diseqs := subgoal.newHs.map fun fvarId => (subst.get fvarId).fvarId!
91-
pure { mvarId := mvarId, diseqs := diseqs, subst := subst }
87+
let (subst, mvarId) ← substCore mvarId hEq (symm := false) subst
88+
let diseqs := subgoal.newHs.map fun fvarId => (subst.get fvarId).fvarId!
89+
pure { mvarId := mvarId, diseqs := diseqs, subst := subst }
9290

9391
end Lean.Meta

src/Lean/Meta/Match/CaseValues.lean

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ structure CaseValueSubgoal where
3030
3131
Remark: `subst` field of the second subgoal is equal to the input `subst`. -/
3232
private def caseValueAux (mvarId : MVarId) (fvarId : FVarId) (value : Expr) (hName : Name := `h)
33-
(subst : FVarSubst := {}) (substNewEq : Bool)
33+
(subst : FVarSubst := {})
3434
: MetaM (CaseValueSubgoal × CaseValueSubgoal) :=
3535
mvarId.withContext do
3636
let tag ← mvarId.getTag
@@ -47,26 +47,15 @@ private def caseValueAux (mvarId : MVarId) (fvarId : FVarId) (value : Expr) (hNa
4747
let (elseH, elseMVarId) ← elseMVar.mvarId!.intro1P
4848
let elseSubgoal := { mvarId := elseMVarId, newH := elseH, subst := subst : CaseValueSubgoal }
4949
let (thenH, thenMVarId) ← thenMVar.mvarId!.intro1P
50-
let (thenSubst, thenMVarId) ←
51-
if substNewEq then
52-
substCore thenMVarId thenH (symm := false) subst (clearH := false)
53-
else
54-
pure (subst, thenMVarId)
5550
thenMVarId.withContext do
56-
trace[Meta] "subst domain: {thenSubst.domain.map (·.name)}"
57-
let thenH := (thenSubst.get thenH).fvarId!
51+
trace[Meta] "subst domain: {subst.domain.map (·.name)}"
52+
let thenH := (subst.get thenH).fvarId!
5853
trace[Meta] "searching for decl"
5954
let _ ← thenH.getDecl
6055
trace[Meta] "found decl"
61-
let thenSubgoal := { mvarId := thenMVarId, newH := (thenSubst.get thenH).fvarId!, subst := thenSubst : CaseValueSubgoal }
56+
let thenSubgoal := { mvarId := thenMVarId, newH := (subst.get thenH).fvarId!, subst : CaseValueSubgoal }
6257
pure (thenSubgoal, elseSubgoal)
6358

64-
def caseValue (mvarId : MVarId) (fvarId : FVarId) (value : Expr) : MetaM (CaseValueSubgoal × CaseValueSubgoal) := do
65-
let s ← caseValueAux mvarId fvarId value (substNewEq := true)
66-
appendTagSuffix s.1.mvarId `thenBranch
67-
appendTagSuffix s.2.mvarId `elseBranch
68-
pure s
69-
7059
structure CaseValuesSubgoal where
7160
mvarId : MVarId
7261
newHs : Array FVarId := #[]
@@ -88,22 +77,19 @@ structure CaseValuesSubgoal where
8877
8978
If `substNewEqs = true`, then the new `h_i` equality hypotheses are substituted in the first `n` cases.
9079
-/
91-
def caseValues (mvarId : MVarId) (fvarId : FVarId) (values : Array Expr) (hNamePrefix := `h) (substNewEqs : Bool) : MetaM (Array CaseValuesSubgoal) :=
80+
def caseValues (mvarId : MVarId) (fvarId : FVarId) (values : Array Expr) (hNamePrefix := `h) : MetaM (Array CaseValuesSubgoal) :=
9281
let rec loop : Nat → MVarId → List Expr → Array FVarId → Array CaseValuesSubgoal → MetaM (Array CaseValuesSubgoal)
9382
| _, mvarId, [], _, _ => throwTacticEx `caseValues mvarId "list of values must not be empty"
9483
| i, mvarId, v::vs, hs, subgoals => do
95-
let (thenSubgoal, elseSubgoal) ← caseValueAux mvarId fvarId v (hNamePrefix.appendIndexAfter i) (substNewEq := !substNewEqs) {}
84+
let (thenSubgoal, elseSubgoal) ← caseValueAux mvarId fvarId v (hNamePrefix.appendIndexAfter i) {}
9685
appendTagSuffix thenSubgoal.mvarId ((`case).appendIndexAfter i)
9786
let thenMVarId ← hs.foldlM
9887
(fun thenMVarId h => match thenSubgoal.subst.get h with
9988
| Expr.fvar fvarId => thenMVarId.tryClear fvarId
10089
| _ => pure thenMVarId)
10190
thenSubgoal.mvarId
102-
let subgoals ← if substNewEqs then
103-
let (subst, mvarId) ← substCore thenMVarId thenSubgoal.newH (symm := false) thenSubgoal.subst (clearH := true)
104-
pure <| subgoals.push { mvarId := mvarId, newHs := #[], subst := subst }
105-
else
106-
pure <| subgoals.push { mvarId := thenMVarId, newHs := #[thenSubgoal.newH], subst := thenSubgoal.subst }
91+
let (subst, mvarId) ← substCore thenMVarId thenSubgoal.newH (symm := false) thenSubgoal.subst (clearH := true)
92+
let subgoals := subgoals.push { mvarId := mvarId, newHs := #[], subst := subst }
10793
match vs with
10894
| [] => do
10995
appendTagSuffix elseSubgoal.mvarId ((`case).appendIndexAfter (i+1))

src/Lean/Meta/Match/Match.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ private def processValue (p : Problem) : MetaM (Array Problem) := do
686686
trace[Meta.Match.match] "value step"
687687
let x :: xs := p.vars | unreachable!
688688
let values := collectValues p
689-
let subgoals ← caseValues p.mvarId x.fvarId! values (substNewEqs := true)
689+
let subgoals ← caseValues p.mvarId x.fvarId! values
690690
subgoals.mapIdxM fun i subgoal => do
691691
trace[Meta.Match.match] "processValue subgoal\n{MessageData.ofGoal subgoal.mvarId}"
692692
if h : i < values.size then

tests/lean/run/meta6.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ withLocalDeclD `y nat fun y => do
7171
let vType ← mkAppM `Vec #[nat, x];
7272
withLocalDeclD `v vType fun v => do
7373
let m ← mkFreshExprSyntheticOpaqueMVar vType;
74-
let subgoals ← caseValues m.mvarId! x.fvarId! #[mkNatLit 2, mkNatLit 3, mkNatLit 5] (substNewEqs := false);
74+
let subgoals ← caseValues m.mvarId! x.fvarId! #[mkNatLit 2, mkNatLit 3, mkNatLit 5];
7575
subgoals.forM fun s => do {
7676
print (MessageData.ofGoal s.mvarId);
7777
s.mvarId.assumption

0 commit comments

Comments
 (0)