• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Community
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
    • Interfacing-tools
    • Hardware-verification
    • Software-verification
      • Kestrel-books
        • Crypto-hdwallet
        • Apt
        • Error-checking
        • Fty-extensions
        • Isar
        • Kestrel-utilities
        • Set
        • C
          • Syntax-for-tools
            • Formalized-subset
              • Exprs-formalp
                • Expr-formalp
                • Expr-list-formalp
              • Stmts-formalp
              • Type-spec-list-integer-formalp
              • Type-spec-list-formalp
              • Extdecl-formalp
              • Ident-formalp
              • Tyname-formalp
              • Pointers-formalp
              • Dirdeclor-obj-formalp
              • Desiniter-formalp
              • Fundef-formalp
              • Decl-obj-formalp
              • Decl-block-formalp
              • Struct-declon-formalp
              • Initdeclor-obj-formalp
              • Initdeclor-block-formalp
              • Decl-struct-formalp
              • Dirdeclor-fun-formalp
              • Dirdeclor-block-formalp
              • Initdeclor-fun-formalp
              • Transunit-ensemble-formalp
              • Param-declor-formalp
              • Param-declon-formalp
              • Declor-obj-formalp
              • Decl-fun-formalp
              • Struct-declor-formalp
              • Struct-declon-list-formalp
              • Initer-formalp
              • Struni-spec-formalp
              • Stor-spec-list-formalp
              • Declor-fun-formalp
              • Declor-block-formalp
              • Param-declon-list-formalp
              • Desiniter-list-formalp
              • Extdecl-list-formalp
              • Transunit-formalp
              • Const-formalp
              • Stmt-formalp
              • Expr-formalp
              • Expr-list-formalp
              • Block-item-list-formalp
              • Block-item-formalp
              • Comp-stmt-formalp
            • Mapping-to-language-definition
            • Input-files
            • Compilation-database
            • Printer
            • Output-files
            • Abstract-syntax-operations
            • Implementation-environments
            • Abstract-syntax
            • Concrete-syntax
            • Disambiguation
            • Validation
            • Gcc-builtins
            • Preprocessing
            • Parsing
          • Atc
          • Transformation-tools
          • Language
          • Representation
          • Insertion-sort
          • Pack
        • Soft
        • Bv
        • Imp-language
        • Ethereum
        • Event-macros
        • Java
        • Riscv
        • Bitcoin
        • Zcash
        • Yul
        • ACL2-programming-language
        • Prime-fields
        • Json
        • Syntheto
        • File-io-light
        • Cryptography
        • Number-theory
        • Axe
        • Lists-light
        • Builtins
        • Solidity
        • Helpers
        • Htclient
        • Typed-lists-light
        • Arithmetic-light
      • X86isa
      • Axe
      • Execloader
    • Math
    • Testing-utilities
  • Formalized-subset

Exprs-formalp

Check if expressions and expression lists have a formal dynamic semantics.

Definitions and Theorems

Function: expr-formalp

