Recognizer for hexadecimal digit characters: 0-9, A-F, a-f.
(hex-digit-char-p x) → bool
ACL2 provides digit-char-p which is more flexible and can recognize numeric characters in other bases. (hex-digit-char-p x) only recognizes base-16 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 255 collect (code-char i))) ;; 19.216 seconds (time (loop for i fixnum from 1 to 10000000 do (loop for c in *chars* do (digit-char-p c 16)))) ;; 4.711 seconds (time (loop for i fixnum from 1 to 10000000 do (loop for c in *chars* do (str::hex-digit-char-p c))))
Function:
(defun hex-digit-char-p$inline (x) (declare (xargs :guard t)) (let ((acl2::__function__ 'hex-digit-char-p)) (declare (ignorable acl2::__function__)) (mbe :logic (let ((code (char-code (char-fix x)))) (or (and (<= (char-code #\0) code) (<= code (char-code #\9))) (and (<= (char-code #\a) code) (<= code (char-code #\f))) (and (<= (char-code #\A) code) (<= code (char-code #\F))))) :exec (and (characterp x) (b* (((the (unsigned-byte 8) code) (char-code (the character x)))) (if (<= code 70) (if (<= code 57) (<= 48 code) (<= 65 code)) (and (<= code 102) (<= 97 code))))))))
Theorem:
(defthm ichareqv-implies-equal-hex-digit-char-p-1 (implies (ichareqv x x-equiv) (equal (hex-digit-char-p x) (hex-digit-char-p x-equiv))) :rule-classes (:congruence))
Theorem:
(defthm characterp-when-hex-digit-char-p (implies (hex-digit-char-p char) (characterp char)) :rule-classes :compound-recognizer)
Theorem:
(defthm hex-digit-char-p-cases (iff (hex-digit-char-p x) (member x '(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\a #\b #\c #\d #\e #\f #\A #\B #\C #\D #\E #\F))))