diff --git a/Aesop/RulePattern.lean b/Aesop/RulePattern.lean index 7716e99..627e618 100644 --- a/Aesop/RulePattern.lean +++ b/Aesop/RulePattern.lean @@ -145,9 +145,9 @@ def openRuleType (pat : RulePattern) (inst : RulePatternInstantiation) for h : i in [:mvars.size] do if let some inst ← pat.getInstantiation inst i then let mvarId := mvars[i]'h.2 |>.mvarId! - -- We use `checkedAssign`, rather than `assign`, to make sure that - -- universe metavariables occurring in `mvars` are assigned. - if ← mvarId.checkedAssign inst then + -- We use `isDefEq` to make sure that universe metavariables occurring in + -- the type of `mvarId` are assigned. + if ← isDefEq (.mvar mvarId) inst then assigned := assigned.insert mvarId else throwError "openRuleType: type-incorrect pattern instantiation: argument has type '{← mvarId.getType}' but pattern instantiation '{inst}' has type '{← inferType inst}'" diff --git a/AesopTest/RulePatternUniverseBug.lean b/AesopTest/RulePatternUniverseBug.lean index be1c253..c8e7db1 100644 --- a/AesopTest/RulePatternUniverseBug.lean +++ b/AesopTest/RulePatternUniverseBug.lean @@ -8,7 +8,10 @@ Authors: Son Ho, Jannis Limperg -- assigned during rule pattern matching. Thanks to Son Ho for reporting this -- issue. -import Aesop +import Aesop.Frontend.Attribute +import Aesop.Frontend.Saturate + +set_option aesop.check.all true namespace List @@ -28,24 +31,22 @@ def indexOpt (ls : List α) (i : Int) : Option α := | [] => none | hd :: tl => if i = 0 then some hd else indexOpt tl (i - 1) --- FIXME this is failing under v4.11.0-rc1 - --- theorem indexOpt_bounds (ls : List α) (i : Int) : --- ls.indexOpt i = none ↔ i < 0 ∨ ls.len ≤ i := by --- match ls with --- | [] => simp [indexOpt]; omega --- | _ :: tl => --- have := indexOpt_bounds tl (i - 1) --- if h : i = 0 then --- simp [indexOpt, *] --- saturate --- omega --- else --- simp [indexOpt, len, *] --- constructor <;> intro a <;> cases a --- . left --- saturate --- omega --- . right; omega --- . left; omega --- . right; omega +theorem indexOpt_bounds (ls : List α) (i : Int) : + ls.indexOpt i = none ↔ i < 0 ∨ ls.len ≤ i := by + match ls with + | [] => simp [indexOpt]; omega + | _ :: tl => + have := indexOpt_bounds tl (i - 1) + if h : i = 0 then + simp [indexOpt, *] + saturate + omega + else + simp [indexOpt, len, *] + constructor <;> intro a <;> cases a + . left + saturate + omega + . right; omega + . left; omega + . right; omega