Check if expressions and expression lists have a formal dynamic semantics.
Function:
(defun expr-formalp (expr) (declare (xargs :guard (exprp expr))) (declare (xargs :guard (expr-unambp expr))) (let ((__function__ 'expr-formalp)) (declare (ignorable __function__)) (expr-case expr :ident (ident-formalp expr.ident) :const (const-formalp expr.const) :string nil :paren (expr-formalp expr.inner) :gensel nil :arrsub (and (expr-formalp expr.arg1) (expr-formalp expr.arg2) (expr-purep expr.arg1) (expr-purep expr.arg2)) :funcall (and (expr-case expr.fun :ident) (ident-formalp (expr-ident->ident expr.fun)) (expr-list-formalp expr.args) (expr-list-purep expr.args)) :member (and (expr-formalp expr.arg) (ident-formalp expr.name)) :memberp (and (expr-formalp expr.arg) (ident-formalp expr.name)) :complit nil :unary (unop-case expr.op :address (expr-formalp expr.arg) :indir (expr-formalp expr.arg) :plus (expr-formalp expr.arg) :minus (expr-formalp expr.arg) :bitnot (expr-formalp expr.arg) :lognot (expr-formalp expr.arg) :preinc nil :predec nil :postinc nil :postdec nil :sizeof nil :alignof nil :real nil :imag nil) :label-addr nil :sizeof nil :sizeof-ambig (impossible) :alignof nil :alignof-ambig (impossible) :cast (and (tyname-formalp expr.type) (expr-formalp expr.arg)) :binary (cond ((and (binop-strictp expr.op) (binop-purep expr.op)) (and (expr-formalp expr.arg1) (expr-formalp expr.arg2) (expr-purep expr.arg1) (expr-purep expr.arg2))) ((member-eq (binop-kind expr.op) '(:logand :logor)) (and (expr-formalp expr.arg1) (expr-formalp expr.arg2))) ((eq (binop-kind expr.op) :asg) (and (expr-formalp expr.arg1) (expr-formalp expr.arg2) (or (expr-case expr.arg1 :ident) (expr-purep expr.arg2)))) (t nil)) :cond (and (expr-formalp expr.test) (expr-option-case expr.then :some (expr-formalp expr.then.val) :none nil) (expr-formalp expr.else)) :comma nil :cast/call-ambig (impossible) :cast/mul-ambig (impossible) :cast/add-ambig (impossible) :cast/sub-ambig (impossible) :cast/and-ambig (impossible) :cast/logand-ambig (impossible) :stmt nil :tycompat nil :offsetof nil :va-arg nil :extension nil)))
Function:
(defun expr-list-formalp (exprs) (declare (xargs :guard (expr-listp exprs))) (declare (xargs :guard (expr-list-unambp exprs))) (let ((__function__ 'expr-list-formalp)) (declare (ignorable __function__)) (or (endp exprs) (and (expr-formalp (car exprs)) (expr-list-formalp (cdr exprs))))))
Theorem:
(defthm return-type-of-expr-formalp.yes/no (b* ((?yes/no (expr-formalp expr))) (booleanp yes/no)) :rule-classes :rewrite)
Theorem:
(defthm return-type-of-expr-list-formalp.yes/no (b* ((?yes/no (expr-list-formalp exprs))) (booleanp yes/no)) :rule-classes :rewrite)
Theorem:
(defthm expr-formalp-of-expr-fix-expr (equal (expr-formalp (expr-fix expr)) (expr-formalp expr)))
Theorem:
(defthm expr-list-formalp-of-expr-list-fix-exprs (equal (expr-list-formalp (expr-list-fix exprs)) (expr-list-formalp exprs)))
Theorem:
(defthm expr-formalp-expr-equiv-congruence-on-expr (implies (expr-equiv expr expr-equiv) (equal (expr-formalp expr) (expr-formalp expr-equiv))) :rule-classes :congruence)
Theorem:
(defthm expr-list-formalp-expr-list-equiv-congruence-on-exprs (implies (expr-list-equiv exprs exprs-equiv) (equal (expr-list-formalp exprs) (expr-list-formalp exprs-equiv))) :rule-classes :congruence)
Theorem:
(defthm expr-list-formalp-of-cons (equal (expr-list-formalp (cons acl2::a acl2::x)) (and (expr-formalp acl2::a) (expr-list-formalp acl2::x))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-cdr-when-expr-list-formalp (implies (expr-list-formalp (double-rewrite acl2::x)) (expr-list-formalp (cdr acl2::x))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-when-not-consp (implies (not (consp acl2::x)) (expr-list-formalp acl2::x)) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-formalp-of-car-when-expr-list-formalp (implies (expr-list-formalp acl2::x) (iff (expr-formalp (car acl2::x)) (consp acl2::x))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-append (equal (expr-list-formalp (append acl2::a acl2::b)) (and (expr-list-formalp acl2::a) (expr-list-formalp acl2::b))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-list-fix (equal (expr-list-formalp (list-fix acl2::x)) (expr-list-formalp acl2::x)) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-sfix (iff (expr-list-formalp (sfix acl2::x)) (or (expr-list-formalp acl2::x) (not (setp acl2::x)))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-insert (iff (expr-list-formalp (insert acl2::a acl2::x)) (and (expr-list-formalp (sfix acl2::x)) (expr-formalp acl2::a))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-delete (implies (expr-list-formalp acl2::x) (expr-list-formalp (delete acl2::k acl2::x))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-mergesort (iff (expr-list-formalp (mergesort acl2::x)) (expr-list-formalp (list-fix acl2::x))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-union (iff (expr-list-formalp (union acl2::x acl2::y)) (and (expr-list-formalp (sfix acl2::x)) (expr-list-formalp (sfix acl2::y)))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-intersect-1 (implies (expr-list-formalp acl2::x) (expr-list-formalp (intersect acl2::x acl2::y))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-intersect-2 (implies (expr-list-formalp acl2::y) (expr-list-formalp (intersect acl2::x acl2::y))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-difference (implies (expr-list-formalp acl2::x) (expr-list-formalp (difference acl2::x acl2::y))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-duplicated-members (implies (expr-list-formalp acl2::x) (expr-list-formalp (duplicated-members acl2::x))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-rev (equal (expr-list-formalp (rev acl2::x)) (expr-list-formalp (list-fix acl2::x))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-rcons (iff (expr-list-formalp (rcons acl2::a acl2::x)) (and (expr-formalp acl2::a) (expr-list-formalp (list-fix acl2::x)))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-formalp-when-member-equal-of-expr-list-formalp (and (implies (and (member-equal acl2::a acl2::x) (expr-list-formalp acl2::x)) (expr-formalp acl2::a)) (implies (and (expr-list-formalp acl2::x) (member-equal acl2::a acl2::x)) (expr-formalp acl2::a))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-when-subsetp-equal (and (implies (and (subsetp-equal acl2::x acl2::y) (expr-list-formalp acl2::y)) (expr-list-formalp acl2::x)) (implies (and (expr-list-formalp acl2::y) (subsetp-equal acl2::x acl2::y)) (expr-list-formalp acl2::x))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-set-equiv-congruence (implies (set-equiv acl2::x acl2::y) (equal (expr-list-formalp acl2::x) (expr-list-formalp acl2::y))) :rule-classes :congruence)
Theorem:
(defthm expr-list-formalp-of-set-difference-equal (implies (expr-list-formalp acl2::x) (expr-list-formalp (set-difference-equal acl2::x acl2::y))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-intersection-equal-1 (implies (expr-list-formalp (double-rewrite acl2::x)) (expr-list-formalp (intersection-equal acl2::x acl2::y))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-intersection-equal-2 (implies (expr-list-formalp (double-rewrite acl2::y)) (expr-list-formalp (intersection-equal acl2::x acl2::y))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-union-equal (equal (expr-list-formalp (union-equal acl2::x acl2::y)) (and (expr-list-formalp (list-fix acl2::x)) (expr-list-formalp (double-rewrite acl2::y)))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-take (implies (expr-list-formalp (double-rewrite acl2::x)) (iff (expr-list-formalp (take acl2::n acl2::x)) (or (expr-formalp nil) (<= (nfix acl2::n) (len acl2::x))))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-repeat (iff (expr-list-formalp (repeat acl2::n acl2::x)) (or (expr-formalp acl2::x) (zp acl2::n))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-formalp-of-nth-when-expr-list-formalp (implies (expr-list-formalp acl2::x) (iff (expr-formalp (nth acl2::n acl2::x)) (< (nfix acl2::n) (len acl2::x)))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-update-nth (implies (expr-list-formalp (double-rewrite acl2::x)) (iff (expr-list-formalp (update-nth acl2::n acl2::y acl2::x)) (and (expr-formalp acl2::y) (or (<= (nfix acl2::n) (len acl2::x)) (expr-formalp nil))))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-butlast (implies (expr-list-formalp (double-rewrite acl2::x)) (expr-list-formalp (butlast acl2::x acl2::n))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-nthcdr (implies (expr-list-formalp (double-rewrite acl2::x)) (expr-list-formalp (nthcdr acl2::n acl2::x))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-last (implies (expr-list-formalp (double-rewrite acl2::x)) (expr-list-formalp (last acl2::x))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-remove (implies (expr-list-formalp acl2::x) (expr-list-formalp (remove acl2::a acl2::x))) :rule-classes ((:rewrite)))
Theorem:
(defthm expr-list-formalp-of-revappend (equal (expr-list-formalp (revappend acl2::x acl2::y)) (and (expr-list-formalp (list-fix acl2::x)) (expr-list-formalp acl2::y))) :rule-classes ((:rewrite)))