Check if a
(end-of-for-loop-p name bound env) → yes/no
This is used in exec-for-loop-iterations,
to check whether the iterations end.
We retrieve the value of the named loop variable,
and compare it with the bound:
the loop has ended if the value is greater than or equal to the bound.
If the loop variable does not exist, or is not integer,
we return
Function:
(defun end-of-for-loop-p (name bound env) (declare (xargs :guard (and (identifierp name) (integerp bound) (denvp env)))) (let ((__function__ 'end-of-for-loop-p)) (declare (ignorable __function__)) (b* ((info (get-var/const-dinfo name env)) ((unless info) nil) (val (var/const-dinfo->value info)) ((unless (int-valuep val)) nil) (int (int-value-to-int val))) (>= int (ifix bound)))))
Theorem:
(defthm booleanp-of-end-of-for-loop-p (b* ((yes/no (end-of-for-loop-p name bound env))) (booleanp yes/no)) :rule-classes :rewrite)
Theorem:
(defthm end-of-for-loop-p-of-identifier-fix-name (equal (end-of-for-loop-p (identifier-fix name) bound env) (end-of-for-loop-p name bound env)))
Theorem:
(defthm end-of-for-loop-p-identifier-equiv-congruence-on-name (implies (identifier-equiv name name-equiv) (equal (end-of-for-loop-p name bound env) (end-of-for-loop-p name-equiv bound env))) :rule-classes :congruence)
Theorem:
(defthm end-of-for-loop-p-of-ifix-bound (equal (end-of-for-loop-p name (ifix bound) env) (end-of-for-loop-p name bound env)))
Theorem:
(defthm end-of-for-loop-p-int-equiv-congruence-on-bound (implies (acl2::int-equiv bound bound-equiv) (equal (end-of-for-loop-p name bound env) (end-of-for-loop-p name bound-equiv env))) :rule-classes :congruence)
Theorem:
(defthm end-of-for-loop-p-of-denv-fix-env (equal (end-of-for-loop-p name bound (denv-fix env)) (end-of-for-loop-p name bound env)))
Theorem:
(defthm end-of-for-loop-p-denv-equiv-congruence-on-env (implies (denv-equiv env env-equiv) (equal (end-of-for-loop-p name bound env) (end-of-for-loop-p name bound env-equiv))) :rule-classes :congruence)