name | word-bits-thm |
version | 1.1 |
description | word-bits-thm |
author | Joe Hurd <joe@gilith.com> |
license | MIT |
provenance | HOL Light theory extracted on 2011-03-17 |
show | Data.Bool |
⊦ ∀w. Data.Word.Bits.normal (Data.Word.Bits.fromWord w)
⊦ Data.Word.toNatural (Data.Word.Bits.toWord Data.List.[]) =
Number.Numeral.zero
⊦ ∀w. Data.Word.Bits.toWord (Data.Word.Bits.fromWord w) = w
⊦ ∀w. Data.List.length (Data.Word.Bits.fromWord w) = Data.Word.width
⊦ ∀l.
Number.Natural.< (Data.Word.toNatural (Data.Word.Bits.toWord l))
(Number.Natural.exp
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero))
(Data.List.length l))
⊦ ∀l.
Data.List.length l = Data.Word.width ⇔
Data.Word.Bits.fromWord (Data.Word.Bits.toWord l) = l
⊦ ∀w1 w2. Data.Word.Bits.fromWord w1 = Data.Word.Bits.fromWord w2 ⇔ w1 = w2
⊦ ∀w1 w2. Data.Word.Bits.fromWord w1 = Data.Word.Bits.fromWord w2 ⇒ w1 = w2
⊦ ∀w1 w2.
Data.Word.Bits.compare F (Data.Word.Bits.fromWord w1)
(Data.Word.Bits.fromWord w2) ⇔ Data.Word.< w1 w2
⊦ ∀w1 w2.
Data.Word.Bits.compare T (Data.Word.Bits.fromWord w1)
(Data.Word.Bits.fromWord w2) ⇔ Data.Word.≤ w1 w2
⊦ ∀l.
Number.Natural.≤ Data.Word.width (Data.List.length l) ⇒
Data.Word.Bits.fromWord (Data.Word.Bits.toWord l) =
Data.List.take Data.Word.width l
⊦ ∀l n.
Data.Word.shiftLeft (Data.Word.Bits.toWord l) n =
Data.Word.Bits.toWord (Data.List.@ (Data.List.replicate n F) l)
⊦ ∀n.
Data.Word.Bits.toWord
(Data.List.:: (Number.Natural.odd n)
(Data.Word.Bits.fromWord
(Data.Word.fromNatural
(Number.Natural.div n
(Number.Numeral.bit0
(Number.Numeral.bit1 Number.Numeral.zero)))))) =
Data.Word.fromNatural n
⊦ ∀w n.
Data.Word.bit w n ⇔
Number.Natural.odd
(Number.Natural.div (Data.Word.toNatural w)
(Number.Natural.exp
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero))
n))
⊦ ∀l.
Number.Natural.≤ (Data.List.length l) Data.Word.width ⇒
Data.Word.Bits.fromWord (Data.Word.Bits.toWord l) =
Data.List.@ l
(Data.List.replicate
(Number.Natural.- Data.Word.width (Data.List.length l)) F)
⊦ ∀q w1 w2.
Data.Word.Bits.compare q (Data.Word.Bits.fromWord w1)
(Data.Word.Bits.fromWord w2) ⇔
if q then Data.Word.≤ w1 w2 else Data.Word.< w1 w2
⊦ ∀w1 w2.
(∀i.
Number.Natural.< i Data.Word.width ⇒
(Data.Word.bit w1 i ⇔ Data.Word.bit w2 i)) ⇒ w1 = w2
⊦ ∀l.
Number.Natural.<
(Number.Natural.+
(Number.Natural.*
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero))
(Data.Word.toNatural (Data.Word.Bits.toWord l)))
(Number.Numeral.bit1 Number.Numeral.zero))
(Number.Natural.exp
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero))
(Number.Natural.suc (Data.List.length l)))
⊦ ∀l n.
Data.Word.bit (Data.Word.Bits.toWord l) n ⇔
Number.Natural.< n Data.Word.width ∧
Number.Natural.< n (Data.List.length l) ∧ Data.List.nth n l
⊦ ∀n.
Data.Word.fromNatural n =
Data.Word.Bits.toWord
(if n = Number.Numeral.zero then Data.List.[]
else
Data.List.:: (Number.Natural.odd n)
(Data.Word.Bits.fromWord
(Data.Word.fromNatural
(Number.Natural.div n
(Number.Numeral.bit0
(Number.Numeral.bit1 Number.Numeral.zero))))))
⊦ ∀l.
Data.Word.Bits.fromWord (Data.Word.Bits.toWord l) =
if Number.Natural.≤ (Data.List.length l) Data.Word.width then
Data.List.@ l
(Data.List.replicate
(Number.Natural.- Data.Word.width (Data.List.length l)) F)
else Data.List.take Data.Word.width l
⊦ ∀h t.
Data.Word.toNatural (Data.Word.Bits.toWord (Data.List.:: h t)) =
Number.Natural.mod
(Number.Natural.+
(Number.Natural.*
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero))
(Data.Word.toNatural (Data.Word.Bits.toWord t)))
(if h then Number.Numeral.bit1 Number.Numeral.zero
else Number.Numeral.zero)) Data.Word.modulus
⊦ ∀h t.
Number.Natural.<
(Number.Natural.+
(Number.Natural.*
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero))
(Data.Word.toNatural (Data.Word.Bits.toWord t)))
(if h then Number.Numeral.bit1 Number.Numeral.zero
else Number.Numeral.zero))
(Number.Natural.exp
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero))
(Number.Natural.suc (Data.List.length t)))
⊦ ∀l n.
Number.Natural.≤ (Data.List.length l) Data.Word.width ⇒
Data.Word.shiftRight (Data.Word.Bits.toWord l) n =
if Number.Natural.≤ (Data.List.length l) n then
Data.Word.Bits.toWord Data.List.[]
else Data.Word.Bits.toWord (Data.List.drop n l)
⊦ ∀l n.
Number.Natural.≤ Data.Word.width (Data.List.length l) ⇒
Data.Word.shiftRight (Data.Word.Bits.toWord l) n =
if Number.Natural.≤ Data.Word.width n then
Data.Word.Bits.toWord Data.List.[]
else
Data.Word.Bits.toWord
(Data.List.drop n (Data.List.take Data.Word.width l))
⊦ ∀l n.
Data.Word.shiftRight (Data.Word.Bits.toWord l) n =
if Number.Natural.≤ (Data.List.length l) Data.Word.width then
if Number.Natural.≤ (Data.List.length l) n then
Data.Word.Bits.toWord Data.List.[]
else Data.Word.Bits.toWord (Data.List.drop n l)
else if Number.Natural.≤ Data.Word.width n then
Data.Word.Bits.toWord Data.List.[]
else
Data.Word.Bits.toWord
(Data.List.drop n (Data.List.take Data.Word.width l))
⊦ T
⊦ ¬(Data.Word.modulus = Number.Numeral.zero)
⊦ ∀n. Number.Natural.≤ Number.Numeral.zero n
⊦ ∀n. Number.Natural.≤ n n
⊦ F ⇔ ∀p. p
⊦ ∀x. Function.id x = x
⊦ ∀t. t ∨ ¬t
⊦ ∀x. Number.Natural.< (Data.Word.toNatural x) Data.Word.modulus
⊦ ∀n. Number.Natural.< Number.Numeral.zero (Number.Natural.suc n)
⊦ (¬) = λp. p ⇒ F
⊦ (∃) = λP. P ((select) P)
⊦ ∀a. ∃x. x = a
⊦ ∀t. (∀x. t) ⇔ t
⊦ ∀t. (∃x. t) ⇔ t
⊦ ∀t. (λx. t x) = t
⊦ (∀) = λP. P = λx. T
⊦ ∀x. x = x ⇔ T
⊦ ∀x. Data.Word.fromNatural (Data.Word.toNatural x) = x
⊦ ∀n. ¬(Number.Natural.suc n = Number.Numeral.zero)
⊦ ∀n. Number.Natural.even n ∨ Number.Natural.odd n
⊦ ∀m. Number.Natural.+ m Number.Numeral.zero = m
⊦ ∀n. Number.Natural.- n n = Number.Numeral.zero
⊦ Data.Word.modulus =
Number.Natural.exp
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero))
Data.Word.width
⊦ ∀x.
Number.Natural.div (Data.Word.toNatural x) Data.Word.modulus =
Number.Numeral.zero
⊦ ∀n.
Number.Natural.even
(Number.Natural.*
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero)) n)
⊦ ∀n. Number.Numeral.bit0 n = Number.Natural.+ n n
⊦ ∀n. ¬Number.Natural.even n ⇔ Number.Natural.odd n
⊦ ∀n. ¬Number.Natural.odd n ⇔ Number.Natural.even n
⊦ ∀n. Number.Natural.div n (Number.Numeral.bit1 Number.Numeral.zero) = n
⊦ ∀n. Number.Natural.exp n (Number.Numeral.bit1 Number.Numeral.zero) = n
⊦ ∀n.
Number.Natural.mod n (Number.Numeral.bit1 Number.Numeral.zero) =
Number.Numeral.zero
⊦ ∀l. Data.List.take (Data.List.length l) l = l
⊦ ∀x. (select y. y = x) = x
⊦ ∀m n. Number.Natural.≤ m (Number.Natural.+ m n)
⊦ ∀m n. Number.Natural.≤ n (Number.Natural.+ m n)
⊦ (⇒) = λp q. p ∧ q ⇔ p
⊦ ∀t. (t ⇔ T) ∨ (t ⇔ F)
⊦ ∀n.
Number.Natural.odd
(Number.Natural.suc
(Number.Natural.*
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero))
n))
⊦ ∀m.
Number.Natural.suc m =
Number.Natural.+ m (Number.Numeral.bit1 Number.Numeral.zero)
⊦ ∀n. Number.Numeral.bit1 n = Number.Natural.suc (Number.Natural.+ n n)
⊦ ∀x.
Data.Word.toNatural (Data.Word.fromNatural x) =
Number.Natural.mod x Data.Word.modulus
⊦ ∀l. Data.Word.Bits.normal l ⇔ Data.List.length l = Data.Word.width
⊦ ∀x y. Data.Pair.fst (Data.Pair., x y) = x
⊦ ∀x y. Data.Pair.snd (Data.Pair., x y) = y
⊦ ∀n x. Data.List.length (Data.List.replicate n x) = n
⊦ ∀m n. Data.List.length (Data.List.interval m n) = n
⊦ ∀P x. P x ⇒ P ((select) P)
⊦ (¬T ⇔ F) ∧ (¬F ⇔ T)
⊦ ∀n. Number.Natural.< Number.Numeral.zero n ⇔ ¬(n = Number.Numeral.zero)
⊦ ∀x y. x = y ⇔ y = x
⊦ ∀x y. x = y ⇒ y = x
⊦ ∀t1 t2. t1 ∧ t2 ⇔ t2 ∧ t1
⊦ ∀t1 t2. t1 ∨ t2 ⇔ t2 ∨ t1
⊦ ∀a b. (a ⇔ b) ⇒ a ⇒ b
⊦ ∀m n. Number.Natural.* m n = Number.Natural.* n m
⊦ ∀m n. m = n ⇒ Number.Natural.≤ m n
⊦ ∀m n. Number.Natural.< m n ⇒ Number.Natural.≤ m n
⊦ ∀m n. Number.Natural.< m n ∨ Number.Natural.≤ n m
⊦ ∀m n. Number.Natural.≤ m n ∨ Number.Natural.≤ n m
⊦ ∀m n. Number.Natural.- m (Number.Natural.+ m n) = Number.Numeral.zero
⊦ ∀m n. Number.Natural.- (Number.Natural.+ m n) m = n
⊦ ∀l f. Data.List.length (Data.List.map f l) = Data.List.length l
⊦ ∀w.
Data.Word.Bits.fromWord w =
Data.List.map (Data.Word.bit w)
(Data.List.interval Number.Numeral.zero Data.Word.width)
⊦ ∀n.
Number.Natural.< n Data.Word.modulus ⇒
Number.Natural.mod n Data.Word.modulus = n
⊦ ∀n.
Number.Natural.*
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero)) n =
Number.Natural.+ n n
⊦ ∀n.
Number.Natural.mod (Number.Natural.mod n Data.Word.modulus)
Data.Word.modulus = Number.Natural.mod n Data.Word.modulus
⊦ ∀m n. ¬(Number.Natural.< m n ∧ Number.Natural.≤ n m)
⊦ ∀m n. ¬(Number.Natural.≤ m n ∧ Number.Natural.< n m)
⊦ ∀m n. ¬Number.Natural.< m n ⇔ Number.Natural.≤ n m
⊦ ∀m n. ¬Number.Natural.≤ m n ⇔ Number.Natural.< n m
⊦ ∀m n. Number.Natural.< m (Number.Natural.suc n) ⇔ Number.Natural.≤ m n
⊦ ∀m n. Number.Natural.≤ (Number.Natural.suc m) n ⇔ Number.Natural.< m n
⊦ ∀m. m = Number.Numeral.zero ∨ ∃n. m = Number.Natural.suc n
⊦ (∧) = λp q. (λf. f p q) = λf. f T T
⊦ ∀n.
Number.Natural.even n ⇔
Number.Natural.mod n
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero)) =
Number.Numeral.zero
⊦ ∀n.
¬(n = Number.Numeral.zero) ⇒
Number.Natural.mod Number.Numeral.zero n = Number.Numeral.zero
⊦ ∀P. ¬(∀x. P x) ⇔ ∃x. ¬P x
⊦ ∀P. ¬(∃x. P x) ⇔ ∀x. ¬P x
⊦ (∃) = λP. ∀q. (∀x. P x ⇒ q) ⇒ q
⊦ ∀x y.
Data.Word.< x y ⇔
Number.Natural.< (Data.Word.toNatural x) (Data.Word.toNatural y)
⊦ ∀x y.
Data.Word.≤ x y ⇔
Number.Natural.≤ (Data.Word.toNatural x) (Data.Word.toNatural y)
⊦ ∀x y. Data.Word.toNatural x = Data.Word.toNatural y ⇒ x = y
⊦ ∀w n.
Data.Word.bit w n ⇔
Number.Natural.odd (Data.Word.toNatural (Data.Word.shiftRight w n))
⊦ ∀m n. Number.Natural.< m n ⇒ Number.Natural.div m n = Number.Numeral.zero
⊦ ∀m n. Number.Natural.< m n ⇒ Number.Natural.mod m n = m
⊦ ∀m n.
Number.Natural.< m (Number.Natural.+ m n) ⇔
Number.Natural.< Number.Numeral.zero n
⊦ ∀m n. Number.Natural.suc m = Number.Natural.suc n ⇔ m = n
⊦ ∀m n.
Number.Natural.< (Number.Natural.suc m) (Number.Natural.suc n) ⇔
Number.Natural.< m n
⊦ ∀m n.
Number.Natural.≤ (Number.Natural.suc m) (Number.Natural.suc n) ⇔
Number.Natural.≤ m n
⊦ ∀m n. Number.Natural.+ m n = m ⇔ n = Number.Numeral.zero
⊦ ∀m n. Number.Natural.- m n = Number.Numeral.zero ⇔ Number.Natural.≤ m n
⊦ ∀n.
Number.Natural.odd n ⇔
Number.Natural.mod n
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero)) =
Number.Numeral.bit1 Number.Numeral.zero
⊦ ∀m.
Number.Natural.- Number.Numeral.zero m = Number.Numeral.zero ∧
Number.Natural.- m Number.Numeral.zero = m
⊦ ∀m n.
Number.Natural.even (Number.Natural.* m n) ⇔
Number.Natural.even m ∨ Number.Natural.even n
⊦ ∀m n.
Number.Natural.even (Number.Natural.+ m n) ⇔ Number.Natural.even m ⇔
Number.Natural.even n
⊦ ∀m n.
¬(n = Number.Numeral.zero) ⇒
Number.Natural.< (Number.Natural.mod m n) n
⊦ ∀m n.
¬(n = Number.Numeral.zero) ⇒
Number.Natural.≤ (Number.Natural.div m n) m
⊦ ∀m n.
¬(n = Number.Numeral.zero) ⇒
Number.Natural.≤ (Number.Natural.mod m n) m
⊦ ∀l m.
Data.List.length (Data.List.@ l m) =
Number.Natural.+ (Data.List.length l) (Data.List.length m)
⊦ ∀P. (∀p. P p) ⇔ ∀p1 p2. P (Data.Pair., p1 p2)
⊦ ∀m n. Number.Natural.≤ m n ⇔ ∃d. n = Number.Natural.+ m d
⊦ ∀f g. f = g ⇔ ∀x. f x = g x
⊦ (∨) = λp q. ∀r. (p ⇒ r) ⇒ (q ⇒ r) ⇒ r
⊦ (Number.Natural.even Number.Numeral.zero ⇔ T) ∧
∀n. Number.Natural.even (Number.Natural.suc n) ⇔ ¬Number.Natural.even n
⊦ (Number.Natural.odd Number.Numeral.zero ⇔ F) ∧
∀n. Number.Natural.odd (Number.Natural.suc n) ⇔ ¬Number.Natural.odd n
⊦ ∀m n. Number.Natural.≤ m n ⇔ Number.Natural.< m n ∨ m = n
⊦ ∀m n. Number.Natural.≤ m n ∧ Number.Natural.≤ n m ⇔ m = n
⊦ ∀n l.
Number.Natural.≤ n (Data.List.length l) ⇒
Data.List.length (Data.List.take n l) = n
⊦ ∀m n.
Number.Natural.< m n ⇔
∃d. n = Number.Natural.+ m (Number.Natural.suc d)
⊦ ∀P. (∀x y. P x y) ⇔ ∀y x. P x y
⊦ ∀P Q. P ∧ (∃x. Q x) ⇔ ∃x. P ∧ Q x
⊦ ∀P Q. P ∨ (∃x. Q x) ⇔ ∃x. P ∨ Q x
⊦ ∀x y.
Data.Word.toNatural (Data.Word.+ x y) =
Number.Natural.mod
(Number.Natural.+ (Data.Word.toNatural x) (Data.Word.toNatural y))
Data.Word.modulus
⊦ ∀m n.
¬(m = Number.Numeral.zero) ⇒
Number.Natural.div (Number.Natural.* m n) m = n
⊦ ∀m n.
¬(m = Number.Numeral.zero) ⇒
Number.Natural.mod (Number.Natural.* m n) m = Number.Numeral.zero
⊦ ∀P Q. (∀x. P x ∨ Q) ⇔ (∀x. P x) ∨ Q
⊦ ∀P Q. (∃x. P x) ∧ Q ⇔ ∃x. P x ∧ Q
⊦ ∀P Q. (∀x. P x) ∨ Q ⇔ ∀x. P x ∨ Q
⊦ ∀P Q. (∃x. P x) ∨ Q ⇔ ∃x. P x ∨ Q
⊦ ∀x y z. x = y ∧ y = z ⇒ x = z
⊦ ∀t1 t2 t3. t1 ∨ t2 ∨ t3 ⇔ (t1 ∨ t2) ∨ t3
⊦ ∀p q r. p ∧ q ⇒ r ⇔ p ⇒ q ⇒ r
⊦ ∀n x i.
Number.Natural.< i n ⇒ Data.List.nth i (Data.List.replicate n x) = x
⊦ ∀m n p.
Number.Natural.* m (Number.Natural.* n p) =
Number.Natural.* (Number.Natural.* m n) p
⊦ ∀m n p.
Number.Natural.+ m (Number.Natural.+ n p) =
Number.Natural.+ (Number.Natural.+ m n) p
⊦ ∀m n p. Number.Natural.+ m n = Number.Natural.+ m p ⇔ n = p
⊦ ∀m n p.
Number.Natural.< (Number.Natural.+ m n) (Number.Natural.+ m p) ⇔
Number.Natural.< n p
⊦ ∀m n p.
Number.Natural.≤ (Number.Natural.+ m n) (Number.Natural.+ m p) ⇔
Number.Natural.≤ n p
⊦ ∀m n p.
Number.Natural.≤ (Number.Natural.+ m p) (Number.Natural.+ n p) ⇔
Number.Natural.≤ m n
⊦ ∀m n p.
Number.Natural.- (Number.Natural.+ m n) (Number.Natural.+ m p) =
Number.Natural.- n p
⊦ ∀m n p.
Number.Natural.< m n ∧ Number.Natural.≤ n p ⇒ Number.Natural.< m p
⊦ ∀m n p.
Number.Natural.≤ m n ∧ Number.Natural.< n p ⇒ Number.Natural.< m p
⊦ ∀m n p.
Number.Natural.≤ m n ∧ Number.Natural.≤ n p ⇒ Number.Natural.≤ m p
⊦ ∀P x. (∀y. P y ⇔ y = x) ⇒ (select) P = x
⊦ ∀P. (∀x. ∃y. P x y) ⇔ ∃y. ∀x. P x (y x)
⊦ ∀t1 t2. (if T then t1 else t2) = t1 ∧ (if F then t1 else t2) = t2
⊦ ∀w n.
Data.Word.shiftLeft w n =
Data.Word.fromNatural
(Number.Natural.*
(Number.Natural.exp
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero))
n) (Data.Word.toNatural w))
⊦ ∀w n.
Data.Word.shiftRight w n =
Data.Word.fromNatural
(Number.Natural.div (Data.Word.toNatural w)
(Number.Natural.exp
(Number.Numeral.bit0 (Number.Numeral.bit1 Number.Numeral.zero))
n))
⊦ ∀m n.
Number.Natural.* m n = Number.Numeral.zero ⇔
m = Number.Numeral.zero ∨ n = Number.Numeral.zero
⊦ ∀m n.
Number.Natural.+ m n = Number.Numeral.zero ⇔
m = Number.Numeral.zero ∧ n = Number.Numeral.zero
⊦ Data.List.length Data.List.[] = Number.Numeral.zero ∧
∀h t.
Data.List.length (Data.List.:: h t) =
Number.Natural.suc (Data.List.length t)
⊦ ∀P.
P Number.Numeral.zero ∧ (∀n. P n ⇒ P (Number.Natural.suc n)) ⇒ ∀n. P n
⊦ (∀t. ¬¬t ⇔ t) ∧ (¬T ⇔ F) ∧ (¬F ⇔ T)
⊦ ∀m n.
¬(n = Number.Numeral.zero) ⇒
(Number.Natural.div m n = Number.Numeral.zero ⇔ Number.Natural.< m n)
⊦ ∀m n.
Number.Natural.exp m n = Number.Numeral.zero ⇔
m = Number.Numeral.zero ∧ ¬(n = Number.Numeral.zero)
⊦ ∀m n i.
Number.Natural.< i n ⇒
Data.List.nth i (Data.List.interval m n) = Number.Natural.+ m i
⊦ ∀m n p.
Number.Natural.* m (Number.Natural.+ n p) =
Number.Natural.+ (Number.Natural.* m n) (Number.Natural.* m p)
⊦ ∀m n p.
Number.Natural.* m (Number.Natural.- n p) =
Number.Natural.- (Number.Natural.* m n) (Number.Natural.* m p)
⊦ ∀m n p.
Number.Natural.exp m (Number.Natural.+ n p) =
Number.Natural.* (Number.Natural.exp m n) (Number.Natural.exp m p)
⊦ ∀m n p.
Number.Natural.* (Number.Natural.+ m n) p =
Number.Natural.+ (Number.Natural.* m p) (Number.Natural.* n p)
⊦ ∀m n p.
Number.Natural.* (Number.Natural.- m n) p =
Number.Natural.- (Number.Natural.* m p) (Number.Natural.* n p)
⊦ ∀m n.
Number.Natural.mod
(Number.Natural.* (Number.Natural.mod m Data.Word.modulus)
(Number.Natural.mod n Data.Word.modulus)) Data.Word.modulus =
Number.Natural.mod (Number.Natural.* m n) Data.Word.modulus
⊦ ∀m n.
Number.Natural.mod
(Number.Natural.+ (Number.Natural.mod m Data.Word.modulus)
(Number.Natural.mod n Data.Word.modulus)) Data.Word.modulus =
Number.Natural.mod (Number.Natural.+ m n) Data.Word.modulus
⊦ ∀P Q. (∀x. P x ∧ Q x) ⇔ (∀x. P x) ∧ ∀x. Q x
⊦ ∀P Q. (∃x. P x ∨ Q x) ⇔ (∃x. P x) ∨ ∃x. Q x
⊦ ∀P Q. (∀x. P x) ∧ (∀x. Q x) ⇔ ∀x. P x ∧ Q x
⊦ ∀P Q. (∃x. P x) ∨ (∃x. Q x) ⇔ ∃x. P x ∨ Q x
⊦ ∀e f.
∃fn.
fn Number.Numeral.zero = e ∧
∀n. fn (Number.Natural.suc n) = f (fn n) n
⊦ ∀m n.
¬(n = Number.Numeral.zero) ⇒
Number.Natural.+ (Number.Natural.* (Number.Natural.div m n) n)
(Number.Natural.mod m n) = m
⊦ ∀P. P Data.List.[] ∧ (∀a0 a1. P a1 ⇒ P (Data.List.:: a0 a1)) ⇒ ∀x. P x
⊦ ∀m n p.
Number.Natural.* m n = Number.Natural.* m p ⇔
m = Number.Numeral.zero ∨ n = p
⊦ ∀m n p.
Number.Natural.≤ (Number.Natural.* m n) (Number.Natural.* m p) ⇔
m = Number.Numeral.zero ∨ Number.Natural.≤ n p
⊦ ∀m n p.
Number.Natural.≤ (Number.Natural.* m p) (Number.Natural.* n p) ⇔
Number.Natural.≤ m n ∨ p = Number.Numeral.zero
⊦ ∀f l i.
Number.Natural.< i (Data.List.length l) ⇒
Data.List.nth i (Data.List.map f l) = f (Data.List.nth i l)
⊦ ∀m n p.
Number.Natural.< (Number.Natural.* m n) (Number.Natural.* m p) ⇔
¬(m = Number.Numeral.zero) ∧ Number.Natural.< n p
⊦ (∀x. Data.List.replicate Number.Numeral.zero x = Data.List.[]) ∧
∀n x.
Data.List.replicate (Number.Natural.suc n) x =
Data.List.:: x (Data.List.replicate n x)
⊦ ∀x y a b. Data.Pair., x y = Data.Pair., a b ⇔ x = a ∧ y = b
⊦ ∀m n p q.
Number.Natural.< m p ∧ Number.Natural.< n q ⇒
Number.Natural.< (Number.Natural.+ m n) (Number.Natural.+ p q)
⊦ ∀m n p q.
Number.Natural.≤ m n ∧ Number.Natural.≤ p q ⇒
Number.Natural.≤ (Number.Natural.* m p) (Number.Natural.* n q)
⊦ ∀m n p q.
Number.Natural.≤ m p ∧ Number.Natural.≤ n q ⇒
Number.Natural.≤ (Number.Natural.+ m n) (Number.Natural.+ p q)
⊦ (∀m. Data.List.interval m Number.Numeral.zero = Data.List.[]) ∧
∀m n.
Data.List.interval m (Number.Natural.suc n) =
Data.List.:: m (Data.List.interval (Number.Natural.suc m) n)
⊦ (∀m.
Number.Natural.exp m Number.Numeral.zero =
Number.Numeral.bit1 Number.Numeral.zero) ∧
∀m n.
Number.Natural.exp m (Number.Natural.suc n) =
Number.Natural.* m (Number.Natural.exp m n)
⊦ ∀P c x y. P (if c then x else y) ⇔ (c ⇒ P x) ∧ (¬c ⇒ P y)
⊦ (∀l. Data.List.drop Number.Numeral.zero l = l) ∧
∀n h t.
Data.List.drop (Number.Natural.suc n) (Data.List.:: h t) =
Data.List.drop n t
⊦ ∀m n p.
¬(n = Number.Numeral.zero) ⇒
Number.Natural.mod (Number.Natural.* m (Number.Natural.mod p n)) n =
Number.Natural.mod (Number.Natural.* m p) n
⊦ ∀m n p.
¬(Number.Natural.* n p = Number.Numeral.zero) ⇒
Number.Natural.div (Number.Natural.div m n) p =
Number.Natural.div m (Number.Natural.* n p)
⊦ ∀m n p.
¬(Number.Natural.* n p = Number.Numeral.zero) ⇒
Number.Natural.mod (Number.Natural.mod m (Number.Natural.* n p)) n =
Number.Natural.mod m n
⊦ ∀n l i.
Number.Natural.≤ n (Data.List.length l) ∧ Number.Natural.< i n ⇒
Data.List.nth i (Data.List.take n l) = Data.List.nth i l
⊦ (∀m. Number.Natural.< m Number.Numeral.zero ⇔ F) ∧
∀m n.
Number.Natural.< m (Number.Natural.suc n) ⇔
m = n ∨ Number.Natural.< m n
⊦ (∀l. Data.List.@ Data.List.[] l = l) ∧
∀h t l.
Data.List.@ (Data.List.:: h t) l = Data.List.:: h (Data.List.@ t l)
⊦ ∀t1 t2. (¬(t1 ∧ t2) ⇔ ¬t1 ∨ ¬t2) ∧ (¬(t1 ∨ t2) ⇔ ¬t1 ∧ ¬t2)
⊦ (∀f. Data.List.map f Data.List.[] = Data.List.[]) ∧
∀f h t.
Data.List.map f (Data.List.:: h t) =
Data.List.:: (f h) (Data.List.map f t)
⊦ ∀m n p.
¬(Number.Natural.* n p = Number.Numeral.zero) ⇒
Number.Natural.mod (Number.Natural.div m n) p =
Number.Natural.div (Number.Natural.mod m (Number.Natural.* n p)) n
⊦ ∀k l m.
Data.List.nth k (Data.List.@ l m) =
if Number.Natural.< k (Data.List.length l) then Data.List.nth k l
else Data.List.nth (Number.Natural.- k (Data.List.length l)) m
⊦ (∀m. Number.Natural.≤ m Number.Numeral.zero ⇔ m = Number.Numeral.zero) ∧
∀m n.
Number.Natural.≤ m (Number.Natural.suc n) ⇔
m = Number.Natural.suc n ∨ Number.Natural.≤ m n
⊦ (∀h t. Data.List.nth Number.Numeral.zero (Data.List.:: h t) = h) ∧
∀h t n.
Data.List.nth (Number.Natural.suc n) (Data.List.:: h t) =
Data.List.nth n t
⊦ ∀t. ((T ⇔ t) ⇔ t) ∧ ((t ⇔ T) ⇔ t) ∧ ((F ⇔ t) ⇔ ¬t) ∧ ((t ⇔ F) ⇔ ¬t)
⊦ ∀l m.
Data.List.length l = Data.List.length m ∧
(∀i.
Number.Natural.< i (Data.List.length l) ⇒
Data.List.nth i l = Data.List.nth i m) ⇒ l = m
⊦ ∀m n q r.
m = Number.Natural.+ (Number.Natural.* q n) r ∧ Number.Natural.< r n ⇒
Number.Natural.div m n = q ∧ Number.Natural.mod m n = r
⊦ Data.Word.Bits.toWord Data.List.[] =
Data.Word.fromNatural Number.Numeral.zero ∧
∀h t.
Data.Word.Bits.toWord (Data.List.:: h t) =
if h then
Data.Word.+
(Data.Word.shiftLeft (Data.Word.Bits.toWord t)
(Number.Numeral.bit1 Number.Numeral.zero))
(Data.Word.fromNatural (Number.Numeral.bit1 Number.Numeral.zero))
else
Data.Word.shiftLeft (Data.Word.Bits.toWord t)
(Number.Numeral.bit1 Number.Numeral.zero)
⊦ ∀t. (T ∧ t ⇔ t) ∧ (t ∧ T ⇔ t) ∧ (F ∧ t ⇔ F) ∧ (t ∧ F ⇔ F) ∧ (t ∧ t ⇔ t)
⊦ ∀t. (T ∨ t ⇔ T) ∧ (t ∨ T ⇔ T) ∧ (F ∨ t ⇔ t) ∧ (t ∨ F ⇔ t) ∧ (t ∨ t ⇔ t)
⊦ ∀t. (T ⇒ t ⇔ t) ∧ (t ⇒ T ⇔ T) ∧ (F ⇒ t ⇔ T) ∧ (t ⇒ t ⇔ T) ∧ (t ⇒ F ⇔ ¬t)
⊦ ∀x m n.
Number.Natural.≤ (Number.Natural.exp x m) (Number.Natural.exp x n) ⇔
if x = Number.Numeral.zero then
m = Number.Numeral.zero ⇒ n = Number.Numeral.zero
else x = Number.Numeral.bit1 Number.Numeral.zero ∨ Number.Natural.≤ m n
⊦ ∀m n p.
Number.Natural.* m n = Number.Natural.* n m ∧
Number.Natural.* (Number.Natural.* m n) p =
Number.Natural.* m (Number.Natural.* n p) ∧
Number.Natural.* m (Number.Natural.* n p) =
Number.Natural.* n (Number.Natural.* m p)
⊦ ∀m n p.
Number.Natural.+ m n = Number.Natural.+ n m ∧
Number.Natural.+ (Number.Natural.+ m n) p =
Number.Natural.+ m (Number.Natural.+ n p) ∧
Number.Natural.+ m (Number.Natural.+ n p) =
Number.Natural.+ n (Number.Natural.+ m p)
⊦ ∀a b n.
¬(n = Number.Numeral.zero) ⇒
(Number.Natural.mod (Number.Natural.+ a b) n =
Number.Natural.+ (Number.Natural.mod a n) (Number.Natural.mod b n) ⇔
Number.Natural.div (Number.Natural.+ a b) n =
Number.Natural.+ (Number.Natural.div a n) (Number.Natural.div b n))
⊦ (∀n. Number.Natural.+ Number.Numeral.zero n = n) ∧
(∀m. Number.Natural.+ m Number.Numeral.zero = m) ∧
(∀m n.
Number.Natural.+ (Number.Natural.suc m) n =
Number.Natural.suc (Number.Natural.+ m n)) ∧
∀m n.
Number.Natural.+ m (Number.Natural.suc n) =
Number.Natural.suc (Number.Natural.+ m n)
⊦ (∀q. Data.Word.Bits.compare q Data.List.[] Data.List.[] ⇔ q) ∧
∀q h1 h2 t1 t2.
Data.Word.Bits.compare q (Data.List.:: h1 t1) (Data.List.:: h2 t2) ⇔
Data.Word.Bits.compare (¬h1 ∧ h2 ∨ ¬(h1 ∧ ¬h2) ∧ q) t1 t2
⊦ ∀p q r.
(p ∨ q ⇔ q ∨ p) ∧ ((p ∨ q) ∨ r ⇔ p ∨ q ∨ r) ∧ (p ∨ q ∨ r ⇔ q ∨ p ∨ r) ∧
(p ∨ p ⇔ p) ∧ (p ∨ p ∨ q ⇔ p ∨ q)
⊦ (∀n. Number.Natural.* Number.Numeral.zero n = Number.Numeral.zero) ∧
(∀m. Number.Natural.* m Number.Numeral.zero = Number.Numeral.zero) ∧
(∀n. Number.Natural.* (Number.Numeral.bit1 Number.Numeral.zero) n = n) ∧
(∀m. Number.Natural.* m (Number.Numeral.bit1 Number.Numeral.zero) = m) ∧
(∀m n.
Number.Natural.* (Number.Natural.suc m) n =
Number.Natural.+ (Number.Natural.* m n) n) ∧
∀m n.
Number.Natural.* m (Number.Natural.suc n) =
Number.Natural.+ m (Number.Natural.* m n)