Filtering...

ash-bounds

books/centaur/bitops/ash-bounds
other
(in-package "BITOPS")
other
(include-book "xdoc/top" :dir :system)
other
(include-book "ihs/basic-definitions" :dir :system)
other
(include-book "std/basic/arith-equivs" :dir :system)
other
(local (include-book "arithmetic/top-with-meta" :dir :system))
other
(local (include-book "centaur/bitops/ihsext-basics" :dir :system))
other
(local (include-book "ihs/quotient-remainder-lemmas" :dir :system))
other
(defsection bitops/ash-bounds
  :parents (bitops)
  :short "A book with some basic bounding and monotonicity lemmas for @(see
ash) and @(see logtail)."
  :long "<p>This is a fast-loading book that can be used separately from the
rest of Bitops.</p>")
other
(defsection self-bounds-for-logtail
  :parents (bitops/ash-bounds logtail)
  :short "Lemmas for the bounds of @('(logtail n a)') versus @('a')."
  :long "<p>These are lemmas for:</p>
<ul>
<li>@('  (< (logtail n a) a)  ')</li>
<li>@('  (= a (logtail n a))  ')</li>
<li>@('  (< a (logtail n a))  ')</li>
</ul>"
  (local (defthm c0
      (implies (zp n)
        (equal (logtail n a)
          (ifix a)))))
  (local (defthm c1
      (implies (zip a)
        (equal (logtail n a) 0))))
  (local (defthm c2
      (equal (logtail n -1) -1)))
  (local (defthm l0
      (implies (and (posp a) (posp n))
        (< (logtail n a) a))
      :hints (("Goal" :in-theory (enable logtail**
           logtail-induct
           logcdr)))))
  (local (defthm l1
      (implies (and (integerp a) (< a 0))
        (equal (< a (logtail n a))
          (and (posp n) (not (equal a -1)))))
      :hints (("Goal" :in-theory (enable logtail**
           logtail-induct
           logcdr)))))
  (local (defthm l2
      (implies (and (integerp a) (< a 0))
        (equal (< (logtail n a) a)
          nil))
      :hints (("Goal" :in-theory (disable l1)
         :use ((:instance l1))))))
  (defthm |(< (logtail n a) a)|
    (equal (< (logtail n a) a)
      (if (zip a)
        (< 0 a)
        (and (posp a) (posp n))))
    :rule-classes ((:rewrite) (:linear :corollary (implies (and (posp a) (posp n))
          (< (logtail n a) a)))))
  (local (defthm j1
      (implies (and (posp a) (posp n))
        (equal (equal (logtail n a) a)
          nil))))
  (local (defthm j2
      (implies (posp a)
        (equal (equal (logtail n a) a)
          (zp n)))))
  (local (defthm j3
      (equal (equal (logtail n -1) -1) t)))
  (local (defthm j4
      (implies (and (integerp a) (< a -1))
        (equal (equal (logtail n a) a)
          (zp n)))
      :hints (("Goal" :in-theory (disable l1)
         :use ((:instance l1))))))
  (local (defthm j5
      (implies (and (integerp a) (< a 0))
        (equal (equal (logtail n a) a)
          (or (equal a -1) (zp n))))))
  (defthm |(= a (logtail n a))|
    (equal (= a (logtail n a))
      (if (zip a)
        (equal a 0)
        (or (zp n) (equal a -1))))
    :hints (("Goal" :use ((:instance j5)))))
  (local (defthm k1
      (implies (posp a)
        (equal (< a (logtail n a))
          nil))
      :hints (("Goal" :in-theory (disable |(< (logtail n a) a)|)
         :use ((:instance |(< (logtail n a) a)|))))))
  (local (defthm k2
      (implies (zip a)
        (equal (< a (logtail n a))
          (< a 0)))))
  (local (defthm k3
      (implies (and (integerp a) (< a 0))
        (equal (< a (logtail n a))
          (and (posp n) (not (equal a -1)))))))
  (local (defthm k4
      (equal (< a (logtail n a))
        (cond ((zip a) (< a 0))
          ((posp a) nil)
          (t (and (posp n) (not (equal a -1))))))))
  (defthm |(< a (logtail n a))|
    (equal (< a (logtail n a))
      (if (zip a)
        (< a 0)
        (and (posp n) (< a -1))))
    :rule-classes ((:rewrite) (:linear :corollary (implies (and (posp n) (< a -1))
          (< a (logtail n a)))))))
