src/HOL/ex/CodeOperationalEquality.thy
author krauss
Wed, 13 Sep 2006 12:05:50 +0200
changeset 20523 36a59e5d0039
parent 20453 855f07fabd76
permissions -rw-r--r--
Major update to function package, including new syntax and the (only theoretical) ability to handle local contexts.
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
20435
haftmann
parents: 20427
diff changeset
    38
    fun add_eq (Const ("op =", ty)) =
haftmann
parents: 20427
diff changeset
    39
          fold (insert (eq_fst (op = : indexname * indexname -> bool)))
haftmann
parents: 20427
diff changeset
    40
            (Term.add_tvarsT ty [])
haftmann
parents: 20427
diff changeset
    41
      | add_eq _ =
haftmann
parents: 20427
diff changeset
    42
          I
haftmann
parents: 20427
diff changeset
    43
    val eqs = fold (fold_aterms add_eq o Thm.prop_of) thms [];
20427
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    44
    val instT = map (fn (v_i, sort) =>
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    45
      (Thm.ctyp_of thy (TVar (v_i, sort)),
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    46
         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
    47
  in
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    48
    thms
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    49
    |> map (Thm.instantiate (instT, []))
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    50
  end;
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    51
*}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    52
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    53
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    54
subsection {* codetypes hook *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    55
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    56
setup {*
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    57
let
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    58
  fun add_eq_instance specs =
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    59
    DatatypeCodegen.prove_codetypes_arities
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    60
      (K (ClassPackage.intro_classes_tac []))
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    61
      (map (fn (tyco, (is_dt, _)) => (tyco, is_dt)) specs)
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    62
      [class_eq] ((K o K o K) []);
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    63
  (* fun add_eq_thms dtco thy =
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    64
    let
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    65
      val thms =
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    66
        DatatypeCodegen.get_eq thy dtco
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    67
        |> 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
    68
        |> constrain_op_eq thy
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    69
        |> map (Tactic.rewrite_rule [eq_def_sym])
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    70
    in fold CodegenTheorems.add_fun thms thy end; *)
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    71
  fun hook dtcos =
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    72
    add_eq_instance dtcos (* #> fold add_eq_thms dtcos *);
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    73
in
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    74
  DatatypeCodegen.add_codetypes_hook_bootstrap hook
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    75
end
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    76
*}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    77
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    78
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    79
subsection {* extractor *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    80
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    81
setup {*
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    82
let
20435
haftmann
parents: 20427
diff changeset
    83
  val lift_not_thm = thm "HOL.Eq_FalseI";
haftmann
parents: 20427
diff changeset
    84
  val lift_thm = thm "HOL.eq_reflection";
haftmann
parents: 20427
diff changeset
    85
  val eq_def_thm = Thm.symmetric (thm "eq_def");
20427
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    86
  fun get_eq_thms thy tyco = case DatatypePackage.get_datatype thy tyco
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    87
   of SOME _ => DatatypeCodegen.get_eq thy tyco
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    88
    | NONE => case TypedefCodegen.get_triv_typedef thy tyco
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    89
       of SOME (_ ,(_, thm)) => [thm]
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    90
        | NONE => [];
20435
haftmann
parents: 20427
diff changeset
    91
  fun get_eq_thms_eq thy ("CodeOperationalEquality.eq", ty) = (case strip_type ty
20427
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    92
       of (Type (tyco, _) :: _, _) =>
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
    93
             get_eq_thms thy tyco
20435
haftmann
parents: 20427
diff changeset
    94
             |> map (perhaps (try (fn thm => lift_not_thm OF [thm])))
haftmann
parents: 20427
diff changeset
    95
             |> map (perhaps (try (fn thm => lift_thm OF [thm])))
haftmann
parents: 20427
diff changeset
    96
             (*|> tap (writeln o cat_lines o map string_of_thm)*)
haftmann
parents: 20427
diff changeset
    97
             |> constrain_op_eq thy
haftmann
parents: 20427
diff changeset
    98
             (*|> tap (writeln o cat_lines o map string_of_thm)*)
haftmann
parents: 20427
diff changeset
    99
             |> map (Tactic.rewrite_rule [eq_def_thm])
haftmann
parents: 20427
diff changeset
   100
             (*|> tap (writeln o cat_lines o map string_of_thm)*)
20427
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   101
        | _ => [])
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   102
    | get_eq_thms_eq _ _ = [];
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   103
in
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   104
  CodegenTheorems.add_fun_extr get_eq_thms_eq
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   105
end
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   106
*}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   107
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   108
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   109
subsection {* integers *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   110
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   111
definition
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   112
  "eq_integer (k\<Colon>int) l = (k = l)"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   113
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   114
instance int :: eq ..
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   115
20523
36a59e5d0039 Major update to function package, including new syntax and the (only theoretical)
krauss
parents: 20453
diff changeset
   116
lemma [code func]:
20427
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   117
  "eq k l = eq_integer k l"
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   118
unfolding eq_integer_def eq_def ..
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   119
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   120
code_const eq_integer
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   121
  (SML infixl 6 "=")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   122
  (Haskell infixl 4 "==")
20427
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   123
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   124
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   125
subsection {* codegenerator setup *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   126
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   127
setup {*
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   128
  CodegenTheorems.add_preproc constrain_op_eq
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   129
*}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   130
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   131
declare eq_def [symmetric, code inline]
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   132
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   133
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   134
subsection {* haskell setup *}
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   135
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   136
code_class eq
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   137
  (Haskell "Eq" where eq \<equiv> "(==)")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   138
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   139
code_instance eq :: bool and eq :: unit and eq :: *
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   140
  and eq :: option and eq :: list and eq :: char and eq :: int
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   141
  (Haskell - and - and - and - and - and - and -)
20427
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   142
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   143
code_const "eq \<Colon> bool \<Rightarrow> bool \<Rightarrow> bool"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   144
  (Haskell infixl 4 "==")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   145
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   146
code_const "eq \<Colon> unit \<Rightarrow> unit \<Rightarrow> bool"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   147
  (Haskell infixl 4 "==")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   148
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   149
code_const "eq \<Colon> 'a\<Colon>eq \<times> 'b\<Colon>eq \<Rightarrow> 'a \<times> 'b \<Rightarrow> bool"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   150
  (Haskell infixl 4 "==")
20427
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   151
20453
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   152
code_const "eq \<Colon> 'a\<Colon>eq option \<Rightarrow> 'a option \<Rightarrow> bool"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   153
  (Haskell infixl 4 "==")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   154
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   155
code_const "eq \<Colon> 'a\<Colon>eq list \<Rightarrow> 'a list \<Rightarrow> bool"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   156
  (Haskell infixl 4 "==")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   157
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   158
code_const "eq \<Colon> char \<Rightarrow> char \<Rightarrow> bool"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   159
  (Haskell infixl 4 "==")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   160
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   161
code_const "eq \<Colon> int \<Rightarrow> int \<Rightarrow> bool"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   162
  (Haskell infixl 4 "==")
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   163
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   164
code_const "eq"
855f07fabd76 final syntax for some Isar code generator keywords
haftmann
parents: 20435
diff changeset
   165
  (Haskell infixl 4 "==")
20427
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   166
0b102b4182de added and refined some exmples
haftmann
parents:
diff changeset
   167
end