src/Pure/Tools/codegen_simtype.ML
author haftmann
Wed, 12 Jul 2006 17:00:22 +0200
changeset 20105 454f4be984b7
parent 20060 080ca1f8afd7
child 20204 2842450d0eee
permissions -rw-r--r--
adaptions in codegen
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19884
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
     1
(*  Title:      Pure/Tools/codegen_simtype.ML
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
     2
    ID:         $Id$
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
     3
    Author:     Florian Haftmann, TU Muenchen
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
     4
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
     5
Axiomatic extension of code generator: implement ("simulate") types
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
     6
by other type expressions. Requires user proof but does not use
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
     7
the proven theorems!
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
     8
*)
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
     9
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    10
signature CODEGEN_SIMTYPE =
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    11
sig
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    12
end;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    13
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    14
structure CodegenSimtype: CODEGEN_SIMTYPE =
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    15
struct
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    16
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    17
local
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    18
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    19
fun gen_simtype prep_term do_proof (raw_repm, raw_absm) (raw_repi, raw_absi) raw_repe thy =
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    20
  let
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    21
    val repm = prep_term thy raw_repm;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    22
    val absm = prep_term thy raw_absm;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    23
    val repi = prep_term thy raw_repi;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    24
    val absi = prep_term thy raw_absi;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    25
    val (repe, repe_ty) = (dest_Const o prep_term thy) raw_repe;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    26
    val repe_ty' = (snd o strip_type) repe_ty;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    27
    fun dest_fun (ty as Type (_, [ty1, ty2])) =
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    28
          if is_funtype ty then (ty1, ty2)
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    29
          else raise TYPE ("dest_fun", [ty], [])
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    30
      | dest_fun ty = raise TYPE ("dest_fun", [ty], []);
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    31
    val PROP = ObjectLogic.ensure_propT thy
20105
454f4be984b7 adaptions in codegen
haftmann
parents: 20060
diff changeset
    32
    val (ty_abs, ty_rep) = (dest_fun o fastype_of) repm;
19884
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    33
    val (tyco_abs, ty_parms) = dest_Type ty_abs;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    34
    val _ = if exists (fn TFree _ => false | _ => true) ty_parms then raise TYPE ("no TFree", ty_parms, []) else ();
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    35
    val repv = Free ("x", ty_rep);
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    36
    val absv = Free ("x", ty_abs);
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    37
    val rep_mor = Logic.mk_implies
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    38
      (PROP (absi $ absv), Logic.mk_equals (absm $ (repm $ absv), absv));
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    39
    val abs_mor = Logic.mk_implies
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    40
      (PROP (repi $ repv), PROP (Const (repe, ty_rep --> ty_rep --> repe_ty') $ (repm $ (absm $ repv)) $ repv));
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    41
    val rep_inv = Logic.mk_implies
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    42
      (PROP (absi $ absv), PROP (repi $ (repm $ absv)));
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    43
    val abs_inv = Logic.mk_implies
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    44
      (PROP (repi $ repv), PROP (absi $ (absm $ repv)));
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    45
  in
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    46
    thy
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    47
    |> do_proof (K I) [rep_mor, abs_mor, rep_inv, abs_inv]
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    48
  end;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    49
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    50
fun gen_e_simtype do_proof = gen_simtype Sign.read_term do_proof;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    51
fun gen_i_simtype do_proof = gen_simtype Sign.cert_term do_proof;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    52
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    53
fun setup_proof after_qed props thy =
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    54
  thy
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    55
  |> ProofContext.init
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    56
  |> Proof.theorem_i PureThy.internalK NONE after_qed NONE ("", [])
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    57
       (map (fn t => (("", []), [(t, [])])) props);
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    58
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    59
in
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    60
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    61
val simtype = gen_e_simtype setup_proof;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    62
val simtype_i = gen_i_simtype setup_proof;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    63
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    64
end; (*local*)
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    65
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    66
local
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    67
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    68
structure P = OuterParse
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    69
and K = OuterKeyword
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    70
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    71
in
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    72
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    73
val simtypeK = "code_simtype"
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    74
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    75
val simtypeP =
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    76
  OuterSyntax.command simtypeK "simulate type in executable code" K.thy_goal (
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    77
    (P.term -- P.term -- P.term -- P.term -- P.term)
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    78
    >> (fn ((((raw_repm, raw_absm), raw_repi), raw_absi), raw_repe) =>
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    79
          (Toplevel.print oo Toplevel.theory_to_proof)
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    80
            (simtype (raw_repm, raw_absm) (raw_repi, raw_absi) raw_repe))
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    81
  );
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    82
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    83
val _ = OuterSyntax.add_parsers [simtypeP];
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    84
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    85
end; (*local*)
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    86
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    87
end; (*struct*)