other
(defsection self-bounds-for-ash
  :parents (bitops/ash-bounds ash)
  :short "Lemmas for the bounds of @('(ash a b)') versus @('a')."
  :long "<p>These are lemmas for:</p>
<ul>
<li>@('  (< (ASH A B) A)  ')</li>
<li>@('  (= A (ASH A B))  ')</li>
<li>@('  (< A (ASH A B))  ')</li>
</ul>

<p>BOZO these only address when A is positive.  We should extend these
to negative numbers.</p>"
  (local (defthm l1
      (implies (and (posp a) (posp b))
        (< a (ash a b)))
      :rule-classes :linear :hints (("Goal" :in-theory (enable ash**
           ash**-induct
           logcons)))))
  (local (defthm l2
      (implies (zip b)
        (equal (ash a b) (ifix a)))))
  (local (defthm l3
      (implies (and (posp a)
          (integerp b)
          (< b 0))
        (< (ash a b) a))
      :rule-classes :linear :hints (("Goal" :in-theory (enable ash** ash**-induct)))))
  (defthm |(< a (ash a b)) when (posp a)|
    (implies (posp a)
      (equal (< a (ash a b))
        (posp b)))
    :rule-classes ((:rewrite) (:linear :corollary (implies (and (posp a) (posp b))
          (< a (ash a b))))))
  (defthm |(= a (ash a b)) when (posp a)|
    (implies (posp a)
      (equal (equal a (ash a b))
        (zip b)))
    :hints (("Goal" :use ((:instance l3)))))
  (defthm |(< (ash a b) a) when (posp a)|
    (implies (posp a)
      (equal (< (ash a b) a)
        (negp b)))
    :rule-classes ((:rewrite) (:linear :corollary (implies (and (posp a) (negp b))
          (< (ash a b) a))))
    :hints (("Goal" :in-theory (disable |(< a (ash a b)) when (posp a)|
         |(= a (ash a b)) when (posp a)|)
       :use ((:instance |(< a (ash a b)) when (posp a)|) (:instance |(= a (ash a b)) when (posp a)|))))))
other
(defsection monotonicity-properties-of-ash
  :parents (bitops/ash-bounds ash)
  :short "Lemmas about @('(ash a b)') versus @('(ash a c)')."
  :long "<p>These are basic lemmas about:</p>

<ul>
<li>@('  (< (ASH A B) (ASH A C))  ')</li>
<li>@('  (= (ASH A B) (ASH A C))  ')</li>
</ul>

<p>BOZO these only address when A is positive and B/C are naturals.  We should
extend these to negative numbers.</p>"
  (local (defun pos-induct
      (a b c)
      (if (or (zp b) (zp c))
        (list a b c)
        (pos-induct a
          (- b 1)
          (- c 1)))))
  (defthm |(< (ash a b) (ash a c))|
    (implies (and (posp a)
        (natp b)
        (natp c))
      (equal (< (ash a b) (ash a c))
        (< b c)))
    :hints (("Goal" :induct (pos-induct a b c)
       :in-theory (enable ash** logcons))))
  (defthm |(= (ash a b) (ash a c))|
    (implies (and (posp a)
        (natp b)
        (natp c))
      (equal (equal (ash a b) (ash a c))
        (equal b c)))
    :hints (("Goal" :induct (pos-induct a b c)
       :in-theory (enable ash** logcons)))))
other
(defsection |(= 0 (ash 1 x))|
  :parents (bitops/ash-bounds ash)
  (local (defthm l0
      (implies (zip x)
        (equal (ash 1 x) 1))))
  (local (defthm l1
      (implies (posp x)
        (< 1 (ash 1 x)))))
  (local (defthm l2
      (implies (and (integerp x) (< x 0))
        (equal (ash 1 x) 0))))
  (defthm |(= 0 (ash 1 x))|
    (equal (equal 0 (ash 1 x)) (negp x))
    :hints (("Goal" :in-theory (enable negp)))))