• Top
    • Documentation
    • Books
    • Recursion-and-induction
    • Boolean-reasoning
    • Projects
    • Debugging
    • Std
      • Std/lists
      • Std/alists
      • Obags
      • Std/util
      • Std/strings
      • Std/io
      • Std/osets
      • Std/system
        • Fresh-logical-name-with-$s-suffix
        • Irrelevant-formals-info
        • Std/system/function-queries
          • Defun-sk-queries
          • Tail-recursive-p
          • Termination-theorem$
          • Measure
          • Arity+
            • Unwrapped-nonexec-body+
            • Ubody
            • Ruler-extenders+
            • Recursive-calls
            • Guard-theorem-no-simplify$
            • Well-founded-relation+
            • Unwrapped-nonexec-body
            • Measured-subset+
            • Measure+
            • Ruler-extenders
            • Number-of-results+
            • Induction-machine+
            • Non-executablep+
            • Pure-raw-p
            • Irecursivep+
            • Formals+
            • Stobjs-out+
            • Induction-machine
            • Definedp+
            • Number-of-results
            • Ubody+
            • Guard-theorem-no-simplify
            • Uguard
            • Rawp
            • Irecursivep
            • Defchoose-queries
            • Uguard+
            • Stobjs-in+
            • No-stobjs-p+
            • Well-founded-relation
            • Definedp
            • Primitivep+
            • Guard-verified-p+
            • No-stobjs-p
            • Measured-subset
            • Guard-verified-p
            • Primitivep
            • Non-executablep
            • Fundef-enabledp
            • Fundef-disabledp
            • Ibody
            • Std/system/arity
          • Std/system/term-queries
          • Std/system/term-transformations
          • Std/system/enhanced-utilities
          • Install-not-normalized-event-lst
          • Install-not-normalized-event
          • Std/system/term-function-recognizers
          • Pseudo-tests-and-call-listp
          • Genvar$
          • Std/system/event-name-queries
          • Maybe-pseudo-event-formp
          • Add-suffix-to-fn-or-const
          • Chk-irrelevant-formals-ok
          • Std/system/good-atom-listp
          • Pseudo-tests-and-callp
          • Table-alist+
          • Add-suffix-to-fn-or-const-lst
          • Known-packages+
          • Add-suffix-to-fn-lst
          • Unquote-term
          • Event-landmark-names
          • Add-suffix-lst
          • Std/system/theorem-queries
          • Unquote-term-list
          • Std/system/macro-queries
          • Pseudo-event-landmark-listp
          • Pseudo-command-landmark-listp
          • Install-not-normalized$
          • Rune-disabledp
          • Known-packages
          • Std/system/partition-rest-and-keyword-args
          • Rune-enabledp
          • Included-books
          • Std/system/pseudo-event-formp
          • Std/system/plist-worldp-with-formals
          • Std/system/w
          • Std/system/geprops
          • Std/system/arglistp
          • Std/system-extensions
          • Std/system/constant-queries
        • Std/basic
        • Std/typed-lists
        • Std/bitsets
        • Std/testing
        • Std/typed-alists
        • Std/stobjs
        • Std-extensions
      • Proof-automation
      • Macro-libraries
      • ACL2
      • Interfacing-tools
      • Hardware-verification
      • Software-verification
      • Testing-utilities
      • Math
    • Std/system/function-queries

    Arity+

    Enhanced variant of arity.

    Signature
    (arity+ fn wrld) → arity
    Arguments
    fn — Guard (pseudo-termfnp fn).
    wrld — Guard (plist-worldp wrld).
    Returns
    arity — Type (natp arity).

    This returns the same result as arity on named functions and lambda expressions, but it causes an error on symbols that do not name functions (while arity returns nil in this case).

    Compared to arity, arity+ has a slightly stronger guard on fn but a weaker guard on wrld. The reason for weakening the guard on wrld, from plist-worldp-with-formals to plist-worldp is a practical one: when doing system programming, currently plist-worldp is normally used for the ACL2 world, so using plist-worldp-with-formals in some system utilities (like arity+ here) would essentially force its use in many or all the other utilities.

    Since arity has a stronger guard on the world, in order for arity+ to be guard-verified, it cannot call arity. Thus, here we replicate the (simple) code of arity, with the only slight difference that, logically, we return 0 if fn does not name a function (but in this case an error actually occurs), so that the return type theorem is simpler.

    Definitions and Theorems

    Function: arity+

    (defun
     arity+ (fn wrld)
     (declare (xargs :guard (and (pseudo-termfnp fn)
                                 (plist-worldp wrld))))
     (let
      ((__function__ 'arity+))
      (declare (ignorable __function__))
      (cond
       ((flambdap fn)
        (len (lambda-formals fn)))
       (t (len (b* ((formals (getpropc fn 'formals t wrld)))
                   (if (eq formals t)
                       (raise "The symbol ~x0 does not name a function."
                              fn)
                       formals)))))))

    Theorem: natp-of-arity+

    (defthm natp-of-arity+
            (b* ((arity (arity+ fn wrld)))
                (natp arity))
            :rule-classes :rewrite)