Test a scalar value logically.
In some contexts (e.g. conditional tests), a scalar is treated as a logical boolean: false if 0 (i.e. null if a pointer), true if not 0 (i.e. not null if a pointer). This is captured by this ACL2 function.
Function:
(defun test-scalar-value (val) (declare (xargs :guard (valuep val))) (declare (xargs :guard (value-scalarp val))) (let ((__function__ 'test-scalar-value)) (declare (ignorable __function__)) (cond ((value-integerp val) (test-integer-value val)) ((value-case val :pointer) (test-pointer-value val)) (t (ec-call (acl2::bool-fix (impossible)))))))
Theorem:
(defthm booleanp-of-test-scalar-value (b* ((res (test-scalar-value val))) (booleanp res)) :rule-classes :rewrite)
Theorem:
(defthm test-scalar-value-of-value-fix-val (equal (test-scalar-value (value-fix val)) (test-scalar-value val)))
Theorem:
(defthm test-scalar-value-value-equiv-congruence-on-val (implies (value-equiv val val-equiv) (equal (test-scalar-value val) (test-scalar-value val-equiv))) :rule-classes :congruence)