• 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
          • Atc
            • Atc-implementation
              • Atc-abstract-syntax
              • Atc-pretty-printer
              • Atc-event-and-code-generation
                • Atc-symbolic-computation-states
                • Atc-symbolic-execution-rules
                • Atc-gen-ext-declon-lists
                • Atc-function-and-loop-generation
                • Atc-statement-generation
                • Atc-gen-fileset
                • Atc-gen-everything
                • Atc-gen-obj-declon
                • Atc-gen-fileset-event
                • Atc-tag-tables
                • Atc-expression-generation
                  • Atc-gen-expr-struct-read-array
                  • Atc-gen-expr-pure/bool
                  • Atc-gen-expr-integer-read
                  • Atc-gen-expr-cond
                  • Atc-gen-expr-binary
                  • Atc-gen-expr-or
                  • Atc-gen-expr-array-read
                  • Expr-gin
                  • Exprs-gin
                  • Atc-gen-expr-and
                  • Atc-gen-expr-struct-read-scalar
                  • Exprs-gout
                  • Atc-gen-expr-unary
                    • Atc-gen-expr-conv
                    • Expr-gout
                    • Atc-gen-expr-bool-from-type
                    • Atc-gen-expr-sint-from-bool
                    • Atc-gen-expr-const
                    • Atc-gen-expr-var
                    • Atc-gen-expr-pure-list
                    • Irr-exprs-gout
                    • Irr-expr-gout
                  • Atc-generation-contexts
                  • Atc-gen-wf-thm
                  • Term-checkers-atc
                  • Atc-variable-tables
                  • Term-checkers-common
                  • Atc-gen-init-fun-env-thm
                  • Atc-gen-appconds
                  • Read-write-variables
                  • Atc-gen-thm-assert-events
                  • Test*
                  • Atc-gen-prog-const
                  • Atc-gen-expr-bool
                  • Atc-theorem-generation
                  • Atc-tag-generation
                  • Atc-gen-expr-pure
                  • Atc-function-tables
                  • Atc-object-tables
                • Fty-pseudo-term-utilities
                • Atc-term-recognizers
                • Atc-input-processing
                • Atc-shallow-embedding
                • Atc-process-inputs-and-gen-everything
                • Atc-table
                • Atc-fn
                • Atc-pretty-printing-options
                • Atc-types
                • Atc-macro-definition
              • Atc-tutorial
              • Pure-expression-execution
            • 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
    • Atc-expression-generation

    Atc-gen-expr-unary

    Generate a C expression and theorem from an ACL2 term that represents a unary expression.

    Signature
    (atc-gen-expr-unary fn arg-term arg-expr arg-type arg-events 
                        arg-thm in-type out-type op gin state) 
     
      → 
    (mv erp gout)
    Arguments
    fn — Guard (symbolp fn).
    arg-term — Guard (pseudo-termp arg-term).
    arg-expr — Guard (exprp arg-expr).
    arg-type — Guard (typep arg-type).
    arg-events — Guard (pseudo-event-form-listp arg-events).
    arg-thm — Guard (symbolp arg-thm).
    in-type — Guard (typep in-type).
    out-type — Guard (typep out-type).
    op — Guard (unopp op).
    gin — Guard (expr-ginp gin).
    Returns
    gout — Type (expr-goutp gout).

    The expression and theorem for the argument are generated in the caller, and passed here.

    If the operation has an associated okp predicate, we also generate a theorem saying that the okp predicate holds under the guard.

    Definitions and Theorems

    Function: atc-gen-expr-unary

    (defun atc-gen-expr-unary (fn arg-term arg-expr arg-type arg-events
                                  arg-thm in-type out-type op gin state)
     (declare (xargs :stobjs (state)))
     (declare (xargs :guard (and (symbolp fn)
                                 (pseudo-termp arg-term)
                                 (exprp arg-expr)
                                 (typep arg-type)
                                 (pseudo-event-form-listp arg-events)
                                 (symbolp arg-thm)
                                 (typep in-type)
                                 (typep out-type)
                                 (unopp op)
                                 (expr-ginp gin))))
     (declare (xargs :guard (and (type-nonchar-integerp in-type)
                                 (type-nonchar-integerp out-type))))
     (let ((__function__ 'atc-gen-expr-unary))
      (declare (ignorable __function__))
      (b*
       (((reterr) (irr-expr-gout))
        (wrld (w state))
        ((expr-gin gin) gin)
        ((unless (equal arg-type in-type))
         (reterr
          (msg
           "The unary operator ~x0 is applied ~
                   to an expression term ~x1 returning ~x2, ~
                   but a ~x3 operand is expected. ~
                   This is indicative of provably dead code, ~
                   given that the code is guard-verified."
           op arg-term arg-type in-type)))
        (expr (make-expr-unary :op op :arg arg-expr))
        (term (cons fn (cons arg-term 'nil)))
        ((when (not gin.proofs))
         (retok (make-expr-gout :expr expr
                                :type out-type
                                :term term
                                :events arg-events
                                :thm-name nil
                                :thm-index gin.thm-index
                                :names-to-avoid gin.names-to-avoid)))
        (fn-okp (and (unop-case op :minus)
                     (not (member-eq (type-kind in-type)
                                     '(:uint :ulong :ullong)))
                     (pack fn '-okp)))
        ((mv okp-lemma-event?
             okp-lemma-name thm-index names-to-avoid)
         (if fn-okp
          (b*
           ((okp-lemma-name (pack gin.fn '-expr-
                                  gin.thm-index '-okp-lemma))
            ((mv okp-lemma-name names-to-avoid)
             (fresh-logical-name-with-$s-suffix
                  okp-lemma-name
                  nil gin.names-to-avoid wrld))
            (arg-uterm (untranslate$ arg-term nil state))
            (okp-lemma-formula (cons fn-okp (cons arg-uterm 'nil)))
            (okp-lemma-formula
                 (atc-contextualize okp-lemma-formula gin.context gin.fn
                                    gin.fn-guard nil nil nil nil wrld))
            (okp-lemma-hints
             (cons
              (cons
               '"Goal"
               (cons
                ':in-theory
                (cons
                 (cons
                    'quote
                    (cons (cons gin.fn-guard '(if* test* declar assign))
                          'nil))
                 (cons ':use
                       (cons (cons ':guard-theorem
                                   (cons gin.fn 'nil))
                             'nil)))))
              'nil))
            ((mv okp-lemma-event &)
             (evmac-generate-defthm okp-lemma-name
                                    :formula okp-lemma-formula
                                    :hints okp-lemma-hints
                                    :enable nil)))
           (mv (list okp-lemma-event)
               okp-lemma-name (1+ gin.thm-index)
               names-to-avoid))
          (mv nil
              nil gin.thm-index gin.names-to-avoid)))
        (hints
         (b*
          ((in-type-pred (atc-type-to-recognizer in-type gin.prec-tags))
           (valuep-when-in-type-pred (pack 'valuep-when- in-type-pred))
           (value-kind-when-in-type-pred
                (pack 'value-kind-when- in-type-pred))
           (op-name (pack (unop-kind op)))
           (exec-unary-when-op-and-in-type-pred
                (pack op-name '-value-when-
                      in-type-pred))
           (type-pred (atc-type-to-recognizer out-type gin.prec-tags))
           (valuep-when-type-pred (pack 'valuep-when- type-pred))
           (type-pred-of-fn (pack type-pred '-of- fn)))
          (cons
           (cons
            '"Goal"
            (cons
             ':in-theory
             (cons
              (cons
               'quote
               (cons
                (cons
                 'exec-expr-pure-when-unary
                 (cons
                  'expr-valuep-of-expr-value
                  (cons
                   'expr-value->value-of-expr-value
                   (cons
                    '(:e expr-kind)
                    (cons
                     '(:e expr-unary->op)
                     (cons
                      '(:e expr-unary->arg)
                      (cons
                       arg-thm
                       (cons
                        valuep-when-in-type-pred
                        (cons
                         value-kind-when-in-type-pred
                         (cons
                          valuep-when-type-pred
                          (cons
                           'value-fix-when-valuep
                           (cons
                            exec-unary-when-op-and-in-type-pred
                            (cons
                             (cons ':e
                                   (cons (pack 'unop- op-name) 'nil))
                             (cons
                               type-pred-of-fn
                               (and fn-okp
                                    (list okp-lemma-name))))))))))))))))
                'nil))
              'nil)))
           'nil)))
        ((mv thm-event
             thm-name thm-index names-to-avoid)
         (atc-gen-expr-pure-correct-thm
              gin.fn gin.fn-guard gin.context
              expr out-type term term acl2::*nil*
              gin.compst-var hints nil gin.prec-tags
              thm-index names-to-avoid state)))
       (retok (make-expr-gout
                   :expr expr
                   :type out-type
                   :term term
                   :events (append arg-events
                                   okp-lemma-event? (list thm-event))
                   :thm-name thm-name
                   :thm-index thm-index
                   :names-to-avoid names-to-avoid)))))

    Theorem: expr-goutp-of-atc-gen-expr-unary.gout

    (defthm expr-goutp-of-atc-gen-expr-unary.gout
      (b* (((mv acl2::?erp ?gout)
            (atc-gen-expr-unary fn arg-term arg-expr arg-type arg-events
                                arg-thm in-type out-type op gin state)))
        (expr-goutp gout))
      :rule-classes :rewrite)