src/HOL/ex/CodeOperationalEquality.thy
author haftmann
Tue, 29 Aug 2006 14:31:14 +0200
changeset 20427 0b102b4182de
child 20435 d2a30fed7596
permissions -rw-r--r--
added and refined some exmples
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20427
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
     1
(*  ID:         $Id$
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
     2
    Author:     Florian Haftmann, TU Muenchen
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
     3
*)
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
     4
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
     5
header {* Operational equality for code generation *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
     6
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
     7
theory CodeOperationalEquality
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
     8
imports Main
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
     9
begin
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    10
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    11
section {* Operational equality for code generation *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    12
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    13
subsection {* eq class *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    14
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    15
class eq =
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    16
  fixes eq :: "'a \<Rightarrow> 'a \<Rightarrow> bool"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    17
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    18
defs
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    19
  eq_def: "eq x y == (x = y)"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    20
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    21
ML {*
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    22
local
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    23
  val thy = the_context ();
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    24
  val const_eq = Sign.intern_const thy "eq";
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    25
  val type_bool = Type (Sign.intern_type thy "bool", []);
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    26
in
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    27
  val eq_def_sym = Thm.symmetric (thm "eq_def");
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    28
  val class_eq = Sign.intern_class thy "eq";
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    29
end
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    30
*}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    31
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    32
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    33
subsection {* preprocessor *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    34
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    35
ML {*
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    36
fun constrain_op_eq thy thms =
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    37
  let
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    38
    fun dest_eq (Const ("op =", ty)) =
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    39
          (SOME o hd o fst o strip_type) ty
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    40
      | dest_eq _ = NONE
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    41
    fun eqs_of t =
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    42
      fold_aterms (fn t => case dest_eq t
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    43
       of SOME (TVar v_sort) => cons v_sort
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    44
        | _ => I) t [];
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    45
    val eqs = maps (eqs_of o Thm.prop_of) thms;
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    46
    val instT = map (fn (v_i, sort) =>
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    47
      (Thm.ctyp_of thy (TVar (v_i, sort)),
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    48
         Thm.ctyp_of thy (TVar (v_i, Sorts.inter_sort (Sign.classes_of thy) (sort, [class_eq]))))) eqs;
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    49
  in
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    50
    thms
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    51
    |> map (Thm.instantiate (instT, []))
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    52
  end;
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    53
*}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    54
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    55
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    56
subsection {* codetypes hook *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    57
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    58
setup {*
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    59
let
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    60
  fun add_eq_instance specs =
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    61
    DatatypeCodegen.prove_codetypes_arities
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    62
      (K (ClassPackage.intro_classes_tac []))
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    63
      (map (fn (tyco, (is_dt, _)) => (tyco, is_dt)) specs)
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    64
      [class_eq] ((K o K o K) []);
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    65
  (* fun add_eq_thms dtco thy =
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    66
    let
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    67
      val thms =
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    68
        DatatypeCodegen.get_eq thy dtco
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    69
        |> maps ((#mk o #mk_rews o snd o MetaSimplifier.rep_ss o Simplifier.simpset_of) thy)
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    70
        |> constrain_op_eq thy
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    71
        |> map (Tactic.rewrite_rule [eq_def_sym])
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    72
    in fold CodegenTheorems.add_fun thms thy end; *)
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    73
  fun hook dtcos =
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    74
    add_eq_instance dtcos (* #> fold add_eq_thms dtcos *);
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    75
in
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    76
  DatatypeCodegen.add_codetypes_hook_bootstrap hook
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    77
end
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    78
*}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    79
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    80
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    81
subsection {* extractor *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    82
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    83
setup {*
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    84
let
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    85
  fun get_eq_thms thy tyco = case DatatypePackage.get_datatype thy tyco
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    86
   of SOME _ => DatatypeCodegen.get_eq thy tyco
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    87
    | NONE => case TypedefCodegen.get_triv_typedef thy tyco
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    88
       of SOME (_ ,(_, thm)) => [thm]
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    89
        | NONE => [];
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    90
  fun get_eq_thms_eq thy ("OperationalEquality.eq", ty) = (case strip_type ty
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    91
       of (Type (tyco, _) :: _, _) =>
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    92
             get_eq_thms thy tyco
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    93
        | _ => [])
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    94
    | get_eq_thms_eq _ _ = [];
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    95
in
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    96
  CodegenTheorems.add_fun_extr get_eq_thms_eq
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    97
end
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    98
*}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    99
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   100
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   101
subsection {* integers *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   102
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   103
definition
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   104
  "eq_integer (k\<Colon>int) l = (k = l)"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   105
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   106
instance int :: eq ..
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   107
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   108
lemma [code fun]:
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   109
  "eq k l = eq_integer k l"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   110
unfolding eq_integer_def eq_def ..
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   111
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   112
code_constapp eq_integer
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   113
  ml (infixl 6 "=")
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   114
  haskell (infixl 4 "==")
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   115
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   116
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   117
subsection {* codegenerator setup *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   118
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   119
setup {*
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   120
  CodegenTheorems.add_preproc constrain_op_eq
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   121
*}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   122
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   123
declare eq_def [symmetric, code inline]
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   124
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   125
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   126
subsection {* haskell setup *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   127
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   128
code_class eq
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   129
  haskell "Eq" (eq "(==)")
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   130
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   131
code_instance
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   132
  (eq :: bool) haskell
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   133
  (eq :: unit) haskell
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   134
  (eq :: *) haskell
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   135
  (eq :: option) haskell
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   136
  (eq :: list) haskell
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   137
  (eq :: char) haskell
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   138
  (eq :: int) haskell
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   139
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   140
code_constapp
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   141
  "eq"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   142
    haskell (infixl 4 "==")
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   143
  "eq \<Colon> bool \<Rightarrow> bool \<Rightarrow> bool"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   144
    haskell (infixl 4 "==")
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   145
  "eq \<Colon> unit \<Rightarrow> unit \<Rightarrow> bool"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   146
    haskell (infixl 4 "==")
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   147
  "eq \<Colon> 'a\<Colon>eq \<times> 'b\<Colon>eq \<Rightarrow> 'a \<times> 'b \<Rightarrow> bool"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   148
    haskell (infixl 4 "==")
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   149
  "eq \<Colon> 'a\<Colon>eq option \<Rightarrow> 'a option \<Rightarrow> bool"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   150
    haskell (infixl 4 "==")
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   151
  "eq \<Colon> 'a\<Colon>eq list \<Rightarrow> 'a list \<Rightarrow> bool"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   152
    haskell (infixl 4 "==")
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   153
  "eq \<Colon> char \<Rightarrow> char \<Rightarrow> bool"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   154
    haskell (infixl 4 "==")
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   155
  "eq \<Colon> int \<Rightarrow> int \<Rightarrow> bool"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   156
    haskell (infixl 4 "==")
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   157
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   158
end