src/HOL/Tools/quickcheck_record.ML
author haftmann
Tue, 17 Aug 2010 15:13:16 +0200
changeset 38528 bbaaaf6f1cbe
parent 38399 04d220477074
permissions -rw-r--r--
eliminated typecopy interpretation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38397
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
     1
(*  Title:      HOL/Tools/quickcheck_record.ML
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
     2
    Author:     Florian Haftmann, TU Muenchen
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
     3
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
     4
Quickcheck generators for records.
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
     5
*)
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
     6
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
     7
signature QUICKCHECK_RECORD =
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
     8
sig
38528
bbaaaf6f1cbe eliminated typecopy interpretation
haftmann
parents: 38399
diff changeset
     9
  val ensure_random_typecopy: string -> (string * sort) list -> string
bbaaaf6f1cbe eliminated typecopy interpretation
haftmann
parents: 38399
diff changeset
    10
    -> typ -> theory -> theory
38397
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    11
end;
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    12
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    13
structure Quickcheck_Record : QUICKCHECK_RECORD =
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    14
struct
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    15
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    16
fun termifyT T = HOLogic.mk_prodT (T, @{typ "unit => term"})
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    17
val size = @{term "i::code_numeral"};
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    18
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    19
fun mk_random_typecopy tyco vs constr T' thy =
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    20
  let
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    21
    val mk_const = curry (Sign.mk_const thy);
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    22
    val Ts = map TFree vs;  
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    23
    val T = Type (tyco, Ts);
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    24
    val Tm = termifyT T;
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    25
    val Tm' = termifyT T';
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    26
    val v = "x";
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    27
    val t_v = Free (v, Tm');
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    28
    val t_constr = Const (constr, T' --> T);
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    29
    val lhs = HOLogic.mk_random T size;
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    30
    val rhs = HOLogic.mk_ST [((HOLogic.mk_random T' size, @{typ Random.seed}), SOME (v, Tm'))]
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    31
      (HOLogic.mk_return Tm @{typ Random.seed}
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    32
      (mk_const "Code_Evaluation.valapp" [T', T]
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    33
        $ HOLogic.mk_prod (t_constr, Abs ("u", @{typ unit}, HOLogic.reflect_term t_constr)) $ t_v))
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    34
      @{typ Random.seed} (SOME Tm, @{typ Random.seed});
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    35
    val eq = HOLogic.mk_Trueprop (HOLogic.mk_eq (lhs, rhs));
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    36
  in   
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    37
    thy
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    38
    |> Class.instantiation ([tyco], vs, @{sort random})
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    39
    |> `(fn lthy => Syntax.check_term lthy eq)
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    40
    |-> (fn eq => Specification.definition (NONE, (apfst Binding.conceal Attrib.empty_binding, eq)))
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    41
    |> snd
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    42
    |> Class.prove_instantiation_exit (K (Class.intro_classes_tac []))
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    43
  end;
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    44
38528
bbaaaf6f1cbe eliminated typecopy interpretation
haftmann
parents: 38399
diff changeset
    45
fun ensure_random_typecopy tyco raw_vs constr raw_T thy =
38397
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    46
  let
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    47
    val constrain = curry (Sorts.inter_sort (Sign.classes_of thy));
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    48
    val T = map_atyps (fn TFree (v, sort) =>
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    49
      TFree (v, constrain sort @{sort random})) raw_T;
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    50
    val vs' = Term.add_tfreesT T [];
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    51
    val vs = map (fn (v, sort) =>
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    52
      (v, the_default (constrain sort @{sort typerep}) (AList.lookup (op =) vs' v))) raw_vs;
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    53
    val can_inst = Sign.of_sort thy (T, @{sort random});
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    54
  in if can_inst then mk_random_typecopy tyco vs constr T thy else thy end;
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    55
3e910e98dd67 group record-related ML files
haftmann
parents:
diff changeset
    56
end;