summaryrefslogtreecommitdiff
path: root/books/workshops/2009/cowles-gamboa-triangle-square/materials/log2.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'books/workshops/2009/cowles-gamboa-triangle-square/materials/log2.lisp')
-rw-r--r--books/workshops/2009/cowles-gamboa-triangle-square/materials/log2.lisp260
1 files changed, 260 insertions, 0 deletions
diff --git a/books/workshops/2009/cowles-gamboa-triangle-square/materials/log2.lisp b/books/workshops/2009/cowles-gamboa-triangle-square/materials/log2.lisp
new file mode 100644
index 0000000..d482a77
--- /dev/null
+++ b/books/workshops/2009/cowles-gamboa-triangle-square/materials/log2.lisp
@@ -0,0 +1,260 @@
+#| To certify:
+(certify-book "log2")
+|#
+
+(in-package "ACL2")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Make temporary use of an ACL2 Arithmetic Book to help certify this book,
+
+(local (include-book "arithmetic-3/top" :dir :system))
+
+
+(defun
+ flog2 (n)
+ ;; Return floor of log,
+ ;; base 2, of n.
+ (if (zp n)
+ 0
+ (if (evenp n)
+ (+ 1 (flog2 (/ n 2)))
+ (flog2 (- n 1)))))
+
+(defthm
+ flog2-is-correct
+ (implies (posp n)
+ (and (<= (expt 2 (flog2 n))
+ n)
+ (< n
+ (expt 2 (+ 1 (flog2 n)))))))
+
+(defun
+ clog2 (n)
+ ;; Return ceiling of log,
+ ;; base 2, of n.
+ (if (zp n)
+ -1
+ (if (= n 1)
+ 0
+ (if (evenp n)
+ (+ 1
+ (clog2 (/ n 2)))
+ (+ 1
+ (clog2 (/ (+ 1 n) 2)))))))
+
+(defthm
+ natp-clog2
+ (implies (and (integerp n)
+ (> n 0))
+ (>= (clog2 n)
+ 0))
+ :rule-classes :type-prescription)
+
+(defthm
+ posp-1/2+1/2*n
+ (implies (and (integerp n)
+ (not (integerp (* 1/2 n)))
+ (> n 1))
+ (and (integerp (+ 1/2 (* 1/2 N)))
+ (> (+ 1/2 (* 1/2 N)) 0)))
+ :rule-classes :type-prescription)
+
+(defthm
+ posp-clog2
+ (implies (and (integerp n)
+ (> n 1))
+ (> (clog2 n)
+ 0))
+ :rule-classes :type-prescription)
+
+(defthm
+ clog2-lemma-a
+ (implies (and (not (equal n 1))
+ (not (integerp (* 1/2 n)))
+ (< (expt 2 (+ -1 (clog2 (+ 1/2 (* 1/2 n)))))
+ (+ 1/2 (* 1/2 n)))
+ (integerp n)
+ (< 0 n))
+ (< (expt 2 (clog2 (+ 1/2 (* 1/2 n))))
+ (+ 1 n)))
+ :hints (("goal"
+ :use (:instance
+ (:theorem
+ (implies (< x y)
+ (< (* 2 x)(* 2 y))))
+ (x (expt 2 (+ -1 (clog2 (+ 1/2 (* 1/2 n))))))
+ (y (+ 1/2 (* 1/2 n)))))))
+
+(defthm
+ clog2-lemma-b
+ (implies (and (not (equal n 1))
+ (not (integerp (* 1/2 n)))
+ (< (expt 2 (+ -1 (clog2 (+ 1/2 (* 1/2 n)))))
+ (+ 1/2 (* 1/2 n)))
+ (integerp n)
+ (< 0 n))
+ (< (expt 2 (clog2 (+ 1/2 (* 1/2 n))))
+ n))
+ :hints (("goal"
+ :use (:instance
+ (:theorem
+ (implies (and (integerp i)
+ (integerp j)
+ (evenp i)
+ (oddp j)
+ (< i (+ 1 j)))
+ (< i j)))
+ (i (expt 2 (clog2 (+ 1/2 (* 1/2 n)))))
+ (j n)))))
+
+(defthm
+ clog2-is-correct-lower
+ (implies (posp n)
+ (< (expt 2 (+ -1 (clog2 n)))
+ n))
+ :hints (("Subgoal *1/5"
+ :use (:instance
+ (:theorem
+ (implies (< x y)
+ (< (* 2 x)(* 2 y))))
+ (x (expt 2 (+ -1 (clog2 (* n 1/2)))))
+ (y (* 1/2 n))))))
+
+(defthm
+ clog2-is-correct-upper
+ (implies (natp n)
+ (<= n
+ (expt 2 (clog2 n))))
+ :hints (("Subgoal *1/8"
+ :use (:instance
+ (:theorem
+ (implies (<= x y)
+ (<= (* 2 x)(* 2 y))))
+ (x (+ 1/2 (* 1/2 N)))
+ (y (expt 2 (clog2 (+ 1/2 (* 1/2 n)))))))
+ ("Subgoal *1/5"
+ :use (:instance
+ (:theorem
+ (implies (<= x y)
+ (<= (* 2 x)(* 2 y))))
+ (x (* 1/2 N))
+ (y (expt 2 (clog2 (* 1/2 n))))))))
+
+(defthm
+ clog2-is-correct
+ (implies (posp n)
+ (and (< (expt 2 (+ -1 (clog2 n)))
+ n)
+ (<= n
+ (expt 2 (clog2 n))))))
+
+(in-theory (disable clog2-is-correct))
+
+(defun
+ nbr-calls-clog2 (n)
+ (if (zp n)
+ 1
+ (if (= n 1)
+ 1
+ (if (evenp n)
+ (+ 1
+ (nbr-calls-clog2 (/ n 2)))
+ (+ 1
+ (nbr-calls-clog2 (/ (+ 1 n) 2)))))))
+
+;; ceiling
+;; lg2
+;; (nbr-calls-clog2 0) = 1
+;; (nbr-calls-clog2 1) = 1 0
+;; (nbr-calls-clog2 2) = 2 1
+;; (nbr-calls-clog2 3) = 3 2
+;; (nbr-calls-clog2 4) = 3 2
+;; (nbr-calls-clog2 5) = 4 3
+;; (nbr-calls-clog2 6) = 4 3
+;; (nbr-calls-clog2 7) = 4 3
+;; (nbr-calls-clog2 8) = 4 3
+;; (nbr-calls-clog2 9) = 5 4
+;; (nbr-calls-clog2 10) = 5 4
+;; (nbr-calls-clog2 11) = 5 4
+;; (nbr-calls-clog2 12) = 5 4
+;; (nbr-calls-clog2 13) = 5 4
+;; (nbr-calls-clog2 14) = 5 4
+;; (nbr-calls-clog2 15) = 5 4
+;; (nbr-calls-clog2 16) = 5 4
+;; (nbr-calls-clog2 17) = 6 5
+
+(defthm
+ nbr-calls-clog2=1+clog2
+ (implies (posp n)
+ (equal (nbr-calls-clog2 n)
+ (+ 1 (clog2 n)))))
+
+(defun
+ nbr-calls-flog2 (n)
+ (if (zp n)
+ 1
+ (if (evenp n)
+ (+ 1 (nbr-calls-flog2 (/ n 2)))
+ (+ 1 (nbr-calls-flog2 (- n 1))))))
+
+;; floor ceiling
+;; lg2 lg2
+;; (nbr-calls-flog2 0) = 1
+;; (nbr-calls-flog2 1) = 2 0 0
+;; (nbr-calls-flog2 2) = 3 1 1
+;; (nbr-calls-flog2 3) = 4 1 2
+;; (nbr-calls-flog2 4) = 4 2 2
+;; (nbr-calls-flog2 5) = 5 2 3
+;; (nbr-calls-flog2 6) = 5 2 3
+;; (nbr-calls-flog2 7) = 6 2 3
+;; (nbr-calls-flog2 8) = 5 3 3
+;; (nbr-calls-flog2 9) = 6 3 4
+;; (nbr-calls-flog2 10) = 6 3 4
+;; (nbr-calls-flog2 11) = 7 3 4
+;; (nbr-calls-flog2 12) = 6 3 4
+;; (nbr-calls-flog2 13) = 7 3 4
+;; (nbr-calls-flog2 14) = 7 3 4
+;; (nbr-calls-flog2 15) = 8 3 4
+;; (nbr-calls-flog2 16) = 6 4 4
+
+;; (nbr-calls-flog2 31) = 10 4 5
+;; (nbr-calls-flog2 32) = 7 5 5
+;; (nbr-calls-flog2 33) = 8 5 6
+
+;; conjecture:
+;; For n >= 3
+;; 2 + (floorlg2 n) <= (nbr-calls-flog2 n) <= 2 * (ceilinglg2 n)
+;; This conjecture seems difficult for ACL2 to verify.
+
+;; Modify the above conjecture.
+;; conjecture:
+;; For n >= 1
+;; 2 + (floorlg2 n) <= (nbr-calls-flog2 n) <= 2 + 2 * (floorlg2 n)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defthm
+ nbr-calls-flog2-lower-bound
+ (implies (posp n)
+ (<= (+ 2 (flog2 n))
+ (nbr-calls-flog2 n))))
+
+(defthm
+ nbr-calls-flog2-upper-bound
+ (and (implies (and (posp n)
+ (evenp n))
+ (<= (nbr-calls-flog2 n)
+ (+ 1 (* 2 (flog2 n)))))
+ (implies (and (posp n)
+ (oddp n))
+ (<= (nbr-calls-flog2 n)
+ (+ 2 (* 2 (flog2 n)))))))
+
+(defthm
+ nbr-calls-flog2-is-logarithmic
+ (implies (posp n)
+ (and (<= (+ 2 (flog2 n))
+ (nbr-calls-flog2 n))
+ (<= (nbr-calls-flog2 n)
+ (+ 2 (* 2 (flog2 n))))))
+ :hints (("Goal"
+ :use nbr-calls-flog2-upper-bound))) \ No newline at end of file