(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: expr-list-formalp

(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: return-type-of-expr-formalp.yes/no

(defthm return-type-of-expr-formalp.yes/no
  (b* ((?yes/no (expr-formalp expr)))
    (booleanp yes/no))
  :rule-classes :rewrite)

Theorem: return-type-of-expr-list-formalp.yes/no

(defthm return-type-of-expr-list-formalp.yes/no
  (b* ((?yes/no (expr-list-formalp exprs)))
    (booleanp yes/no))
  :rule-classes :rewrite)

Theorem: expr-formalp-of-expr-fix-expr

(defthm expr-formalp-of-expr-fix-expr
  (equal (expr-formalp (expr-fix expr))
         (expr-formalp expr)))

Theorem: expr-list-formalp-of-expr-list-fix-exprs

(defthm expr-list-formalp-of-expr-list-fix-exprs
  (equal (expr-list-formalp (expr-list-fix exprs))
         (expr-list-formalp exprs)))

Theorem: expr-formalp-expr-equiv-congruence-on-expr

(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: expr-list-formalp-expr-list-equiv-congruence-on-exprs

(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: expr-list-formalp-of-cons

(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: expr-list-formalp-of-cdr-when-expr-list-formalp

(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: expr-list-formalp-when-not-consp

(defthm expr-list-formalp-when-not-consp
  (implies (not (consp acl2::x))
           (expr-list-formalp acl2::x))
  :rule-classes ((:rewrite)))

Theorem: expr-formalp-of-car-when-expr-list-formalp

(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: expr-list-formalp-of-append

(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: expr-list-formalp-of-list-fix

(defthm expr-list-formalp-of-list-fix
  (equal (expr-list-formalp (list-fix acl2::x))
         (expr-list-formalp acl2::x))
  :rule-classes ((:rewrite)))

Theorem: expr-list-formalp-of-sfix

(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: expr-list-formalp-of-insert

(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: expr-list-formalp-of-delete

(defthm expr-list-formalp-of-delete
  (implies (expr-list-formalp acl2::x)
           (expr-list-formalp (delete acl2::k acl2::x)))
  :rule-classes ((:rewrite)))

Theorem: expr-list-formalp-of-mergesort

(defthm expr-list-formalp-of-mergesort
  (iff (expr-list-formalp (mergesort acl2::x))
       (expr-list-formalp (list-fix acl2::x)))
  :rule-classes ((:rewrite)))

Theorem: expr-list-formalp-of-union

(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: expr-list-formalp-of-intersect-1

(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: expr-list-formalp-of-intersect-2

(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: expr-list-formalp-of-difference

(defthm expr-list-formalp-of-difference
  (implies (expr-list-formalp acl2::x)
           (expr-list-formalp (difference acl2::x acl2::y)))
  :rule-classes ((:rewrite)))

Theorem: expr-list-formalp-of-duplicated-members

(defthm expr-list-formalp-of-duplicated-members
  (implies (expr-list-formalp acl2::x)
           (expr-list-formalp (duplicated-members acl2::x)))
  :rule-classes ((:rewrite)))

Theorem: expr-list-formalp-of-rev

(defthm expr-list-formalp-of-rev
  (equal (expr-list-formalp (rev acl2::x))
         (expr-list-formalp (list-fix acl2::x)))
  :rule-classes ((:rewrite)))

Theorem: expr-list-formalp-of-rcons

(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: expr-formalp-when-member-equal-of-expr-list-formalp

(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: expr-list-formalp-when-subsetp-equal

(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: expr-list-formalp-set-equiv-congruence

(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: expr-list-formalp-of-set-difference-equal

(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: expr-list-formalp-of-intersection-equal-1

(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: expr-list-formalp-of-intersection-equal-2

(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: expr-list-formalp-of-union-equal

(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: expr-list-formalp-of-take

(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: expr-list-formalp-of-repeat

(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: expr-formalp-of-nth-when-expr-list-formalp

(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: expr-list-formalp-of-update-nth

(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: expr-list-formalp-of-butlast

(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: expr-list-formalp-of-nthcdr

(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: expr-list-formalp-of-last

(defthm expr-list-formalp-of-last
  (implies (expr-list-formalp (double-rewrite acl2::x))
           (expr-list-formalp (last acl2::x)))
  :rule-classes ((:rewrite)))

Theorem: expr-list-formalp-of-remove

(defthm expr-list-formalp-of-remove
  (implies (expr-list-formalp acl2::x)
           (expr-list-formalp (remove acl2::a acl2::x)))
  :rule-classes ((:rewrite)))

Theorem: expr-list-formalp-of-revappend

(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)))

Subtopics

Expr-formalp
Check if an expression has a formal dynamic semantics.
Expr-list-formalp
Check if all the expressions in a list of expressions have a formal dynamic semantics.