feat: Int.toNat simproc (#3440)
This commit is contained in:
parent
71cfbb26de
commit
d55bab41bb
2 changed files with 18 additions and 5 deletions
|
|
@ -91,11 +91,6 @@ builtin_simproc [simp, seval] reducePow ((_ : Int) ^ (_ : Nat)) := fun e => do
|
|||
let some v₂ ← Nat.fromExpr? e.appArg! | return .continue
|
||||
return .done { expr := toExpr (v₁ ^ v₂) }
|
||||
|
||||
builtin_simproc [simp, seval] reduceAbs (natAbs _) := fun e => do
|
||||
unless e.isAppOfArity ``natAbs 1 do return .continue
|
||||
let some v ← fromExpr? e.appArg! | return .continue
|
||||
return .done { expr := mkNatLit (natAbs v) }
|
||||
|
||||
builtin_simproc [simp, seval] reduceLT (( _ : Int) < _) := reduceBinPred ``LT.lt 4 (. < .)
|
||||
builtin_simproc [simp, seval] reduceLE (( _ : Int) ≤ _) := reduceBinPred ``LE.le 4 (. ≤ .)
|
||||
builtin_simproc [simp, seval] reduceGT (( _ : Int) > _) := reduceBinPred ``GT.gt 4 (. > .)
|
||||
|
|
@ -105,4 +100,12 @@ builtin_simproc [simp, seval] reduceNe (( _ : Int) ≠ _) := reduceBinPred ``N
|
|||
builtin_simproc [simp, seval] reduceBEq (( _ : Int) == _) := reduceBoolPred ``BEq.beq 4 (. == .)
|
||||
builtin_simproc [simp, seval] reduceBNe (( _ : Int) != _) := reduceBoolPred ``bne 4 (. != .)
|
||||
|
||||
@[inline] def reduceNatCore (declName : Name) (op : Int → Nat) (e : Expr) : SimpM Step := do
|
||||
unless e.isAppOfArity declName 1 do return .continue
|
||||
let some v ← fromExpr? e.appArg! | return .continue
|
||||
return .done { expr := mkNatLit (op v) }
|
||||
|
||||
builtin_simproc [simp, seval] reduceAbs (natAbs _) := reduceNatCore ``natAbs natAbs
|
||||
builtin_simproc [simp, seval] reduceToNat (Int.toNat _) := reduceNatCore ``Int.toNat Int.toNat
|
||||
|
||||
end Int
|
||||
|
|
|
|||
|
|
@ -10,3 +10,13 @@ example : foo x = 8 + 2 := by
|
|||
fail_if_success simp [-Nat.reduceAdd]
|
||||
simp only [Nat.reduceAdd]
|
||||
rw [foo]
|
||||
|
||||
example (h : 0 = x) : (-2).toNat = x := by
|
||||
simp
|
||||
guard_target =ₛ 0 = x
|
||||
assumption
|
||||
|
||||
example (h : 1 = x) : (1 : Int).toNat = x := by
|
||||
simp
|
||||
guard_target =ₛ 1 = x
|
||||
assumption
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue