src/HOL/ex/Adder.thy
author krauss
Thu, 17 May 2007 22:33:41 +0200
changeset 22999 c1ce129e6f9c
parent 21404 eb85850d3eb7
child 23477 f4b83f03cac9
permissions -rw-r--r--
Added unification case study (using new function package)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
     1
(*  Title:      HOL/ex/Adder.thy
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
     2
    ID:         $Id$
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
     3
    Author:     Sergey Tverdyshev (Universitaet des Saarlandes)
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
     4
*)
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
     5
17388
495c799df31d tuned headers etc.;
wenzelm
parents: 16417
diff changeset
     6
header {* Implementation of carry chain incrementor and adder *}
14569
78b75a9eec01 Added ex/Exceptions.thy
nipkow
parents: 14494
diff changeset
     7
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 15002
diff changeset
     8
theory Adder imports Main Word begin
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
     9
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    10
lemma [simp]: "bv_to_nat [b] = bitval b"
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    11
  by (simp add: bv_to_nat_helper)
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    12
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    13
lemma bv_to_nat_helper':
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    14
    "bv \<noteq> [] ==> bv_to_nat bv = bitval (hd bv) * 2 ^ (length bv - 1) + bv_to_nat (tl bv)"
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    15
  by (cases bv) (simp_all add: bv_to_nat_helper)
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    16
19736
wenzelm
parents: 17388
diff changeset
    17
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 20811
diff changeset
    18
  half_adder :: "[bit, bit] => bit list" where
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    19
  "half_adder a b = [a bitand b, a bitxor b]"
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    20
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    21
lemma half_adder_correct: "bv_to_nat (half_adder a b) = bitval a + bitval b"
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    22
  apply (simp add: half_adder_def)
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    23
  apply (cases a, auto)
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    24
  apply (cases b, auto)
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    25
  done
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    26
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    27
lemma [simp]: "length (half_adder a b) = 2"
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    28
  by (simp add: half_adder_def)
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    29
19736
wenzelm
parents: 17388
diff changeset
    30
definition
21404
eb85850d3eb7 more robust syntax for definition/abbreviation/notation;
wenzelm
parents: 20811
diff changeset
    31
  full_adder :: "[bit, bit, bit] => bit list" where
19736
wenzelm
parents: 17388
diff changeset
    32
  "full_adder a b c =
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    33
      (let x = a bitxor b in [a bitand b bitor c bitand x, x bitxor c])"
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    34
15002
paulson
parents: 14569
diff changeset
    35
lemma full_adder_correct:
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    36
    "bv_to_nat (full_adder a b c) = bitval a + bitval b + bitval c"
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    37
  apply (simp add: full_adder_def Let_def)
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    38
  apply (cases a, auto)
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    39
  apply (case_tac [!] b, auto)
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    40
  apply (case_tac [!] c, auto)
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    41
  done
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    42
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    43
lemma [simp]: "length (full_adder a b c) = 2"
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    44
  by (simp add: full_adder_def Let_def)
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    45
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    46
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    47
subsection {* Carry chain incrementor *}
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    48
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    49
consts
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    50
  carry_chain_inc :: "[bit list, bit] => bit list"
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    51
primrec
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    52
  "carry_chain_inc [] c = [c]"
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    53
  "carry_chain_inc (a#as) c =
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    54
    (let chain = carry_chain_inc as c
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    55
     in half_adder a (hd chain) @ tl chain)"
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    56
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    57
lemma cci_nonnull: "carry_chain_inc as c \<noteq> []"
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    58
  by (cases as) (auto simp add: Let_def half_adder_def)
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    59
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    60
lemma cci_length [simp]: "length (carry_chain_inc as c) = length as + 1"
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    61
  by (induct as) (simp_all add: Let_def)
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    62
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    63
lemma cci_correct: "bv_to_nat (carry_chain_inc as c) = bv_to_nat as + bitval c"
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    64
  apply (induct as)
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    65
   apply (cases c, simp_all add: Let_def bv_to_nat_dist_append)
15002
paulson
parents: 14569
diff changeset
    66
  apply (simp add: half_adder_correct bv_to_nat_helper' [OF cci_nonnull]
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    67
    ring_distrib bv_to_nat_helper)
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    68
  done
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    69
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    70
consts
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    71
  carry_chain_adder :: "[bit list, bit list, bit] => bit list"
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    72
primrec
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    73
  "carry_chain_adder [] bs c = [c]"
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    74
  "carry_chain_adder (a # as) bs c =
15002
paulson
parents: 14569
diff changeset
    75
     (let chain = carry_chain_adder as (tl bs) c
paulson
parents: 14569
diff changeset
    76
      in  full_adder a (hd bs) (hd chain) @ tl chain)"
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    77
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    78
lemma cca_nonnull: "carry_chain_adder as bs c \<noteq> []"
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    79
  by (cases as) (auto simp add: full_adder_def Let_def)
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    80
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    81
lemma cca_length: "length as = length bs \<Longrightarrow>
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    82
    length (carry_chain_adder as bs c) = Suc (length bs)"
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    83
  by (induct as arbitrary: bs) (auto simp add: Let_def)
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
    84
20811
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    85
theorem cca_correct:
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    86
  "length as = length bs \<Longrightarrow>
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    87
    bv_to_nat (carry_chain_adder as bs c) =
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    88
    bv_to_nat as + bv_to_nat bs + bitval c"
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    89
proof (induct as arbitrary: bs)
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    90
  case Nil
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    91
  then show ?case by simp
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    92
next
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    93
  case (Cons a as xs)
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    94
  note ind = Cons.hyps
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    95
  from Cons.prems have len: "Suc (length as) = length xs" by simp
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    96
  show ?case
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    97
  proof (cases xs)
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    98
    case Nil
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
    99
    with len show ?thesis by simp
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
   100
  next
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
   101
    case (Cons b bs)
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
   102
    with len have len': "length as = length bs" by simp
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
   103
    then have "bv_to_nat (carry_chain_adder as bs c) = bv_to_nat as + bv_to_nat bs + bitval c"
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
   104
      by (rule ind)
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
   105
    with len' and Cons
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
   106
    show ?thesis
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
   107
      apply (simp add: Let_def)
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
   108
      apply (subst bv_to_nat_dist_append)
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
   109
      apply (simp add: full_adder_correct bv_to_nat_helper' [OF cca_nonnull]
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
   110
        ring_distrib bv_to_nat_helper cca_length)
eccbfaf2bc0e tuned proofs;
wenzelm
parents: 20217
diff changeset
   111
      done
14494
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
   112
  qed
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
   113
qed
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
   114
48ae8d678d88 Added bitvector library (Word) to HOL/Library and a theory using it (Adder)
skalberg
parents:
diff changeset
   115
end