Included Books
other
(in-package "ACL2")
include-book
(include-book "../basic-ops/building-blocks")
local
(local (include-book "../basic-ops/top"))
local
(local (include-book "more-floor-mod"))
local
(local (include-book "floor-mod"))
local
(local (include-book "floor-mod-basic"))
local
(local (include-book "truncate-rem"))
local
(local (include-book "logand-helper"))
local
(local (set-default-hints '((nonlinearp-default-hint++ id stable-under-simplificationp hist nil))))
local
(local (in-theory (e/d (ash-to-floor) (ash))))
local
(local (in-theory (disable not-integerp-type-set-rules expt-type-prescription-nonpositive-base-odd-exponent expt-type-prescription-nonpositive-base-even-exponent expt-type-prescription-negative-base-odd-exponent expt-type-prescription-negative-base-even-exponent expt-type-prescription-integerp-base expt-type-prescription-positive-base expt-type-prescription-integerp-base-b expt-type-prescription-integerp-base-a default-plus-1 default-plus-2 default-times-1 default-times-2 default-floor-ratio default-divide default-minus cancel-floor-+ |(floor (+ x r) i)| mod-positive mod-negative mod-nonpositive floor-nonnegative floor-negative floor-positive floor-nonpositive rationalp-x integerp-/-expt-2 the-floor-below |(equal c (- x))| (:rewrite floor-x-y-=-1 . 2) (:rewrite mod-x-y-=-x+y . 1) default-less-than-1 default-expt-1 default-expt-2 default-floor-1 default-floor-2 default-mod-2 mod-bounds-2 floor-zero mod-zero mod-x-y-=-x mod-x-y-=-x-y)))
|(logand y x)|theorem
(defthm |(logand y x)| (equal (logand y x) (logand x y)))
|(logand (logand x y) z)|theorem
(defthm |(logand (logand x y) z)| (equal (logand (logand x y) z) (logand x y z)))
|(logand y x z)|theorem
(defthm |(logand y x z)| (equal (logand y x z) (logand x y z)) :hints (("Goal" :use (:instance logand-y-x-z))))
|(logand c d x)|theorem
(defthm |(logand c d x)| (implies (and (syntaxp (quotep c)) (syntaxp (quotep d))) (equal (logand c d x) (logand (logand c d) x))))
logand-0-xtheorem
(defthm logand-0-x (equal (logand 0 x) 0))
|(logand 1 x)|theorem
(defthm |(logand 1 x)| (implies (integerp x) (equal (logand 1 x) (if (evenp x) 0 1))) :hints (("Goal" :expand ((logand 1 x) (logand 0 (floor x 2))))))
logand--1-xtheorem
(defthm logand--1-x (implies (integerp x) (equal (logand -1 x) x)))
logand-x-xtheorem
(defthm logand-x-x (implies (integerp x) (equal (logand x x) x)))
logand-bounds-postheorem
(defthm logand-bounds-pos (implies (and (integerp x) (integerp y) (<= 0 x)) (<= (logand x y) x)) :hints (("Goal" :in-theory (enable logand))) :rule-classes ((:rewrite) (:linear) (:rewrite :corollary (implies (and (integerp x) (integerp y) (<= 0 y)) (<= (logand x y) y))) (:linear :corollary (implies (and (integerp x) (integerp y) (<= 0 y)) (<= (logand x y) y)))))
logand-bounds-negtheorem
(defthm logand-bounds-neg (implies (and (integerp x) (integerp y) (< x 0) (< y 0)) (<= (logand x y) x)) :hints (("Goal" :in-theory (enable logand))) :rule-classes ((:rewrite) (:linear) (:rewrite :corollary (implies (and (integerp x) (integerp y) (< x 0) (< y 0)) (<= (logand x y) y))) (:linear :corollary (implies (and (integerp x) (integerp y) (< x 0) (< y 0)) (<= (logand x y) y)))))
|(equal (logand x y) -1)|theorem
(defthm |(equal (logand x y) -1)| (equal (equal (logand x y) -1) (and (equal x -1) (equal y -1))))
|(< (logand x y) 0)|theorem
(defthm |(< (logand x y) 0)| (equal (< (logand x y) 0) (and (integerp x) (< x 0) (integerp y) (< y 0))) :rule-classes ((:rewrite) (:type-prescription :corollary (implies (and (integerp x) (< x 0) (integerp y) (< y 0)) (and (integerp (logand x y)) (< (logand x y) 0)))) (:type-prescription :corollary (implies (and (integerp x) (integerp y) (<= 0 y)) (and (integerp (logand x y)) (<= 0 (logand x y))))) (:type-prescription :corollary (implies (and (integerp x) (<= 0 x) (integerp y)) (and (integerp (logand x y)) (<= 0 (logand x y)))))))
|(logand (* 2 x) (* 2 y))|theorem
(defthm |(logand (* 2 x) (* 2 y))| (implies (and (real/rationalp x) (real/rationalp y) (integerp (* 2 x)) (integerp (* 2 y))) (equal (logand (* 2 x) (* 2 y)) (cond ((and (integerp x) (integerp y)) (* 2 (logand x y))) ((and (integerp x) (not (integerp y))) (* 2 (logand x (+ -1/2 y)))) ((and (not (integerp x)) (integerp y)) (* 2 (logand (+ -1/2 x) y))) (t (+ 1 (* 2 (logand (+ -1/2 x) (+ -1/2 y)))))))) :rule-classes ((:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (real/rationalp x) (real/rationalp y) (integerp (* 2 x)) (integerp (* 2 y))) (equal (logand (* 2 x) (* 2 y)) (cond ((and (integerp x) (integerp y)) (* 2 (logand x y))) ((and (integerp x) (not (integerp y))) (* 2 (logand x (+ -1/2 y)))) ((and (not (integerp x)) (integerp y)) (* 2 (logand (+ -1/2 x) y))) (t (+ 1 (* 2 (logand (+ -1/2 x) (+ -1/2 y))))))))) (:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp (* 2 x)) (integerp (* 2 y)) (integerp x) (integerp y)) (equal (logand (* 2 x) (* 2 y)) (* 2 (logand x y))))) (:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp (* 2 x)) (integerp (* 2 y)) (real/rationalp x) (not (integerp x)) (integerp y)) (equal (logand (* 2 x) (* 2 y)) (* 2 (logand (+ -1/2 x) y))))) (:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp (* 2 x)) (integerp (* 2 y)) (integerp x) (real/rationalp y) (not (integerp y))) (equal (logand (* 2 x) (* 2 y)) (* 2 (logand x (+ -1/2 y)))))) (:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp (* 2 x)) (integerp (* 2 y)) (real/rationalp x) (not (integerp x)) (real/rationalp y) (not (integerp y))) (equal (logand (* 2 x) (* 2 y)) (+ 1 (* 2 (logand (+ -1/2 x) (+ -1/2 y)))))))))
|(logand (floor x 2) (floor y 2))|theorem
(defthm |(logand (floor x 2) (floor y 2))| (implies (and (integerp x) (integerp y)) (equal (logand (floor x 2) (floor y 2)) (floor (logand x y) 2))) :rule-classes ((:rewrite :corollary (implies (and (integerp x) (integerp y)) (equal (logand (floor x 2) (floor y 2)) (floor (logand x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (integerp (* 1/2 y))) (equal (logand (floor x 2) (* 1/2 y)) (floor (logand x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (not (integerp (* 1/2 y)))) (equal (logand (floor x 2) (+ -1/2 (* 1/2 y))) (floor (logand x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (integerp (* 1/2 x))) (equal (logand (* 1/2 x) (floor y 2)) (floor (logand x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (integerp (* 1/2 x)) (integerp (* 1/2 y))) (equal (logand (* 1/2 x) (* 1/2 y)) (floor (logand x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (integerp (* 1/2 x)) (not (integerp (* 1/2 y)))) (equal (logand (* 1/2 x) (+ -1/2 (* 1/2 y))) (floor (logand x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (not (integerp (* 1/2 x)))) (equal (logand (+ -1/2 (* 1/2 x)) (floor y 2)) (floor (logand x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (not (integerp (* 1/2 x))) (integerp (* 1/2 y))) (equal (logand (+ -1/2 (* 1/2 x)) (* 1/2 y)) (floor (logand x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (not (integerp (* 1/2 x))) (not (integerp (* 1/2 y)))) (equal (logand (+ -1/2 (* 1/2 x)) (+ -1/2 (* 1/2 y))) (floor (logand x y) 2))))))
local
(local (defun ind-fn (n) (cond ((not (integerp n)) 0) ((equal n 0) 1) ((< n 0) (ind-fn (+ 1 n))) (t (ind-fn (+ -1 n))))))
logand-floor-expt-2-nencapsulate
(encapsulate nil (local (in-theory (enable expt-type-prescription-integerp-base))) (defthm logand-floor-expt-2-n (implies (and (integerp x) (integerp y) (integerp n)) (equal (logand (floor x (expt 2 n)) (floor y (expt 2 n))) (floor (logand x y) (expt 2 n)))) :hints (("Goal" :induct (ind-fn n) :do-not '(generalize eliminate-destructors)) ("Subgoal *1/3" :use ((:instance |(logand (floor x 2) (floor y 2))| (x (floor x (expt 2 (+ -1 n)))) (y (floor y (expt 2 (+ -1 n)))))) :in-theory (disable |(logand (floor x 2) (floor y 2))| logand)))))
|(mod (logand x y) 2)|theorem
(defthm |(mod (logand x y) 2)| (implies (and (integerp x) (integerp y)) (equal (mod (logand x y) 2) (if (and (not (integerp (* 1/2 x))) (not (integerp (* 1/2 y)))) 1 0))) :rule-classes ((:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp x) (integerp y)) (equal (mod (logand x y) 2) (if (and (not (integerp (* 1/2 x))) (not (integerp (* 1/2 y)))) 1 0)))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (not (integerp (* 1/2 x))) (not (integerp (* 1/2 y)))) (equal (mod (logand x y) 2) 1))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (integerp (* 1/2 x))) (equal (mod (logand x y) 2) 0))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (integerp (* 1/2 y))) (equal (mod (logand x y) 2) 0)))))
mod-logandencapsulate
(encapsulate nil (local (defun floor-2-n-ind (x y n) (cond ((zip n) (+ x y)) ((< 0 n) (floor-2-n-ind (floor x 2) (floor y 2) (+ -1 n))) (t (floor-2-n-ind (floor x 2) (floor y 2) (+ 1 n)))))) (local (defthm break-logand-apart (implies (and (integerp x) (integerp y)) (equal (logand x y) (+ (* 2 (logand (floor x 2) (floor y 2))) (logand (mod x 2) (mod y 2))))) :hints (("Subgoal 4'" :in-theory (disable logand))) :rule-classes nil)) (local (in-theory (enable expt-type-prescription-integerp-base mod-zero))) (local (defthm |(integerp (* 1/2 (mod x (expt 2 n))))| (implies (and (< 0 n) (integerp n)) (equal (integerp (* 1/2 (mod x (expt 2 n)))) (integerp (* 1/2 x)))))) (local (in-theory (disable cancel-mod-+ (:type-prescription mod-zero . 4) default-mod-ratio default-times-2 default-+-2 (:rewrite mod-x-y-=-x-y . 2) (:rewrite mod-x-y-=-x . 4)))) (defthm mod-logand (implies (and (integerp x) (integerp y) (integerp n)) (equal (logand (mod x (expt 2 n)) (mod y (expt 2 n))) (mod (logand x y) (expt 2 n)))) :hints (("Goal" :induct (floor-2-n-ind x y n) :in-theory (disable logand) :do-not '(generalize eliminate-destructors)) ("Subgoal *1/2" :use ((:instance break-logand-apart) (:instance break-logand-apart (x (mod x (expt 2 n))) (y (mod y (expt 2 n)))))))))
|(integerp (* 1/2 (logand x y)))|theorem
(defthm |(integerp (* 1/2 (logand x y)))| (implies (and (integerp x) (integerp y)) (equal (integerp (* 1/2 (logand x y))) (or (integerp (* 1/2 x)) (integerp (* 1/2 y))))) :rule-classes ((:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp x) (integerp y)) (equal (integerp (* 1/2 (logand x y))) (or (integerp (* 1/2 x)) (integerp (* 1/2 y)))))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (integerp (* 1/2 x))) (integerp (* 1/2 (logand x y))))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (integerp (* 1/2 y))) (integerp (* 1/2 (logand x y))))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (not (integerp (* 1/2 x))) (not (integerp (* 1/2 y)))) (not (integerp (* 1/2 (logand x y))))))))
local
(local (defun ind-hint (x n) (declare (xargs :measure (nfix n))) (if (or (zip x) (zp n)) t (ind-hint (floor x 2) (+ -1 n)))))
logand-masktheorem
(defthm logand-mask (implies (and (integerp x) (integerp n) (<= 0 n)) (equal (logand x (+ -1 (expt 2 n))) (mod x (expt 2 n)))) :hints (("Goal" :do-not '(generalize) :in-theory (enable mod) :cases ((equal n 0))) ("Subgoal 2" :induct (ind-hint x n))))
l-c-m-fnfunction
(defun l-c-m-fn (c) (let ((n (power-of-2-minus-1 c))) (if n (list (cons 'n (kwote n))) nil)))
logand-constant-masktheorem
(defthm logand-constant-mask (implies (and (bind-free (l-c-m-fn c) (n)) (integerp n) (<= 0 n) (equal (+ -1 (expt 2 n)) c) (integerp x)) (equal (logand c x) (mod x (+ 1 c)))))
logand-mask-shiftedencapsulate
(encapsulate nil (local (in-theory (enable expt-type-prescription-integerp-base default-expt-1 default-expt-2 mod-zero))) (local (in-theory (disable (:rewrite mod-x-y-=-x-y . 2) default-plus-1 default-plus-2 default-times-1 default-times-2 (:type-prescription mod-zero . 4) (:type-prescription floor-zero . 4) cancel-mod-+ (:rewrite mod-x-y-=-x . 3) (:rewrite mod-x-y-=-x . 4)))) (local (defthm lemma (implies (and (equal (expt 2 n1) (mod x (* (expt 2 n1) (expt 2 n2)))) (not (zp n1))) (integerp (* 1/2 x))))) (local (defthm lemma2 (implies (and (equal (+ (* 1/2 (expt 2 n1)) (logand (+ -1/2 (* 1/2 x)) (+ (* -1/2 (expt 2 n1)) (* 1/2 (expt 2 n1) (expt 2 n2))))) (* 1/2 (mod x (* (expt 2 n1) (expt 2 n2))))) (not (zp n1))) (integerp (* 1/2 x))))) (local (defthm lemma3 (implies (and (equal (+ (* 1/2 (expt 2 n1)) (logand (+ -1/2 (* 1/2 x)) (+ (* -1/2 (expt 2 n1)) (* 1/2 (expt 2 n1) (expt 2 n2))))) (+ (* 1/2 (expt 2 n1) (expt 2 n2)) (* 1/2 (mod x (* (expt 2 n1) (expt 2 n2)))))) (not (zp n1)) (integerp n2) (<= 0 n2)) (integerp (* 1/2 x))))) (defthm logand-mask-shifted (implies (and (integerp x) (integerp n1) (integerp n2) (<= 0 n1) (<= 0 n2)) (equal (logand x (* (expt 2 n1) (+ -1 (expt 2 n2)))) (* (expt 2 n1) (mod (floor x (expt 2 n1)) (expt 2 n2))))) :hints (("Goal" :do-not '(generalize) :induct (ind-hint x n1)))))
|(logior y x)|theorem
(defthm |(logior y x)| (equal (logior y x) (logior x y)))
|(logior (logior x y) z)|theorem
(defthm |(logior (logior x y) z)| (equal (logior (logior x y) z) (logior x y z)))
|(logior y x z)|theorem
(defthm |(logior y x z)| (equal (logior y x z) (logior x y z)))
|(logior c d x)|theorem
(defthm |(logior c d x)| (implies (and (syntaxp (quotep c)) (syntaxp (quotep d))) (equal (logior c d x) (logior (logior c d) x))))
logior-0-xtheorem
(defthm logior-0-x (implies (integerp x) (equal (logior 0 x) x)))
|(logior 1 x)|theorem
(defthm |(logior 1 x)| (implies (integerp x) (equal (logior 1 x) (if (evenp x) (+ 1 x) x))) :hints (("Goal" :in-theory (enable logand))))
logior--1-xtheorem
(defthm logior--1-x (implies (integerp x) (equal (logior -1 x) -1)))
logior-x-xtheorem
(defthm logior-x-x (implies (integerp x) (equal (logior x x) x)))
logior-bounds-postheorem
(defthm logior-bounds-pos (implies (and (integerp x) (integerp y) (<= 0 x) (<= 0 y)) (<= x (logior x y))) :hints (("Goal" :in-theory (e/d (logior lognot) (logand-bounds-neg)) :use (:instance logand-bounds-neg (x (+ -1 (- x))) (y (+ -1 (- y)))))) :rule-classes ((:rewrite) (:linear) (:rewrite :corollary (implies (and (integerp x) (integerp y) (<= 0 x) (<= 0 y)) (<= y (logior x y)))) (:linear :corollary (implies (and (integerp x) (integerp y) (<= 0 x) (<= 0 y)) (<= y (logior x y))))))
logior-bounds-negtheorem
(defthm logior-bounds-neg (implies (and (integerp x) (integerp y) (< 0 x) (< 0 y)) (<= x (logior x y))) :hints (("Goal" :in-theory (e/d (logior lognot) (logand-bounds-neg)) :use (:instance logand-bounds-neg (x (+ -1 (- x))) (y (+ -1 (- y)))))) :rule-classes ((:rewrite) (:linear) (:rewrite :corollary (implies (and (integerp x) (integerp y) (< x 0) (< y 0)) (<= y (logior x y)))) (:linear :corollary (implies (and (integerp x) (integerp y) (< x 0) (< y 0)) (<= y (logior x y))))))
|(equal (logior x y) 0)|theorem
(defthm |(equal (logior x y) 0)| (implies (and (integerp x) (integerp y)) (equal (equal (logior x y) 0) (and (equal x 0) (equal y 0)))))
|(< (logior x y) 0)|theorem
(defthm |(< (logior x y) 0)| (implies (and (integerp x) (integerp y)) (equal (< (logior x y) 0) (or (< x 0) (< y 0)))) :rule-classes ((:rewrite) (:type-prescription :corollary (implies (and (integerp x) (integerp y) (< x 0)) (< (logior x y) 0))) (:type-prescription :corollary (implies (and (integerp x) (integerp y) (< y 0)) (< (logior x y) 0)))))
|(< 0 (logior x y))|theorem
(defthm |(< 0 (logior x y))| (implies (and (integerp x) (integerp y)) (equal (< 0 (logior x y)) (or (and (< 0 x) (<= 0 y)) (and (<= 0 x) (< 0 y))))) :rule-classes ((:rewrite) (:type-prescription :corollary (implies (and (integerp x) (integerp y) (< 0 x) (<= 0 y)) (< 0 (logior x y)))) (:type-prescription :corollary (implies (and (integerp x) (integerp y) (<= 0 x) (< 0 y)) (< 0 (logior x y))))))
|(logior (* 2 x) (* 2 y))|theorem
(defthm |(logior (* 2 x) (* 2 y))| (implies (and (real/rationalp x) (real/rationalp y) (integerp (* 2 x)) (integerp (* 2 y))) (equal (logior (* 2 x) (* 2 y)) (cond ((and (integerp x) (integerp y)) (* 2 (logior x y))) ((and (integerp x) (not (integerp y))) (+ 1 (* 2 (logior x (+ -1/2 y))))) ((and (not (integerp x)) (integerp y)) (+ 1 (* 2 (logior (+ -1/2 x) y)))) (t (+ 1 (* 2 (logior (+ -1/2 x) (+ -1/2 y)))))))) :rule-classes ((:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (real/rationalp x) (real/rationalp y) (integerp (* 2 x)) (integerp (* 2 y))) (equal (logior (* 2 x) (* 2 y)) (cond ((and (integerp x) (integerp y)) (* 2 (logior x y))) ((and (integerp x) (not (integerp y))) (+ 1 (* 2 (logior x (+ -1/2 y))))) ((and (not (integerp x)) (integerp y)) (+ 1 (* 2 (logior (+ -1/2 x) y)))) (t (+ 1 (* 2 (logior (+ -1/2 x) (+ -1/2 y))))))))) (:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp (* 2 x)) (integerp (* 2 y)) (integerp x) (integerp y)) (equal (logior (* 2 x) (* 2 y)) (* 2 (logior x y))))) (:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp (* 2 x)) (integerp (* 2 y)) (real/rationalp x) (not (integerp x)) (integerp y)) (equal (logior (* 2 x) (* 2 y)) (+ 1 (* 2 (logior (+ -1/2 x) y)))))) (:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp (* 2 x)) (integerp (* 2 y)) (integerp x) (real/rationalp y) (not (integerp y))) (equal (logior (* 2 x) (* 2 y)) (+ 1 (* 2 (logior x (+ -1/2 y))))))) (:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp (* 2 x)) (integerp (* 2 y)) (real/rationalp x) (not (integerp x)) (real/rationalp y) (not (integerp y))) (equal (logior (* 2 x) (* 2 y)) (+ 1 (* 2 (logior (+ -1/2 x) (+ -1/2 y)))))))) :hints (("Goal" :expand ((logand (+ -1 (* -2 x)) (+ -1 (* -2 y)))))))
|(logior (floor x 2) (floor y 2))|theorem
(defthm |(logior (floor x 2) (floor y 2))| (implies (and (integerp x) (integerp y)) (equal (logior (floor x 2) (floor y 2)) (floor (logior x y) 2))) :rule-classes ((:rewrite :corollary (implies (and (integerp x) (integerp y)) (equal (logior (floor x 2) (floor y 2)) (floor (logior x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (integerp (* 1/2 y))) (equal (logior (floor x 2) (* 1/2 y)) (floor (logior x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (not (integerp (* 1/2 y)))) (equal (logior (floor x 2) (+ -1/2 (* 1/2 y))) (floor (logior x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (integerp (* 1/2 x))) (equal (logior (* 1/2 x) (floor y 2)) (floor (logior x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (integerp (* 1/2 x)) (integerp (* 1/2 y))) (equal (logior (* 1/2 x) (* 1/2 y)) (floor (logior x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (integerp (* 1/2 x)) (not (integerp (* 1/2 y)))) (equal (logior (* 1/2 x) (+ -1/2 (* 1/2 y))) (floor (logior x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (not (integerp (* 1/2 x)))) (equal (logior (+ -1/2 (* 1/2 x)) (floor y 2)) (floor (logior x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (not (integerp (* 1/2 x))) (integerp (* 1/2 y))) (equal (logior (+ -1/2 (* 1/2 x)) (* 1/2 y)) (floor (logior x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (not (integerp (* 1/2 x))) (not (integerp (* 1/2 y)))) (equal (logior (+ -1/2 (* 1/2 x)) (+ -1/2 (* 1/2 y))) (floor (logior x y) 2))))) :hints (("Goal" :in-theory (enable logand))))
logior-floor-expt-2-ntheorem
(defthm logior-floor-expt-2-n (implies (and (integerp x) (integerp y) (integerp n) (<= 0 n)) (equal (logior (floor x (expt 2 n)) (floor y (expt 2 n))) (floor (logior x y) (expt 2 n)))) :hints (("Goal" :in-theory (e/d nil (logior)) :induct (ind-fn n) :do-not '(generalize eliminate-destructors)) ("Subgoal *1/2" :use ((:instance |(logior (floor x 2) (floor y 2))| (x (floor x (expt 2 (+ -1 n)))) (y (floor y (expt 2 (+ -1 n)))))))))
|(mod (logior x y) 2)|theorem
(defthm |(mod (logior x y) 2)| (implies (and (integerp x) (integerp y)) (equal (mod (logior x y) 2) (if (and (integerp (* 1/2 x)) (integerp (* 1/2 y))) 0 1))) :rule-classes ((:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp x) (integerp y)) (equal (mod (logior x y) 2) (if (and (integerp (* 1/2 x)) (integerp (* 1/2 y))) 0 1)))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (integerp (* 1/2 x)) (integerp (* 1/2 y))) (equal (mod (logior x y) 2) 0))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (not (integerp (* 1/2 x)))) (equal (mod (logior x y) 2) 1))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (not (integerp (* 1/2 y)))) (equal (mod (logior x y) 2) 1)))))
mod-logior-expt-2-nencapsulate
(encapsulate nil (local (in-theory (enable expt-type-prescription-integerp-base mod-zero))) (local (defun floor-2-n-ind (x y n) (cond ((zip n) (+ x y)) ((< 0 n) (floor-2-n-ind (floor x 2) (floor y 2) (+ -1 n))) (t (floor-2-n-ind (floor x 2) (floor y 2) (+ 1 n)))))) (local (defthm |(integerp (* 1/2 (logior x y)))| (implies (and (integerp x) (integerp y)) (equal (integerp (* 1/2 (logior x y))) (and (integerp (* 1/2 x)) (integerp (* 1/2 y))))))) (local (defthm break-logior-apart (implies (and (integerp x) (integerp y)) (equal (logior x y) (+ (* 2 (logior (floor x 2) (floor y 2))) (logior (mod x 2) (mod y 2))))) :hints (("Goal" :in-theory (disable logior))) :rule-classes nil)) (local (defthm crock-0 (implies (and (integerp x) (not (integerp (* 1/2 x))) (integerp n) (< 0 n)) (not (integerp (* 1/2 (mod x (expt 2 n)))))))) (local (defthm crock-1 (implies (and (integerp x) (integerp (* 1/2 x)) (integerp n) (< 0 n)) (integerp (* 1/2 (mod x (expt 2 n))))))) (local (defthm crock-2 (implies (and (equal (mod x (expt 2 n)) 0) (integerp x) (integerp n) (< 0 n)) (integerp (* 1/2 x))))) (local (in-theory (disable (:type-prescription not-integerp-4a) (:type-prescription mod-zero . 4) (:type-prescription not-integerp-4b) (:rewrite mod-x-y-=-x-y . 2) (:type-prescription mod-zero . 2) (:rewrite cancel-mod-+) (:rewrite default-times-2) (:type-prescription expt-type-prescription-nonpositive-base-odd-exponent) (:type-prescription expt-type-prescription-nonpositive-base-even-exponent) (:type-prescription expt-type-prescription-negative-base-odd-exponent) (:type-prescription expt-type-prescription-negative-base-even-exponent) (:type-prescription expt-type-prescription-integerp-base-b) (:rewrite default-plus-2) (:rewrite default-mod-ratio) (:type-prescription not-integerp-3b) (:type-prescription not-integerp-2b) (:type-prescription not-integerp-1b) (:type-prescription integerp-/-expt-2) (:rewrite mod-x-y-=-x-y . 1) (:rewrite mod-x-y-=-x . 4) (:rewrite simplify-products-gather-exponents-<) (:rewrite mod-x-y-=-x+y . 1) (:type-prescription |(< (logior x y) 0)| . 2) (:type-prescription |(< (logior x y) 0)| . 1) (:rewrite default-plus-1) (:rewrite default-times-1) (:rewrite |(mod (+ x (mod a b)) y)|) (:rewrite |(mod (+ x (- (mod a b))) y)|) (:rewrite default-divide) (:type-prescription mod-zero . 3) (:type-prescription mod-positive . 2) (:type-prescription mod-positive . 1) (:type-prescription mod-negative . 2) (:type-prescription mod-negative . 1) (:rewrite mod-x-y-=-x-y . 3) (:rewrite simplify-products-gather-exponents-equal) (:type-prescription mod-nonpositive) (:type-prescription not-integerp-3a) (:type-prescription not-integerp-2a) (:rewrite |(* (- x) y)|) (:rewrite mod-x-y-=-x . 2) (:rewrite |(< (logior x y) 0)|) (:rewrite default-minus) (:rewrite default-less-than-2) (:rewrite default-less-than-1) (:rewrite mod-cancel-*-const) (:type-prescription not-integerp-1a) (:rewrite mod-x-y-=-x+y . 3) (:type-prescription not-integerp-4a) (:rewrite default-times-2) (:rewrite |(mod x (* y (/ z))) rewriting-goal-literal|) (:type-prescription not-integerp-4b-expt) (:rewrite default-mod-2) (:rewrite reduce-additive-constant-<) (:type-prescription not-integerp-3b-expt) (:rewrite |(* (+ x y) z)|) (:type-prescription not-integerp-4a-expt) (:linear mod-bounds-2) (:type-prescription not-integerp-2b-expt) (:rewrite default-expt-2) (:rewrite default-expt-1) (:type-prescription bubble-down) (:rewrite default-floor-ratio) (:rewrite reduce-rational-multiplicative-constant-<) (:rewrite reduce-multiplicative-constant-<) (:rewrite the-floor-below) (:rewrite the-floor-above) (:rewrite integerp-<-constant) (:rewrite remove-strict-inequalities) (:rewrite |(< (/ x) (/ y))|) (:rewrite |(< c (/ x)) positive c --- present in goal|) (:rewrite |(< c (/ x)) positive c --- obj t or nil|) (:rewrite |(< c (/ x)) negative c --- present in goal|) (:rewrite |(< c (/ x)) negative c --- obj t or nil|) (:rewrite |(< (/ x) c) positive c --- present in goal|) (:rewrite |(< (/ x) c) positive c --- obj t or nil|) (:rewrite |(< (/ x) c) negative c --- present in goal|) (:rewrite |(< (/ x) c) negative c --- obj t or nil|) (:rewrite constant-<-integerp) (:rewrite |(* (if a b c) x)|) (:rewrite |(< (+ (- c) x) y)|) (:type-prescription integerp-mod-2) (:type-prescription integerp-mod-1) (:type-prescription rationalp-mod) (:rewrite normalize-terms-such-as-a/a+b-+-b/a+b) (:meta meta-integerp-correct) (:rewrite reduce-additive-constant-equal) (:linear expt-x->-x) (:rewrite default-mod-1) (:linear expt-x->=-x) (:type-prescription floor-zero . 4) (:rewrite simplify-terms-such-as-ax+bx-<-0-rational-remainder) (:rewrite simplify-terms-such-as-ax+bx-<-0-rational-common) (:linear expt-<=-1-two) (:rewrite |(< (* x y) 0)|) (:rewrite |(< (/ x) 0)|) (:linear expt-is-weakly-increasing-for-base->-1) (:rewrite |(equal (- x) (- y))|) (:linear expt-linear-upper-<=) (:rewrite reduce-multiplicative-constant-equal) (:rewrite |(equal (/ x) c)|) (:rewrite |(equal (- x) c)|) (:type-prescription not-integerp-3a-expt) (:type-prescription not-integerp-2a-expt) (:type-prescription not-integerp-1a-expt) (:linear expt-is-weakly-decreasing-for-pos-base-<-1) (:linear expt-is-decreasing-for-pos-base-<-1) (:rewrite |(equal c (/ x))|) (:rewrite |(equal (/ x) (/ y))|) (:rewrite equal-of-predicates-rewrite) (:rewrite |(equal c (- x))|) (:type-prescription floor-zero . 2) (:rewrite |(< x (+ c/d y))|) (:rewrite default-floor-1) (:linear expt-<-1-two) (:type-prescription floor-nonpositive . 1) (:type-prescription floor-positive . 1) (:rewrite simplify-terms-such-as-0-<-ax+bx-rational-remainder) (:rewrite simplify-terms-such-as-0-<-ax+bx-rational-common) (:rewrite |(< 0 (* x y))|) (:rewrite simplify-terms-such-as-ax+bx-=-0) (:rewrite mod-zero . 1) (:linear expt-linear-upper-<) (:linear expt-linear-lower-<) (:linear expt->=-1-two) (:linear expt->-1-two) (:linear expt-<=-1-one) (:linear expt-<-1-one) (:rewrite mod-cancel-*-not-rewriting-goal-literal) (:rewrite |(mod x (- y))| . 3) (:rewrite |(mod x (- y))| . 2) (:rewrite |(mod x (* y (/ z))) not rewriting-goal-literal|) (:rewrite |(mod (- x) y)| . 3) (:rewrite |(mod (- x) y)| . 2) (:rewrite |(mod (- x) y)| . 1) (:rewrite |(mod (* x (/ y)) z) not rewriting-goal-literal|) (:rewrite |(equal (mod (+ x y) z) x)|) (:type-prescription abs) (:rewrite simplify-products-scatter-exponents-<) (:rewrite |(not (equal x (/ y)))|) (:rewrite prefer-positive-exponents-scatter-exponents-<) (:type-prescription floor-zero . 3) (:type-prescription floor-zero . 1) (:type-prescription floor-positive . 3) (:type-prescription floor-positive . 2) (:type-prescription floor-nonpositive . 3) (:type-prescription floor-nonpositive . 2) (:type-prescription floor-nonnegative . 3) (:type-prescription floor-nonnegative . 2) (:type-prescription floor-negative . 3) (:type-prescription floor-negative . 2) (:type-prescription floor-negative . 1) (:type-prescription floor-nonnegative . 1) (:rewrite |(equal x (/ y))|) (:rewrite mod-zero . 2)))) (defthm mod-logior-expt-2-n (implies (and (integerp x) (integerp y) (integerp n)) (equal (logior (mod x (expt 2 n)) (mod y (expt 2 n))) (mod (logior x y) (expt 2 n)))) :hints (("Goal" :induct (floor-2-n-ind x y n) :in-theory (disable logior) :do-not '(generalize eliminate-destructors)) ("Subgoal *1/2" :use ((:instance break-logior-apart) (:instance break-logior-apart (x (mod x (expt 2 n))) (y (mod y (expt 2 n)))))))))
|(integerp (* 1/2 (logior x y)))|theorem
(defthm |(integerp (* 1/2 (logior x y)))| (implies (and (integerp x) (integerp y)) (equal (integerp (* 1/2 (logior x y))) (and (integerp (* 1/2 x)) (integerp (* 1/2 y))))))
|(logxor y x)|theorem
(defthm |(logxor y x)| (equal (logxor y x) (logxor x y)))
logxor-0-xtheorem
(defthm logxor-0-x (implies (integerp x) (equal (logxor 0 x) x)))
logxor-1-xtheorem
(defthm logxor-1-x (implies (integerp x) (equal (logxor 1 x) (if (evenp x) (+ 1 x) (+ -1 x)))) :hints (("Goal" :in-theory (enable logior logand))))
logxor--1-xtheorem
(defthm logxor--1-x (implies (integerp x) (equal (logxor -1 x) (lognot x))))
logxor-x-xtheorem
(defthm logxor-x-x (implies (integerp x) (equal (logxor x x) 0)) :hints (("Goal" :in-theory (enable logior logand))))
|(logxor (floor x 2) (floor y 2))|encapsulate
(encapsulate nil (local (in-theory (e/d nil (reduce-additive-constant-< (:rewrite |(< (- x) c)|) (:type-prescription |(< (logand x y) 0)| . 3) (:type-prescription |(< (logand x y) 0)| . 2) (:type-prescription |(< (logand x y) 0)| . 1) (:linear logand-bounds-pos . 1) (:linear logand-bounds-pos . 2) (:linear logand-bounds-neg . 2) (:linear logand-bounds-neg . 1) (:rewrite prefer-positive-addends-equal) (:rewrite normalize-addends) (:rewrite |(< (+ (- c) x) y)|) (:rewrite |(< x (/ y)) with (< 0 y)|) (:rewrite |(<= 1 (* (/ x) y)) with (< x 0)|) (:rewrite |(<= (* (/ x) y) -1) with (< 0 x)|) (:rewrite |(<= 1 (* (/ x) y)) with (< 0 x)|) (:rewrite |(<= (* (/ x) y) -1) with (< x 0)|) (:rewrite |(< (/ x) y) with (< 0 x)|) (:rewrite |(<= (/ x) y) with (< 0 x)|) (:rewrite |(< (* (/ x) y) 1) with (< x 0)|) (:rewrite |(floor (* x (/ y)) z) not rewriting-goal-literal|) (:rewrite |(< -1 (* (/ x) y)) with (< 0 x)|) (:rewrite |(< x (/ y)) with (< y 0)|) (:rewrite |(<= (/ x) y) with (< x 0)|) (:rewrite |(< -1 (* (/ x) y)) with (< x 0)|) (:rewrite |(< (* (/ x) y) 1) with (< 0 x)|) (:rewrite reduce-multiplicative-constant-<) (:rewrite |(< (+ c/d x) y)|) (:rewrite normalize-terms-such-as-a/a+b-+-b/a+b) (:rewrite default-less-than-2) (:rewrite |(floor (+ x y) z) where (< 0 z)| . 3) (:rewrite prefer-positive-addends-<) (:rewrite |(floor (+ x y) z) where (< 0 z)| . 2) (:rewrite normalize-factors-gather-exponents) (:rewrite the-floor-above) (:rewrite floor-x-y-=--1 . 2) (:rewrite reduce-rational-multiplicative-constant-<) (:rewrite |(* (- x) y)|) (:rewrite |(< (- x) (- y))|) (:rewrite |(< (* x y) 0)|) (:rewrite constant-<-integerp) (:rewrite simplify-products-gather-exponents-<) (:rewrite |(floor x 2)| . 2) (:rewrite |(< (logior x y) 0)|) (:rewrite floor-=-x/y . 1) (:rewrite |(< c (/ x)) positive c --- present in goal|) (:rewrite |(< c (/ x)) positive c --- obj t or nil|) (:rewrite |(< c (/ x)) negative c --- present in goal|) (:rewrite |(< c (/ x)) negative c --- obj t or nil|) (:rewrite |(< c (- x))|) (:rewrite |(< (/ x) c) positive c --- present in goal|) (:rewrite |(< (/ x) c) positive c --- obj t or nil|) (:rewrite |(< (/ x) c) negative c --- present in goal|) (:rewrite |(< (/ x) c) negative c --- obj t or nil|) (:rewrite |(< (/ x) (/ y))|) (:rewrite mod-cancel-*-const) (:rewrite remove-strict-inequalities) (:rewrite integerp-<-constant) (:rewrite floor-cancel-*-const) (:rewrite mod-x-y-=-x+y . 2) (:rewrite simplify-sums-<) (:rewrite reduce-integerp-+) (:meta meta-integerp-correct) (:linear logior-bounds-pos . 2) (:linear logior-bounds-pos . 1) (:linear logior-bounds-neg . 2) (:linear logior-bounds-neg . 1) (:rewrite |(* (* x y) z)|) (:rewrite simplify-products-gather-exponents-equal) (:linear mod-bounds-3) (:rewrite mod-x-y-=-x+y . 3) (:rewrite default-logand-2) (:rewrite remove-weak-inequalities) (:rewrite |(< (logand x y) 0)|) (:rewrite |(< (/ x) y) with (< x 0)|) (:rewrite |(< (/ x) 0)|) (:type-prescription |(< 0 (logior x y))| . 2) (:type-prescription |(< 0 (logior x y))| . 1) (:type-prescription |(< (logior x y) 0)| . 2) (:type-prescription |(< (logior x y) 0)| . 1) (:rewrite simplify-sums-equal) (:rewrite cancel-mod-+) (:rewrite simplify-terms-such-as-ax+bx-<-0-rational-remainder) (:rewrite simplify-terms-such-as-ax+bx-<-0-rational-common) (:rewrite |(equal (/ x) (/ y))|) (:rewrite |(equal c (/ x))|) (:rewrite |(equal (/ x) c)|) (:type-prescription mod-nonnegative) (:type-prescription integerp-mod-2) (:type-prescription integerp-mod-1) (:rewrite |(< (* x y) 0) rationalp (* x y)|) (:rewrite default-mod-ratio) (:type-prescription rationalp-mod) (:rewrite |(floor x (- y))| . 2) (:rewrite |(floor (- x) y)| . 2) (:rewrite equal-of-predicates-rewrite) (:rewrite default-logand-1) (:rewrite |(equal (+ (- c) x) y)|) (:rewrite |(<= x (/ y)) with (< y 0)|) (:rewrite logand-constant-mask) (:rewrite |(not (equal (* (/ x) y) -1))|) (:rewrite |(equal (* (/ x) y) -1)|) (:rewrite |(mod x 2)| . 2) (:rewrite |(< x (+ c/d y))|) (:rewrite |(< y (+ (- c) x))|) (:rewrite default-logior-2))))) (defthm |(logxor (floor x 2) (floor y 2))| (implies (and (integerp x) (integerp y)) (equal (logxor (floor x 2) (floor y 2)) (floor (logxor x y) 2))) :rule-classes ((:rewrite :corollary (implies (and (integerp x) (integerp y)) (equal (logxor (floor x 2) (floor y 2)) (floor (logxor x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (integerp (* 1/2 y))) (equal (logxor (floor x 2) (* 1/2 y)) (floor (logxor x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (not (integerp (* 1/2 y)))) (equal (logxor (floor x 2) (+ -1/2 (* 1/2 y))) (floor (logxor x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (integerp (* 1/2 x))) (equal (logxor (* 1/2 x) (floor y 2)) (floor (logxor x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (integerp (* 1/2 x)) (integerp (* 1/2 y))) (equal (logxor (* 1/2 x) (* 1/2 y)) (floor (logxor x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (integerp (* 1/2 x)) (not (integerp (* 1/2 y)))) (equal (logxor (* 1/2 x) (+ -1/2 (* 1/2 y))) (floor (logxor x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (not (integerp (* 1/2 x)))) (equal (logxor (+ -1/2 (* 1/2 x)) (floor y 2)) (floor (logxor x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (not (integerp (* 1/2 x))) (integerp (* 1/2 y))) (equal (logxor (+ -1/2 (* 1/2 x)) (* 1/2 y)) (floor (logxor x y) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp y) (not (integerp (* 1/2 x))) (not (integerp (* 1/2 y)))) (equal (logxor (+ -1/2 (* 1/2 x)) (+ -1/2 (* 1/2 y))) (floor (logxor x y) 2))))) :hints (("Goal" :in-theory (enable logior logand)))))
|(mod (logxor x y) 2)|theorem
(defthm |(mod (logxor x y) 2)| (implies (and (integerp x) (integerp y)) (equal (mod (logxor x y) 2) (cond ((and (integerp (* 1/2 x)) (not (integerp (* 1/2 y)))) 1) ((and (not (integerp (* 1/2 x))) (integerp (* 1/2 y))) 1) (t 0)))) :rule-classes ((:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp x) (integerp y)) (equal (mod (logxor x y) 2) (cond ((and (integerp (* 1/2 x)) (not (integerp (* 1/2 y)))) 1) ((and (not (integerp (* 1/2 x))) (integerp (* 1/2 y))) 1) (t 0))))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (integerp (* 1/2 x)) (not (integerp (* 1/2 y)))) (equal (mod (logxor x y) 2) 1))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (not (integerp (* 1/2 x))) (integerp (* 1/2 y))) (equal (mod (logxor x y) 2) 1))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (integerp (* 1/2 x)) (integerp (* 1/2 y))) (equal (mod (logxor x y) 2) 0))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (not (integerp (* 1/2 x))) (not (integerp (* 1/2 y)))) (equal (mod (logxor x y) 2) 0)))))
|(integerp (* 1/2 (logxor x y)))|theorem
(defthm |(integerp (* 1/2 (logxor x y)))| (implies (and (integerp x) (integerp y)) (equal (integerp (* 1/2 (logxor x y))) (iff (integerp (* 1/2 x)) (integerp (* 1/2 y))))) :rule-classes ((:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp x) (integerp y)) (equal (integerp (* 1/2 (logxor x y))) (iff (integerp (* 1/2 x)) (integerp (* 1/2 y)))))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (integerp (* 1/2 x)) (integerp (* 1/2 y))) (integerp (* 1/2 (logxor x y))))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (not (integerp (* 1/2 x))) (not (integerp (* 1/2 y)))) (integerp (* 1/2 (logxor x y))))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (integerp (* 1/2 x)) (not (integerp (* 1/2 y)))) (not (integerp (* 1/2 (logxor x y)))))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp y) (not (integerp (* 1/2 x))) (integerp (* 1/2 y))) (not (integerp (* 1/2 (logxor x y))))))))
|(equal (lognot x) (lognot y))|theorem
(defthm |(equal (lognot x) (lognot y))| (implies (and (integerp x) (integerp y)) (equal (equal (lognot x) (lognot y)) (equal x y))))
|(equal (lognot x) -1)|theorem
(defthm |(equal (lognot x) -1)| (implies (integerp x) (equal (equal (lognot x) -1) (equal x 0))))
|(equal (lognot x) 0)|theorem
(defthm |(equal (lognot x) 0)| (equal (equal (lognot x) 0) (equal x -1)))
|(lognot (* 2 x))|theorem
(defthm |(lognot (* 2 x))| (implies (and (real/rationalp x) (integerp (* 2 x))) (equal (lognot (* 2 x)) (if (integerp x) (+ 1 (* 2 (lognot x))) (* 2 (lognot (+ -1/2 x)))))) :rule-classes ((:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (real/rationalp x) (integerp (* 2 x))) (equal (lognot (* 2 x)) (if (integerp x) (+ 1 (* 2 (lognot x))) (* 2 (lognot (+ -1/2 x))))))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x)) (equal (lognot (* 2 x)) (+ 1 (* 2 (lognot x)))))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp (* 2 x)) (real/rationalp x) (not (integerp x))) (equal (lognot (* 2 x)) (* 2 (lognot (+ -1/2 x))))))))
|(lognot (floor x 2))|theorem
(defthm |(lognot (floor x 2))| (implies (integerp x) (equal (lognot (floor x 2)) (floor (lognot x) 2))) :rule-classes ((:rewrite :corollary (implies (integerp x) (equal (lognot (floor x 2)) (floor (lognot x) 2)))) (:rewrite :corollary (implies (and (integerp x) (integerp (* 1/2 x))) (equal (lognot (* 1/2 x)) (floor (lognot x) 2)))) (:rewrite :corollary (implies (and (integerp x) (not (integerp (* 1/2 x)))) (equal (lognot (+ -1/2 (* 1/2 x))) (floor (lognot x) 2))))))
local
(local (defthm floor-lognot-helper (implies (and (integerp x) (integerp n) (equal (+ 1 (mod x n)) n)) (integerp (+ (/ n) (* x (/ n))))) :rule-classes nil))
floor-lognotencapsulate
(encapsulate nil (local (in-theory (enable expt-type-prescription-integerp-base))) (defthm floor-lognot (implies (and (integerp x) (integerp n) (<= 0 n)) (equal (lognot (floor x (expt 2 n))) (floor (lognot x) (expt 2 n)))) :hints (("Goal" :induct (ind-fn n) :do-not '(generalize eliminate-destructors)) ("Subgoal *1/2" :use ((:instance (:theorem (implies (equal x y) (equal (floor x 2) (floor y 2)))) (x (floor (lognot x) (expt 2 (+ -1 n)))) (y (lognot (floor x (expt 2 (+ -1 n)))))))) ("Subgoal *1/2.2" :use (:instance floor-lognot-helper (x x) (n (expt 2 n)))))))
|(mod (lognot x) 2)|theorem
(defthm |(mod (lognot x) 2)| (implies (integerp x) (equal (mod (lognot x) 2) (if (integerp (* 1/2 x)) 1 0))) :rule-classes ((:rewrite :corollary (implies (and (syntaxp (rewriting-goal-literal x mfc state)) (integerp x)) (equal (mod (lognot x) 2) (if (integerp (* 1/2 x)) 1 0)))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (integerp (* 1/2 x))) (equal (mod (lognot x) 2) 1))) (:rewrite :corollary (implies (and (syntaxp (not (rewriting-goal-literal x mfc state))) (integerp x) (not (integerp (* 1/2 x)))) (equal (mod (lognot x) 2) 0)))))
|(integerp (* 1/2 (lognot x)))|theorem
(defthm |(integerp (* 1/2 (lognot x)))| (implies (integerp x) (equal (integerp (* 1/2 (lognot x))) (not (integerp (* 1/2 x))))))
lognot-logandtheorem
(defthm lognot-logand (implies (and (integerp x) (integerp y)) (equal (lognot (logand x y)) (logior (lognot x) (lognot y)))) :hints (("Goal" :in-theory (enable logior))))
lognot-logiortheorem
(defthm lognot-logior (implies (and (integerp x) (integerp y)) (equal (lognot (logior x y)) (logand (lognot x) (lognot y)))) :hints (("Goal" :in-theory (enable logior))))
lognot-lognottheorem
(defthm lognot-lognot (implies (case-split (integerp i)) (equal (lognot (lognot i)) i)))
in-theory
(in-theory (disable lognot))