lean4-htt/src/Lean/Meta/Tactic/Simp/BuiltinSimprocs/String.lean
Markus Himmel e381960614
feat: simproc for turning "c" into String.singleton 'c' (#13054)
This PR adds the simproc String.reduceToSingleton`, which is disabled by
default and turns `"c"` into `String.singleton 'c'`.

Recall that the simproc `reduceSingleton`, which does the reverse, is
part of the default `simp` set.
2026-03-23 09:06:49 +00:00

93 lines
4 KiB
Text

/-
Copyright (c) 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura
-/
module
prelude
public import Lean.Meta.Tactic.Simp.BuiltinSimprocs.Char
import Lean.Meta.StringLitProof
public section
namespace String
open Lean Meta Simp
def fromExpr? (e : Expr) : SimpM (Option String) := do
return getStringValue? e
builtin_dsimproc [simp, seval] reduceAppend ((_ ++ _ : String)) := fun e => do
unless e.isAppOfArity ``HAppend.hAppend 6 do return .continue
let some a ← fromExpr? e.appFn!.appArg! | return .continue
let some b ← fromExpr? e.appArg! | return .continue
return .done <| toExpr (a ++ b)
private partial def reduceListChar (e : Expr) (s : String) : SimpM DStep := do
if e.isAppOfArity ``List.nil 1 then
return .done <| toExpr s
else if e.isAppOfArity ``List.cons 3 then
let some c ← Char.fromExpr? e.appFn!.appArg! | return .continue
reduceListChar e.appArg! (s.push c)
else
return .continue
builtin_dsimproc [simp, seval] reduceOfList (String.ofList _) := fun e => do
unless e.isAppOfArity ``String.ofList 1 do return .continue
reduceListChar e.appArg! ""
builtin_dsimproc [simp, seval] reduceToList (String.toList _) := fun e => do
unless e.isAppOfArity ``String.toList 1 do return .continue
let some s ← fromExpr? e.appArg! | return .continue
return .done <| toExpr s.toList
builtin_dsimproc [simp, seval] reducePush (String.push _ _) := fun e => do
unless e.isAppOfArity ``String.push 2 do return .continue
let some n ← fromExpr? e.appFn!.appArg! | return .continue
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)
builtin_dsimproc_decl reduceToSingleton ((_ : String)) := fun e => do
let some s ← fromExpr? e | return .continue
let l := s.toList
let [c] := l | return .continue
return .done <| mkApp (mkConst ``String.singleton) (toExpr 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
let some m ← fromExpr? e.appArg! | return .continue
evalPropStep e (op n m)
@[inline] def reduceBoolPred (declName : Name) (arity : Nat) (op : String → String → Bool) (e : Expr) : SimpM DStep := do
unless e.isAppOfArity declName arity do return .continue
let some n ← fromExpr? e.appFn!.appArg! | return .continue
let some m ← fromExpr? e.appArg! | return .continue
return .done <| toExpr (op n m)
builtin_simproc [simp, seval] reduceLT (( _ : String) < _) := reduceBinPred ``LT.lt 4 (. < .)
builtin_simproc [simp, seval] reduceLE (( _ : String) ≤ _) := reduceBinPred ``LE.le 4 (. ≤ .)
builtin_simproc [simp, seval] reduceGT (( _ : String) > _) := reduceBinPred ``GT.gt 4 (. > .)
builtin_simproc [simp, seval] reduceGE (( _ : String) ≥ _) := reduceBinPred ``GE.ge 4 (. ≥ .)
builtin_simproc [simp, seval] reduceEq (( _ : String) = _) := fun e => do
unless e.isAppOfArity ``Eq 3 do return .continue
let some n ← fromExpr? e.appFn!.appArg! | return .continue
let some m ← fromExpr? e.appArg! | return .continue
evalEqPropStep e (n = m) (mkStringLitNeProof n m)
builtin_simproc [simp, seval] reduceNe (( _ : String) ≠ _) := fun e => do
unless e.isAppOfArity ``Ne 3 do return .continue
let some n ← fromExpr? e.appFn!.appArg! | return .continue
let some m ← fromExpr? e.appArg! | return .continue
evalNePropStep e (n ≠ m) (mkStringLitNeProof n m)
builtin_dsimproc [simp, seval] reduceBEq (( _ : String) == _) := reduceBoolPred ``BEq.beq 4 (. == .)
builtin_dsimproc [simp, seval] reduceBNe (( _ : String) != _) := reduceBoolPred ``bne 4 (. != .)
end String