Recognizer for strings whose characters are all 0 or 1.
(bin-digit-string-p x) → bool
Corner case: this accepts the empty string since all of its characters are bit digits.
Logically this is defined in terms of bin-digit-char-list*p. But in the execution, we use a char-based function that avoids exploding the string. This provides much better performance, e.g., on an AMD FX-8350 with CCL:
;; 0.53 seconds, no garbage (let ((x "01001")) (time$ (loop for i fixnum from 1 to 10000000 do (str::bin-digit-string-p x)))) ;; 0.99 seconds, 800 MB allocated (let ((x "01001")) (time$ (loop for i fixnum from 1 to 10000000 do (str::bin-digit-char-list*p (explode x)))))
Function:
(defun bin-digit-string-p$inline (x) (declare (type string x)) (let ((acl2::__function__ 'bin-digit-string-p)) (declare (ignorable acl2::__function__)) (mbe :logic (bin-digit-char-list*p (explode x)) :exec (bin-digit-string-p-aux x 0 (length x)))))
Theorem:
(defthm istreqv-implies-equal-bin-digit-string-p-1 (implies (istreqv x x-equiv) (equal (bin-digit-string-p x) (bin-digit-string-p x-equiv))) :rule-classes (:congruence))