Build, and adjust if needed, a label address expression.
This is analogous to dimb-make/adjust-expr-unary, but for label address expression, which are conceptually similar to unary expressions, but have a different AST structure.
The unary operator
Function:
(defun dimb-make/adjust-expr-label-addr (arg) (declare (xargs :guard (exprp arg))) (declare (xargs :guard (expr-unambp arg))) (let ((__function__ 'dimb-make/adjust-expr-label-addr)) (declare (ignorable __function__)) (b* (((when (expr-case arg :ident)) (expr-label-addr (expr-ident->ident arg))) ((unless (expr-case arg :binary)) (raise "Internal error: ~ non-binary expression ~x0 ~ used as argument of unary operator &&." (expr-fix arg)) (expr-fix arg))) (make-expr-binary :op (expr-binary->op arg) :arg1 (dimb-make/adjust-expr-label-addr (expr-binary->arg1 arg)) :arg2 (expr-binary->arg2 arg) :info nil))))
Theorem:
(defthm exprp-of-dimb-make/adjust-expr-label-addr (b* ((expr (dimb-make/adjust-expr-label-addr arg))) (exprp expr)) :rule-classes :rewrite)
Theorem:
(defthm expr-unambp-of-dimb-make/adjust-expr-label-addr (implies (expr-unambp arg) (b* ((?expr (dimb-make/adjust-expr-label-addr arg))) (expr-unambp expr))))
Theorem:
(defthm dimb-make/adjust-expr-label-addr-of-expr-fix-arg (equal (dimb-make/adjust-expr-label-addr (expr-fix arg)) (dimb-make/adjust-expr-label-addr arg)))
Theorem:
(defthm dimb-make/adjust-expr-label-addr-expr-equiv-congruence-on-arg (implies (expr-equiv arg arg-equiv) (equal (dimb-make/adjust-expr-label-addr arg) (dimb-make/adjust-expr-label-addr arg-equiv))) :rule-classes :congruence)