• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • 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
        • Soft
        • C
        • Bv
        • Imp-language
        • Event-macros
        • Java
        • Bitcoin
        • Ethereum
        • Yul
        • Zcash
        • ACL2-programming-language
        • Prime-fields
        • Json
        • Syntheto
          • Process-syntheto-toplevel-fn
          • Translation
          • Language
            • Static-semantics
              • Check-expression-fns
              • Subtypep
              • Match-type
              • Check-product-update-expression
              • Get-builtin-function-in/out/pre-post
              • Check-sum-update-expression
              • Check-sum-field-expression
              • Check-strict-binary-expression
              • Check-lt/le/gt/ge-expression
              • Check-eq/ne-expression
              • Check-div/rem-expression
              • Check-add/sub/mul-expression
              • Align-let-vars-values
              • Check-iff-expression
              • Check-function-definition-top/nontop
              • Check-sum-construct-expression
              • Check-rem-expression
              • Check-mul-expression
              • Check-sub-expression
              • Check-div-expression
              • Check-add-expression
              • Check-ne-expression
              • Check-lt-expression
              • Check-le-expression
              • Check-gt-expression
              • Check-ge-expression
              • Check-eq-expression
              • Check-function-specifier
              • Type-result
              • Check-product-construct-expression
              • Supremum-type
              • Check-call-expression
              • Check-product-field-expression
              • Check-function-definer
              • Make-subproof-obligations
              • Get-function-in/out/pre/post
              • Check-sum-test-expression
              • Match-field
              • Decompose-expression
              • Match-to-target
              • Check-unary-expression
              • Max-supertype
              • Match-type-list
              • Check-minus-expression
              • Check-type-definition
              • Check-not-expression
              • Check-type-product
              • Match-field-list
              • Check-type-subset
              • Check-type-definition-in-recursion
              • Align-let-vars-values-aux
              • Non-trivial-proof-obligation
              • Check-type-recursion
              • Check-function-specification
              • Check-toplevel
              • Supremum-type-list
              • Check-component-expression
              • Check-branch-list
              • Check-function-recursion
                • Check-function-definition
                • Binding
                • Check-function-header
                • Check-function-definition-list
                • Check-type-definition-list-in-recursion
                • Check-theorem
                • Check-nonstrict-binary-expression
                • Context-add-variables
                • Decompose-expression-aux
                • Check-alternative
                • Check-multi-expression
                • Check-type-sum
                • Check-type
                • Check-alternative-list
                • Context-add-condition
                • Check-type-definer
                • Check-transform
                • Check-variable
                • Check-transform-args
                • Check-toplevel-list
                • Context-add-condition-list
                • Check-if/when/unless-expression
                • Initializers-to-variable-substitution
                • Context-add-binding
                • Check-function-header-list
                • Context-add-toplevel
                • Ensure-single-type
                • Max-supertypes
                • Check-bind-expression
                • Check-type-list
                • Check-literal
                • Literal-type
                • Check-expression-list
                • Variable-context
                • Check-cond-expression
                • Check-branch
                • Args-without-defaults
                • Check-expression
                • *builtin-function-names*
                • Function-called-in
              • Abstract-syntax
              • Outcome
              • Abstract-syntax-operations
              • Outcome-list
              • Outcomes
            • Process-syntheto-toplevel
            • Shallow-embedding
          • File-io-light
          • Cryptography
          • Number-theory
          • Lists-light
          • Axe
          • Builtins
          • Solidity
          • Helpers
          • Htclient
          • Typed-lists-light
          • Arithmetic-light
        • X86isa
        • Axe
        • Execloader
      • Math
      • Testing-utilities
    • Static-semantics

    Check-function-recursion

    Check if a function recursion is statically well-formed.

    Signature
    (check-function-recursion funrec ctxt) → (mv err? obligs)
    Arguments
    funrec — Guard (function-recursionp funrec).
    ctxt — Guard (contextp ctxt).
    Returns
    obligs — Type (proof-obligation-listp obligs).

    This is always at the top level, so the context has no types or functions being defined, no variables in scope, and no obligation variables and hypotheses.

    We ensure that there are at least two functions, otherwise it would not be a mutual recursion. We also ensure that the function names are all distinct. We add the headers to the context and check all the definitions.

    Definitions and Theorems

    Function: check-function-recursion

    (defun check-function-recursion (funrec ctxt)
     (declare (xargs :guard (and (function-recursionp funrec)
                                 (contextp ctxt))))
     (declare
          (xargs :guard (and (null (context->types ctxt))
                             (null (context->functions ctxt))
                             (omap::emptyp (context->variables ctxt))
                             (null (context->obligation-vars ctxt))
                             (null (context->obligation-hyps ctxt)))))
     (let ((__function__ 'check-function-recursion))
       (declare (ignorable __function__))
       (b*
        ((fundefs (function-recursion->definitions funrec))
         (headers (function-definition-list->header-list fundefs))
         (names (function-header-list->name-list headers))
         ((unless (>= (len names) 2))
          (mv (list :function-recursion-less-than-two-functions fundefs)
              nil))
         ((unless (no-duplicatesp-equal names))
          (mv (list :duplicate-recursive-functions names)
              nil))
         (ctxt (change-context ctxt
                               :functions headers)))
        (check-function-definition-list fundefs ctxt))))

    Theorem: proof-obligation-listp-of-check-function-recursion.obligs

    (defthm proof-obligation-listp-of-check-function-recursion.obligs
      (b* (((mv ?err? ?obligs)
            (check-function-recursion funrec ctxt)))
        (proof-obligation-listp obligs))
      :rule-classes :rewrite)

    Theorem: check-function-recursion-of-function-recursion-fix-funrec

    (defthm check-function-recursion-of-function-recursion-fix-funrec
      (equal (check-function-recursion (function-recursion-fix funrec)
                                       ctxt)
             (check-function-recursion funrec ctxt)))

    Theorem: check-function-recursion-function-recursion-equiv-congruence-on-funrec

    (defthm
     check-function-recursion-function-recursion-equiv-congruence-on-funrec
     (implies (function-recursion-equiv funrec funrec-equiv)
              (equal (check-function-recursion funrec ctxt)
                     (check-function-recursion funrec-equiv ctxt)))
     :rule-classes :congruence)

    Theorem: check-function-recursion-of-context-fix-ctxt

    (defthm check-function-recursion-of-context-fix-ctxt
      (equal (check-function-recursion funrec (context-fix ctxt))
             (check-function-recursion funrec ctxt)))

    Theorem: check-function-recursion-context-equiv-congruence-on-ctxt

    (defthm check-function-recursion-context-equiv-congruence-on-ctxt
      (implies (context-equiv ctxt ctxt-equiv)
               (equal (check-function-recursion funrec ctxt)
                      (check-function-recursion funrec ctxt-equiv)))
      :rule-classes :congruence)