• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Std
      • Std/lists
      • Std/alists
      • Obags
      • Std/util
      • Std/strings
      • Std/osets
      • Std/io
      • Std/basic
      • Std/system
      • Std/typed-lists
      • Std/bitsets
      • Std/testing
      • Std/typed-alists
      • Std/stobjs
        • Stobj-updater-independence
        • Def-1d-arr
        • Defstobj-clone
        • Def-2d-arr
        • Defabsstobj-events
        • Bitarr
          • Bits-equiv
            • Set-bit
            • Resize-bits
            • Get-bit
            • Bits-length
          • Natarr
      • Proof-automation
      • Macro-libraries
      • ACL2
      • Interfacing-tools
      • Hardware-verification
      • Software-verification
      • Math
      • Testing-utilities
    • Bitarr

    Bits-equiv

    Bit-for-bit list equivalence: bits-equiv recognizes lists whose nth elements are bit-equiv to one another. It is often useful for reasoning about bit arrays like bitarr.

    This is a universal equivalence, introduced using def-universal-equiv.

    Function: bits-equiv

    (defun bits-equiv (x y)
      (declare (xargs :non-executable t))
      (declare (xargs :guard t))
      (prog2$ (throw-nonexec-error 'bits-equiv
                                   (list x y))
              (let ((i (bits-equiv-witness x y)))
                (and (bit-equiv (nth i x) (nth i y))))))

    Definitions and Theorems

    Theorem: bits-equiv-necc

    (defthm bits-equiv-necc
      (implies (not (and (bit-equiv (nth i x) (nth i y))))
               (not (bits-equiv x y))))

    Theorem: bits-equiv-is-an-equivalence

    (defthm bits-equiv-is-an-equivalence
      (and (booleanp (bits-equiv x y))
           (bits-equiv x x)
           (implies (bits-equiv x y)
                    (bits-equiv y x))
           (implies (and (bits-equiv x y) (bits-equiv y z))
                    (bits-equiv x z)))
      :rule-classes (:equivalence))

    Theorem: bits-equiv-implies-bit-equiv-nth-2

    (defthm bits-equiv-implies-bit-equiv-nth-2
      (implies (bits-equiv x x-equiv)
               (bit-equiv (nth i x) (nth i x-equiv)))
      :rule-classes (:congruence))

    Theorem: bits-equiv-implies-bits-equiv-update-nth-3

    (defthm bits-equiv-implies-bits-equiv-update-nth-3
      (implies (bits-equiv x x-equiv)
               (bits-equiv (update-nth i v x)
                           (update-nth i v x-equiv)))
      :rule-classes (:congruence))

    Theorem: bit-equiv-implies-bits-equiv-update-nth-2

    (defthm bit-equiv-implies-bits-equiv-update-nth-2
      (implies (bit-equiv v v-equiv)
               (bits-equiv (update-nth i v x)
                           (update-nth i v-equiv x)))
      :rule-classes (:congruence))

    Theorem: bits-equiv-implies-bits-equiv-cdr-1

    (defthm bits-equiv-implies-bits-equiv-cdr-1
      (implies (bits-equiv a a-equiv)
               (bits-equiv (cdr a) (cdr a-equiv)))
      :rule-classes (:congruence))

    Theorem: bits-equiv-implies-bit-equiv-car-1

    (defthm bits-equiv-implies-bit-equiv-car-1
      (implies (bits-equiv x x-equiv)
               (bit-equiv (car x) (car x-equiv)))
      :rule-classes (:congruence))

    Theorem: bit-equiv-implies-bits-equiv-cons-1

    (defthm bit-equiv-implies-bits-equiv-cons-1
      (implies (bit-equiv a a-equiv)
               (bits-equiv (cons a b)
                           (cons a-equiv b)))
      :rule-classes (:congruence))

    Theorem: bits-equiv-implies-bits-equiv-cons-2

    (defthm bits-equiv-implies-bits-equiv-cons-2
      (implies (bits-equiv b b-equiv)
               (bits-equiv (cons a b)
                           (cons a b-equiv)))
      :rule-classes (:congruence))