Filtering...

hl-addr-combine

books/system/hl-addr-combine

Included Books

top
other
(in-package "ACL2")
local
(local (include-book "arithmetic-5/top" :dir :system))
local
(local (encapsulate nil
    (local (defthm logior-floor-expt-2-n-opposite
        (implies (and (integerp x) (integerp y) (integerp n) (<= 0 n))
          (equal (floor (logior x y) (expt 2 n))
            (logior (floor x (expt 2 n)) (floor y (expt 2 n)))))))
    (local (defthm mod-logior-expt-2-n-opposite
        (implies (and (integerp x) (integerp y) (integerp n))
          (equal (mod (logior x y) (expt 2 n))
            (logior (mod x (expt 2 n)) (mod y (expt 2 n)))))))
    (local (in-theory (disable logior-floor-expt-2-n mod-logior-expt-2-n)))
    (defthm |(logior a (* b (expt 2 n)))|
      (implies (and (natp a) (integerp b) (natp n) (< a (expt 2 n)))
        (equal (logior a (* b (expt 2 n))) (+ a (* b (expt 2 n)))))
      :hints (("Goal" :in-theory (disable floor-mod-elim)
         :use ((:instance floor-mod-elim
            (x (logior a (* b (expt 2 n))))
            (y (expt 2 n)))))))
    (defthm |(logior a (* (expt 2 n) b))|
      (implies (and (natp a) (integerp b) (natp n) (< a (expt 2 n)))
        (equal (logior a (* (expt 2 n) b)) (+ a (* (expt 2 n) b)))))))
local
(local (encapsulate nil
    (local (defthm lemma1
        (implies (and (< a (expt 2 n))
            (< b (expt 2 n))
            (natp a)
            (natp b)
            (natp n))
          (equal (mod (+ b (* (expt 2 n) a)) (expt 2 n))
            (mod b (expt 2 n))))))
    (local (defthm lemma2
        (implies (and (< a (expt 2 n))
            (< b (expt 2 n))
            (natp a)
            (natp b)
            (natp n))
          (equal (floor (+ b (* (expt 2 n) a)) (expt 2 n)) a))))
    (local (defthm equal-by-floor-and-mod
        (implies (and (natp a) (natp b) (natp n))
          (equal (equal a b)
            (and (equal (floor a n) (floor b n))
              (equal (mod a n) (mod b n)))))
        :rule-classes nil))
    (defthm |a*2^n + b == c*2^n + d when <= 2^n|
      (implies (and (< a (expt 2 n))
          (< b (expt 2 n))
          (< c (expt 2 n))
          (< d (expt 2 n))
          (natp a)
          (natp b)
          (natp c)
          (natp d)
          (natp n))
        (equal (equal (+ b (* (expt 2 n) a)) (+ d (* (expt 2 n) c)))
          (and (equal a c) (equal b d))))
      :hints (("Goal" :use ((:instance equal-by-floor-and-mod
            (a (+ b (* (expt 2 n) a)))
            (b (+ d (* (expt 2 n) c)))
            (n (expt 2 n)))))))))
hl-nat-combinefunction
(defund hl-nat-combine
  (a b)
  (declare (xargs :guard (and (natp a) (natp b))))
  (mbe :logic (+ (/ (* (+ a b 1) (+ a b)) 2) b)
    :exec (+ (let* ((a+b (+ a b)) (a+b+1 (+ 1 a+b)))
        (if (= (logand a+b 1) 0)
          (* (ash a+b -1) a+b+1)
          (* a+b (ash a+b+1 -1))))
      b)))
natp-of-hl-nat-combineencapsulate
(encapsulate nil
  (local (in-theory (enable hl-nat-combine)))
  (local (defun sum-up-to
      (n)
      (declare (xargs :guard (natp n)))
      (if (zp n)
        0
        (+ n (sum-up-to (1- n))))))
  (local (defthm sum-up-to-identity
      (implies (natp n) (equal (/ (* n (+ 1 n)) 2) (sum-up-to n)))))
  (local (defthm hl-nat-combine-redefinition
      (implies (and (natp a) (natp b))
        (equal (hl-nat-combine a b) (+ (sum-up-to (+ a b)) b)))
      :hints (("Goal" :use ((:instance sum-up-to-identity (n (+ a b))))))))
  (defthm natp-of-hl-nat-combine
    (implies (and (natp a) (natp b))
      (natp (hl-nat-combine a b))))
  (local (defun sum-interval
      (a b)
      (declare (xargs :guard (and (natp a) (natp b))
          :measure (nfix (- (nfix b) (nfix a)))))
      (let ((a (nfix a)) (b (nfix b)))
        (if (<= b a)
          0
          (+ b (sum-interval a (- b 1)))))))
  (local (defthmd decompose-sum-up-to
      (implies (and (natp a) (natp b) (< a b))
        (equal (sum-up-to b) (+ (sum-up-to a) (sum-interval a b))))))
  (local (defthm decompose-rhs
      (implies (and (natp a)
          (natp b)
          (natp c)
          (natp d)
          (< (+ a b) (+ c d)))
        (equal (hl-nat-combine c d)
          (+ (sum-up-to (+ a b)) (sum-interval (+ a b) (+ c d)) d)))
      :hints (("Goal" :use ((:instance decompose-sum-up-to (b (+ c d)) (a (+ a b))))))))
  (local (defthm sum-interval-lower-bound
      (implies (and (natp a) (natp b) (< a b))
        (< a (sum-interval a b)))
      :rule-classes :linear))
  (defthm hl-nat-combine-is-one-to-one
    (implies (and (natp a) (natp b) (natp c) (natp d))
      (equal (equal (hl-nat-combine a b) (hl-nat-combine c d))
        (and (equal a c) (equal b d))))
    :hints (("Goal" :cases ((equal (+ a b) (+ c d)) (< (+ a b) (+ c d))
         (< (+ c d) (+ a b))))))
  (defthm hl-nat-combine-monotonic-a
    (implies (and (natp a) (natp a2) (natp b) (< a a2))
      (< (hl-nat-combine a b) (hl-nat-combine a2 b)))
    :rule-classes :linear)
  (defthm hl-nat-combine-monotonic-b
    (implies (and (natp a) (natp b) (natp b2) (< b b2))
      (< (hl-nat-combine a b) (hl-nat-combine a b2)))
    :rule-classes :linear))
