diff --git a/src/Lean/Meta/Tactic/Simp/BuiltinSimprocs/String.lean b/src/Lean/Meta/Tactic/Simp/BuiltinSimprocs/String.lean index b94f876417..36bd3a8716 100644 --- a/src/Lean/Meta/Tactic/Simp/BuiltinSimprocs/String.lean +++ b/src/Lean/Meta/Tactic/Simp/BuiltinSimprocs/String.lean @@ -46,6 +46,11 @@ builtin_dsimproc [simp, seval] reducePush (String.push _ _) := fun e => do let some m ← Char.fromExpr? e.appArg! | return .continue return .done <| toExpr (n.push m) +builtin_dsimproc [simp, seval] reduceSingleton (String.singleton _) := fun e => do + unless e.isAppOfArity ``String.singleton 1 do return .continue + let some c ← Char.fromExpr? e.appArg! | return .continue + return .done <| toExpr (String.singleton c) + @[inline] def reduceBinPred (declName : Name) (arity : Nat) (op : String → String → Bool) (e : Expr) : SimpM Step := do unless e.isAppOfArity declName arity do return .continue let some n ← fromExpr? e.appFn!.appArg! | return .continue diff --git a/tests/elab/simprocString.lean b/tests/elab/simprocString.lean index ec4194451d..842ad19c02 100644 --- a/tests/elab/simprocString.lean +++ b/tests/elab/simprocString.lean @@ -50,5 +50,10 @@ example : "b" > "a" := by simp example : "abc" ≥ "abc" := by simp example : "abd" ≥ "abc" := by simp +-- String.reduceSingleton +example : String.singleton ' ' = " " := by simp +example : String.singleton 'a' = "a" := by simp +example : String.singleton '\n' = "\n" := by simp + -- Combined: roundtrip toList/ofList example : String.ofList "hello".toList = "hello" := by simp