Recognizer for numeric characters (0-9).
(dec-digit-char-p x) → bool
ACL2 provides digit-char-p which is more flexible and can recognize numeric characters in other bases. (dec-digit-char-p x) only recognizes base-10 digits, but is much faster, at least on CCL. Here is an experiment you can run in raw lisp, with times reported in CCL on an AMD FX-8350.
(defconstant *chars* (loop for i from 0 to 256 collect (code-char i))) ;; 17.130 seconds, no garbage (time (loop for i fixnum from 1 to 10000000 do (loop for c in *chars* do (digit-char-p c)))) ;; 3.772 seconds, no garbage (time (loop for i fixnum from 1 to 10000000 do (loop for c in *chars* do (str::dec-digit-char-p c))))
Function:
(defun dec-digit-char-p$inline (x) (declare (xargs :guard t)) (let ((acl2::__function__ 'dec-digit-char-p)) (declare (ignorable acl2::__function__)) (mbe :logic (let ((code (char-code (char-fix x)))) (and (<= (char-code #\0) code) (<= code (char-code #\9)))) :exec (and (characterp x) (let ((code (the (unsigned-byte 8) (char-code (the character x))))) (declare (type (unsigned-byte 8) code)) (and (<= (the (unsigned-byte 8) code) (the (unsigned-byte 8) 57)) (<= (the (unsigned-byte 8) 48) (the (unsigned-byte 8) code))))))))
Theorem:
(defthm ichareqv-implies-equal-dec-digit-char-p-1 (implies (ichareqv x x-equiv) (equal (dec-digit-char-p x) (dec-digit-char-p x-equiv))) :rule-classes (:congruence))
Theorem:
(defthm characterp-when-dec-digit-char-p (implies (dec-digit-char-p char) (characterp char)) :rule-classes :compound-recognizer)