local
(local (defthm guard-lemma
    (implies (and (< b 1073741824) (natp b) (integerp a))
      (equal (logior b (* 1073741824 a)) (+ b (* 1073741824 a))))
    :hints (("Goal" :in-theory (disable |(logior a (* (expt 2 n) b))|)
       :use ((:instance |(logior a (* (expt 2 n) b))| (n 30) (a b) (b a)))))))
hl-addr-combinefunction
(defund hl-addr-combine
  (a b)
  (declare (xargs :guard (and (natp a) (natp b))))
  (mbe :logic (if (and (< a (expt 2 30)) (< b (expt 2 30)))
      (- (+ (* a (expt 2 30)) b))
      (- (hl-nat-combine a b) (+ (expt 2 59) (expt 2 29) -1)))
    :exec (if (and (< a 1073741824) (< b 1073741824))
      (the (signed-byte 61)
        (- (the (signed-byte 61)
            (logior (the (signed-byte 61) (ash (the (signed-byte 31) a) 30))
              (the (signed-byte 31) b)))))
      (- (hl-nat-combine a b) 576460752840294399))))
hl-addr-combine-is-one-to-oneencapsulate
(encapsulate nil
  (local (in-theory (enable hl-addr-combine)))
  (local (defthm small-case-non-positive
      (implies (and (< a (expt 2 30)) (< b (expt 2 30)) (natp a) (natp b))
        (<= (hl-addr-combine a b) 0))))
  (local (encapsulate nil
      (local (defthmd monotonicity-corollary-1
          (implies (and (natp a) (natp b) (<= (expt 2 30) a))
            (<= 576460752840294400 (hl-nat-combine a b)))
          :hints (("Goal" :in-theory (disable hl-nat-combine-monotonic-a
               hl-nat-combine-monotonic-b)
             :use ((:instance hl-nat-combine-monotonic-b (a a) (b 0) (b2 b)) (:instance hl-nat-combine-monotonic-a
                 (a (expt 2 30))
                 (a2 a)
                 (b 0)))))))
      (local (defthmd monotonicity-corollary-2
          (implies (and (natp a) (natp b) (<= (expt 2 30) b))
            (<= 576460753914036224 (hl-nat-combine a b)))
          :hints (("Goal" :in-theory (disable hl-nat-combine-monotonic-a
               hl-nat-combine-monotonic-b)
             :use ((:instance hl-nat-combine-monotonic-b
                (a 0)
                (b (expt 2 30))
                (b2 b)) (:instance hl-nat-combine-monotonic-a (a 0) (a2 a) (b b)))))))
      (defthm large-case-positive
        (implies (and (or (not (< a (expt 2 30))) (not (< b (expt 2 30))))
            (natp a)
            (natp b))
          (< 0 (hl-addr-combine a b)))
        :hints (("Goal" :use ((:instance monotonicity-corollary-1) (:instance monotonicity-corollary-2)))))))
  (local (defthm small-case-one-to-one
      (implies (and (< a (expt 2 30))
          (< b (expt 2 30))
          (< c (expt 2 30))
          (< d (expt 2 30))
          (natp a)
          (natp b)
          (natp c)
          (natp d))
        (equal (equal (hl-addr-combine a b) (hl-addr-combine c d))
          (and (equal a c) (equal b d))))
      :hints (("Goal" :in-theory (disable (expt))))))
  (local (defthm large-case-one-to-one
      (implies (and (or (<= (expt 2 30) a) (<= (expt 2 30) b))
          (or (<= (expt 2 30) c) (<= (expt 2 30) d))
          (natp a)
          (natp b)
          (natp c)
          (natp d))
        (equal (equal (hl-addr-combine a b) (hl-addr-combine c d))
          (and (equal a c) (equal b d))))))
  (local (in-theory (disable hl-addr-combine)))
  (defthm hl-addr-combine-is-one-to-one
    (implies (and (natp a) (natp b) (natp c) (natp d))
      (equal (equal (hl-addr-combine a b) (hl-addr-combine c d))
        (and (equal a c) (equal b d))))
    :hints (("Goal" :cases ((and (< a (expt 2 30))
          (< b (expt 2 30))
          (< c (expt 2 30))
          (< d (expt 2 30))) (and (or (<= (expt 2 30) a) (<= (expt 2 30) b))
           (or (<= (expt 2 30) c) (<= (expt 2 30) d))))) ("Subgoal 3" :in-theory (disable small-case-non-positive large-case-positive)
        :use ((:instance small-case-non-positive (a a) (b b)) (:instance small-case-non-positive (a c) (b d))
          (:instance large-case-positive (a a) (b b))
          (:instance large-case-positive (a c) (b d)))))))