Package word-bits-thm: word-bits-thm

Information

nameword-bits-thm
version1.1
descriptionword-bits-thm
authorJoe Hurd <joe@gilith.com>
licenseMIT
provenanceHOL Light theory extracted on 2011-03-17
showData.Bool

Files

Theorems

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))

Input Type Operators

Input Constants

Assumptions

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)