Check if a list of roles of signed integer bits is well-formed.
(sinteger-bit-roles-wfp roles) → yes/no
According to [C17:6.2.6.2/2],
there must be exactly one value bit for each exponent
in a range from 0 to
[C17:6.2.6.2/2] also says that there must be exactly one sign bit, i.e. the number of sign bits must be 1.
Function:
(defun sinteger-bit-roles-wfp (roles) (declare (xargs :guard (sinteger-bit-role-listp roles))) (let ((__function__ 'sinteger-bit-roles-wfp)) (declare (ignorable __function__)) (b* ((exponents (sinteger-bit-roles-exponents roles)) (m (len exponents)) ((when (= m 0)) nil) (sorted-exponents (insertion-sort exponents)) ((unless (equal sorted-exponents (acl2::integers-from-to 0 (1- m)))) nil) ((unless (= (sinteger-bit-roles-sign-count roles) 1)) nil)) t)))
Theorem:
(defthm booleanp-of-sinteger-bit-roles-wfp (b* ((yes/no (sinteger-bit-roles-wfp roles))) (booleanp yes/no)) :rule-classes :rewrite)
Theorem:
(defthm sinteger-bit-roles-wfp-of-sinteger-bit-role-list-fix-roles (equal (sinteger-bit-roles-wfp (sinteger-bit-role-list-fix roles)) (sinteger-bit-roles-wfp roles)))
Theorem:
(defthm sinteger-bit-roles-wfp-sinteger-bit-role-list-equiv-congruence-on-roles (implies (sinteger-bit-role-list-equiv roles roles-equiv) (equal (sinteger-bit-roles-wfp roles) (sinteger-bit-roles-wfp roles-equiv))) :rule-classes :congruence)