Recognizer for octal digit characters: 0-7.
(oct-digit-char-p x) → bool
ACL2 provides digit-char-p which is more flexible and can recognize numeric characters in other bases. (oct-digit-char-p x) only recognizes base-8 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))) ;; 18.137 seconds (time (loop for i fixnum from 1 to 10000000 do (loop for c in *chars* do (digit-char-p c 16)))) ;; 3.435 seconds (time (loop for i fixnum from 1 to 10000000 do (loop for c in *chars* do (str::oct-digit-char-p c))))
Function:
(defun oct-digit-char-p$inline (x) (declare (xargs :guard t)) (let ((acl2::__function__ 'oct-digit-char-p)) (declare (ignorable acl2::__function__)) (mbe :logic (let ((code (char-code (char-fix x)))) (and (<= (char-code #\0) code) (<= code (char-code #\7)))) :exec (and (characterp x) (b* (((the (unsigned-byte 8) code) (char-code (the character x)))) (and (<= code 55) (<= 48 code)))))))
Theorem:
(defthm ichareqv-implies-equal-oct-digit-char-p-1 (implies (ichareqv x x-equiv) (equal (oct-digit-char-p x) (oct-digit-char-p x-equiv))) :rule-classes (:congruence))
Theorem:
(defthm characterp-when-oct-digit-char-p (implies (oct-digit-char-p char) (characterp char)) :rule-classes :compound-recognizer)
Theorem:
(defthm oct-digit-char-p-cases (iff (oct-digit-char-p x) (member x '(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7))))