src/Pure/Tools/codegen_simtype.ML
author wenzelm
Thu, 15 Jun 2006 23:08:58 +0200
changeset 19899 b7385ca02d79
parent 19884 a7be206d8655
child 20060 080ca1f8afd7
permissions -rw-r--r--
Fixed type/term variables and polymorphic term abbreviations.
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
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    32
    val (ty_abs, ty_rep) = (dest_fun o type_of) repm;
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
fun tactic_proof tac after_qed props thy =
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    60
  let
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    61
    val thms = Goal.prove_multi thy [] [] props (K tac);
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    62
  in
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    63
    thy
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    64
    |> after_qed thms
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    65
  end;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    66
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    67
in
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    68
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    69
val simtype = gen_e_simtype setup_proof;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    70
val simtype_i = gen_i_simtype setup_proof;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    71
val prove_simtype = gen_i_simtype o tactic_proof;
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    72
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    73
end; (*local*)
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    74
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    75
local
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    76
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    77
structure P = OuterParse
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    78
and K = OuterKeyword
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    79
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    80
in
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    81
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    82
val simtypeK = "code_simtype"
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    83
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    84
val simtypeP =
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    85
  OuterSyntax.command simtypeK "simulate type in executable code" K.thy_goal (
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    86
    (P.term -- P.term -- P.term -- P.term -- P.term)
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    87
    >> (fn ((((raw_repm, raw_absm), raw_repi), raw_absi), raw_repe) =>
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    88
          (Toplevel.print oo Toplevel.theory_to_proof)
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    89
            (simtype (raw_repm, raw_absm) (raw_repi, raw_absi) raw_repe))
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    90
  );
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    91
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    92
val _ = OuterSyntax.add_parsers [simtypeP];
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    93
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    94
end; (*local*)
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    95
a7be206d8655 improvements in code generator
haftmann
parents:
diff changeset
    96
end; (*struct*)