• Top
    • Documentation
    • Books
    • Recursion-and-induction
    • Boolean-reasoning
      • Ipasir
      • Aignet
      • Aig
      • Satlink
      • Truth
        • Index-permute-shrink
          • Permute-stretch
          • Env-mismatch-aux
          • Permute-shrink
          • Permute-polarity
          • Env-permute-polarity
          • Env-permute-shrink
          • Permute-var-down
          • Swap-vars-aux
          • Env-permute-stretch
          • Swap-vars
          • Permute-var-up
          • Negative-cofactor
          • Truth-perm-rev
          • Index-permute-stretch
          • Env-mismatch
          • Truth-perm
          • Swap-polarity
          • Positive-cofactor
          • Index-perm-rev
          • Env-perm-rev
          • Nth-set-bit-pos
          • Index-swap
          • Env-move-var-down
          • Is-xor-with-var
          • Index-perm
          • Env-swap-vars
          • Var
          • Truth-eval
          • Index-move-down
          • Env-update
          • Env-perm
          • Depends-on-witness
          • Env-swap-polarity
          • Var-repetitions
          • Env-move-var-up
          • Index-move-up
          • Depends-on
          • Truth-norm
          • Index-listp
          • Env-diff-index
          • Env-lookup
          • True
          • False
        • Ubdds
        • Bdd
        • Faig
        • Bed
        • 4v
      • Projects
      • Debugging
      • Std
      • Proof-automation
      • Macro-libraries
      • ACL2
      • Interfacing-tools
      • Hardware-verification
      • Software-verification
      • Testing-utilities
      • Math
    • Truth

    Index-permute-shrink

    Signature
    (index-permute-shrink n count mask x numvars) → perm-index
    Arguments
    n — Guard (natp n).
    mask — Guard (natp mask).
    x — Guard (natp x).
    numvars — Guard (natp numvars).
    Returns
    perm-index — Type (natp perm-index).

    Definitions and Theorems

    Function: index-permute-shrink

    (defun
      index-permute-shrink
      (n count mask x numvars)
      (declare (xargs :guard (and (natp n)
                                  (natp mask)
                                  (natp x)
                                  (natp numvars))))
      (declare
           (xargs :guard (and (<= n numvars)
                              (eql count (logcount (loghead n mask))))))
      (let ((__function__ 'index-permute-shrink))
           (declare (ignorable __function__))
           (b* (((when (mbe :logic (zp (- (nfix numvars) (nfix n)))
                            :exec (eql n numvars)))
                 (lnfix x))
                (n (lnfix n))
                (count (mbe :logic (logcount (loghead n (lnfix mask)))
                            :exec count))
                (bit (logbit n (lnfix mask)))
                (x (if (eql bit 1)
                       (index-move-down count n x)
                       x)))
               (index-permute-shrink (1+ n)
                                     (+ bit count)
                                     mask x numvars))))

    Theorem: natp-of-index-permute-shrink

    (defthm
        natp-of-index-permute-shrink
        (b* ((perm-index (index-permute-shrink n count mask x numvars)))
            (natp perm-index))
        :rule-classes :type-prescription)

    Theorem: index-permute-shrink-bound

    (defthm
       index-permute-shrink-bound
       (b* ((?perm-index (index-permute-shrink n count mask x numvars)))
           (implies (< (nfix x) (nfix numvars))
                    (< perm-index (nfix numvars))))
       :rule-classes :linear)

    Theorem: index-permute-shrink-normalize-count

    (defthm
         index-permute-shrink-normalize-count
         (implies (syntaxp (not (equal count ''nil)))
                  (equal (index-permute-shrink n count mask x numvars)
                         (index-permute-shrink n nil mask x numvars))))

    Theorem: index-permute-shrink-of-index-permute-stretch

    (defthm index-permute-shrink-of-index-permute-stretch
            (equal (index-permute-shrink
                        n count mask
                        (index-permute-stretch n count2 mask x numvars)
                        numvars)
                   (nfix x)))

    Theorem: index-permute-stretch-of-index-permute-shrink

    (defthm index-permute-stretch-of-index-permute-shrink
            (equal (index-permute-stretch
                        n count mask
                        (index-permute-shrink n count2 mask x numvars)
                        numvars)
                   (nfix x)))

    Theorem: index-permute-stretch-one-to-one

    (defthm
     index-permute-stretch-one-to-one
     (implies
         (not (equal (nfix x) (nfix y)))
         (not (equal (index-permute-stretch n count mask x numvars)
                     (index-permute-stretch n count2 mask y numvars)))))

    Theorem: index-permute-shrink-one-to-one

    (defthm
     index-permute-shrink-one-to-one
     (implies
          (not (equal (nfix x) (nfix y)))
          (not (equal (index-permute-shrink n count mask x numvars)
                      (index-permute-shrink n count2 mask y numvars)))))

    Theorem: index-permute-shrink-redef

    (defthm
     index-permute-shrink-redef
     (b*
      ((?perm-index (index-permute-shrink n count mask x numvars)))
      (implies
       (<= (nfix n) (nfix numvars))
       (equal
        perm-index
        (cond
          ((< (nfix x)
              (logcount (loghead n (nfix mask))))
           (nfix x))
          ((< (nfix x) (nfix n))
           (+ (nfix x)
              (- (logcount (loghead numvars (nfix mask)))
                 (logcount (loghead n (nfix mask))))))
          ((and (< (nfix x) (nfix numvars))
                (logbitp x (nfix mask)))
           (logcount (loghead x (nfix mask))))
          (t (+ (nfix x)
                (- (logcount (loghead x (loghead numvars (nfix mask)))))
                (logcount (loghead numvars (nfix mask))))))))))

    Theorem: index-permute-shrink-redef-base

    (defthm
         index-permute-shrink-redef-base
         (equal (index-permute-shrink 0 count mask x numvars)
                (b* ((x (nfix x))
                     (numvars (nfix numvars))
                     (mask (nfix mask)))
                    (cond ((and (< x numvars) (logbitp x mask))
                           (logcount (loghead x mask)))
                          ((<= numvars x) x)
                          (t (+ (logcount (loghead x (lognot mask)))
                                (logcount (loghead numvars mask))))))))

    Theorem: index-permute-shrink-of-nfix-n

    (defthm index-permute-shrink-of-nfix-n
            (equal (index-permute-shrink (nfix n)
                                         count mask x numvars)
                   (index-permute-shrink n count mask x numvars)))

    Theorem: index-permute-shrink-nat-equiv-congruence-on-n

    (defthm
       index-permute-shrink-nat-equiv-congruence-on-n
       (implies
            (nat-equiv n n-equiv)
            (equal (index-permute-shrink n count mask x numvars)
                   (index-permute-shrink n-equiv count mask x numvars)))
       :rule-classes :congruence)

    Theorem: index-permute-shrink-of-nfix-mask

    (defthm index-permute-shrink-of-nfix-mask
            (equal (index-permute-shrink n count (nfix mask)
                                         x numvars)
                   (index-permute-shrink n count mask x numvars)))

    Theorem: index-permute-shrink-nat-equiv-congruence-on-mask

    (defthm
       index-permute-shrink-nat-equiv-congruence-on-mask
       (implies
            (nat-equiv mask mask-equiv)
            (equal (index-permute-shrink n count mask x numvars)
                   (index-permute-shrink n count mask-equiv x numvars)))
       :rule-classes :congruence)

    Theorem: index-permute-shrink-of-nfix-x

    (defthm index-permute-shrink-of-nfix-x
            (equal (index-permute-shrink n count mask (nfix x)
                                         numvars)
                   (index-permute-shrink n count mask x numvars)))

    Theorem: index-permute-shrink-nat-equiv-congruence-on-x

    (defthm
       index-permute-shrink-nat-equiv-congruence-on-x
       (implies
            (nat-equiv x x-equiv)
            (equal (index-permute-shrink n count mask x numvars)
                   (index-permute-shrink n count mask x-equiv numvars)))
       :rule-classes :congruence)

    Theorem: index-permute-shrink-of-nfix-numvars

    (defthm index-permute-shrink-of-nfix-numvars
            (equal (index-permute-shrink n count mask x (nfix numvars))
                   (index-permute-shrink n count mask x numvars)))

    Theorem: index-permute-shrink-nat-equiv-congruence-on-numvars

    (defthm
       index-permute-shrink-nat-equiv-congruence-on-numvars
       (implies
            (nat-equiv numvars numvars-equiv)
            (equal (index-permute-shrink n count mask x numvars)
                   (index-permute-shrink n count mask x numvars-equiv)))
       :rule-classes :congruence)