Check an output expression.
(check-output-expression outexpr env) → type
The expression must be a value expression. We type-check it in the initial (i.e. empty) static environment.
Function:
(defun check-output-expression (outexpr env) (declare (xargs :guard (and (output-expressionp outexpr) (senvp env)))) (let ((__function__ 'check-output-expression)) (declare (ignorable __function__)) (b* ((expr (output-expression->get outexpr)) ((unless (expression-valuep expr)) (reserrf (list :not-value-expression expr))) ((okf etype) (typecheck-expression expr env))) (expr-type->type etype))))
Theorem:
(defthm type-resultp-of-check-output-expression (b* ((type (check-output-expression outexpr env))) (type-resultp type)) :rule-classes :rewrite)
Theorem:
(defthm check-output-expression-of-output-expression-fix-outexpr (equal (check-output-expression (output-expression-fix outexpr) env) (check-output-expression outexpr env)))
Theorem:
(defthm check-output-expression-output-expression-equiv-congruence-on-outexpr (implies (output-expression-equiv outexpr outexpr-equiv) (equal (check-output-expression outexpr env) (check-output-expression outexpr-equiv env))) :rule-classes :congruence)
Theorem:
(defthm check-output-expression-of-senv-fix-env (equal (check-output-expression outexpr (senv-fix env)) (check-output-expression outexpr env)))
Theorem:
(defthm check-output-expression-senv-equiv-congruence-on-env (implies (senv-equiv env env-equiv) (equal (check-output-expression outexpr env) (check-output-expression outexpr env-equiv))) :rule-classes :congruence)