doc-src/Codegen/Thy/Refinement.thy
author haftmann
Mon, 16 Aug 2010 10:32:14 +0200
changeset 38437 ffb1c5bf0425
parent 38405 7935b334893e
child 38451 4c065e97ecee
permissions -rw-r--r--
adaptation to new outline
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38405
7935b334893e sketch of new outline
haftmann
parents:
diff changeset
     1
theory Refinement
7935b334893e sketch of new outline
haftmann
parents:
diff changeset
     2
imports Setup
7935b334893e sketch of new outline
haftmann
parents:
diff changeset
     3
begin
7935b334893e sketch of new outline
haftmann
parents:
diff changeset
     4
7935b334893e sketch of new outline
haftmann
parents:
diff changeset
     5
section {* Program and datatype refinement \label{sec:refinement} *}
7935b334893e sketch of new outline
haftmann
parents:
diff changeset
     6
38437
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
     7
subsection {* Datatypes \label{sec:datatypes} *}
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
     8
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
     9
text {*
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    10
  Conceptually, any datatype is spanned by a set of
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    11
  \emph{constructors} of type @{text "\<tau> = \<dots> \<Rightarrow> \<kappa> \<alpha>\<^isub>1 \<dots> \<alpha>\<^isub>n"} where @{text
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    12
  "{\<alpha>\<^isub>1, \<dots>, \<alpha>\<^isub>n}"} is exactly the set of \emph{all} type variables in
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    13
  @{text "\<tau>"}.  The HOL datatype package by default registers any new
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    14
  datatype in the table of datatypes, which may be inspected using the
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    15
  @{command print_codesetup} command.
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    16
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    17
  In some cases, it is appropriate to alter or extend this table.  As
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    18
  an example, we will develop an alternative representation of the
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    19
  queue example given in \secref{sec:queue_example}.  The amortised
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    20
  representation is convenient for generating code but exposes its
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    21
  \qt{implementation} details, which may be cumbersome when proving
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    22
  theorems about it.  Therefore, here is a simple, straightforward
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    23
  representation of queues:
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    24
*}
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    25
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    26
datatype %quote 'a queue = Queue "'a list"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    27
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    28
definition %quote empty :: "'a queue" where
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    29
  "empty = Queue []"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    30
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    31
primrec %quote enqueue :: "'a \<Rightarrow> 'a queue \<Rightarrow> 'a queue" where
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    32
  "enqueue x (Queue xs) = Queue (xs @ [x])"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    33
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    34
fun %quote dequeue :: "'a queue \<Rightarrow> 'a option \<times> 'a queue" where
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    35
    "dequeue (Queue []) = (None, Queue [])"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    36
  | "dequeue (Queue (x # xs)) = (Some x, Queue xs)"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    37
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    38
text {*
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    39
  \noindent This we can use directly for proving;  for executing,
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    40
  we provide an alternative characterisation:
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    41
*}
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    42
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    43
definition %quote AQueue :: "'a list \<Rightarrow> 'a list \<Rightarrow> 'a queue" where
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    44
  "AQueue xs ys = Queue (ys @ rev xs)"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    45
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    46
code_datatype %quote AQueue
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    47
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    48
text {*
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    49
  \noindent Here we define a \qt{constructor} @{const "AQueue"} which
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    50
  is defined in terms of @{text "Queue"} and interprets its arguments
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    51
  according to what the \emph{content} of an amortised queue is supposed
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    52
  to be.  Equipped with this, we are able to prove the following equations
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    53
  for our primitive queue operations which \qt{implement} the simple
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    54
  queues in an amortised fashion:
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    55
*}
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    56
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    57
lemma %quote empty_AQueue [code]:
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    58
  "empty = AQueue [] []"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    59
  unfolding AQueue_def empty_def by simp
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    60
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    61
lemma %quote enqueue_AQueue [code]:
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    62
  "enqueue x (AQueue xs ys) = AQueue (x # xs) ys"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    63
  unfolding AQueue_def by simp
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    64
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    65
lemma %quote dequeue_AQueue [code]:
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    66
  "dequeue (AQueue xs []) =
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    67
    (if xs = [] then (None, AQueue [] [])
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    68
    else dequeue (AQueue [] (rev xs)))"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    69
  "dequeue (AQueue xs (y # ys)) = (Some y, AQueue xs ys)"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    70
  unfolding AQueue_def by simp_all
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    71
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    72
text {*
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    73
  \noindent For completeness, we provide a substitute for the
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    74
  @{text case} combinator on queues:
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    75
*}
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    76
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    77
lemma %quote queue_case_AQueue [code]:
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    78
  "queue_case f (AQueue xs ys) = f (ys @ rev xs)"
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    79
  unfolding AQueue_def by simp
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    80
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    81
text {*
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    82
  \noindent The resulting code looks as expected:
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    83
*}
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    84
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    85
text %quote {*@{code_stmts empty enqueue dequeue (SML)}*}
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    86
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    87
text {*
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    88
  \noindent From this example, it can be glimpsed that using own
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    89
  constructor sets is a little delicate since it changes the set of
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    90
  valid patterns for values of that type.  Without going into much
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    91
  detail, here some practical hints:
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    92
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    93
  \begin{itemize}
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    94
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    95
    \item When changing the constructor set for datatypes, take care
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    96
      to provide alternative equations for the @{text case} combinator.
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    97
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    98
    \item Values in the target language need not to be normalised --
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
    99
      different values in the target language may represent the same
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   100
      value in the logic.
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   101
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   102
    \item Usually, a good methodology to deal with the subtleties of
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   103
      pattern matching is to see the type as an abstract type: provide
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   104
      a set of operations which operate on the concrete representation
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   105
      of the type, and derive further operations by combinations of
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   106
      these primitive ones, without relying on a particular
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   107
      representation.
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   108
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   109
  \end{itemize}
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   110
*}
ffb1c5bf0425 adaptation to new outline
haftmann
parents: 38405
diff changeset
   111
38405
7935b334893e sketch of new outline
haftmann
parents:
diff changeset
   112
end