src/Tools/Spec_Check/spec_check.ML
author nipkow
Fri, 09 Jul 2021 10:36:20 +0200
changeset 74189 d4af818e0880
permissions -rw-r--r--
Backed out changeset fe8d0f4da0e6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
74189
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     1
(*  Title:      Tools/Spec_Check/spec_check.ML
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     2
    Author:     Lukas Bulwahn and Nicolai Schaffroth, TU Muenchen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     3
    Author:     Christopher League
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     4
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     5
Specification-based testing of ML programs with random values.
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     6
*)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     7
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     8
signature SPEC_CHECK =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
     9
sig
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    10
  val gen_target : int Config.T
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    11
  val gen_max : int Config.T
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    12
  val examples : int Config.T
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    13
  val sort_examples : bool Config.T
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    14
  val show_stats : bool Config.T
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    15
  val column_width : int Config.T
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    16
  val style : string Config.T
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    17
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    18
  type output_style = Proof.context -> string ->
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    19
    {status : string option * Property.result * (Property.stats  * string option list) -> unit,
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    20
     finish: Property.stats * string option list -> unit}
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    21
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    22
  val register_style : string -> output_style -> theory -> theory
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    23
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    24
  val checkGen : Proof.context ->
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    25
    'a Generator.gen * ('a -> string) option -> string * 'a Property.prop -> unit
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    26
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    27
  val check_property : Proof.context -> string -> unit
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    28
end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    29
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    30
structure Spec_Check : SPEC_CHECK =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    31
struct
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    32
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    33
(* configurations *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    34
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    35
val gen_target = Attrib.setup_config_int \<^binding>\<open>spec_check_gen_target\<close> (K 100)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    36
val gen_max = Attrib.setup_config_int \<^binding>\<open>spec_check_gen_max\<close> (K 400)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    37
val examples = Attrib.setup_config_int \<^binding>\<open>spec_check_examples\<close> (K 5)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    38
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    39
val sort_examples = Attrib.setup_config_bool \<^binding>\<open>spec_check_sort_examples\<close> (K true)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    40
val show_stats = Attrib.setup_config_bool \<^binding>\<open>spec_check_show_stats\<close> (K true)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    41
val column_width = Attrib.setup_config_int \<^binding>\<open>spec_check_column_width\<close> (K 22)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    42
val style = Attrib.setup_config_string \<^binding>\<open>spec_check_style\<close> (K "Perl")
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    43
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    44
type ('a, 'b) reader = 'b -> ('a * 'b) option
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    45
type 'a rep = ('a -> string) option
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    46
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    47
type output_style = Proof.context -> string ->
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    48
  {status: string option * Property.result * (Property.stats * string option list) -> unit,
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    49
   finish: Property.stats * string option list -> unit}
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    50
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    51
fun limit ctxt gen = Generator.limit (Config.get ctxt gen_max) gen
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    52
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    53
structure Style = Theory_Data
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    54
(
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    55
  type T = output_style Symtab.table
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    56
  val empty = Symtab.empty
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    57
  val extend = I
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    58
  fun merge data : T = Symtab.merge (K true) data
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    59
)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    60
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    61
fun get_style ctxt =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    62
  let val name = Config.get ctxt style in
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    63
    (case Symtab.lookup (Style.get (Proof_Context.theory_of ctxt)) name of
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    64
      SOME style => style ctxt
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    65
    | NONE => error ("No style called " ^ quote name ^ " found"))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    66
  end
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    67
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    68
fun register_style name style = Style.map (Symtab.update (name, style))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    69
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    70
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    71
(* testing functions *)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    72
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    73
fun cpsCheck ctxt s0 shrink (next, show) (tag, prop) =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    74
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    75
    val apply_show = case show of NONE => (fn _ => NONE) | SOME f => SOME o f
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    76
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    77
    val {status, finish} = get_style ctxt tag
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    78
    fun status' (obj, result, (stats, badobjs)) =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    79
      let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    80
        val badobjs' = if Property.failure result then obj :: badobjs else badobjs
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    81
        val _ = status (apply_show obj, result, (stats, map apply_show badobjs'))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    82
      in badobjs' end
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    83
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    84
    fun try_shrink (obj, result, stats') (stats, badobjs) =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    85
      let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    86
        fun is_failure s =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    87
          let val (result, stats') = Property.test prop (s, stats)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    88
          in if Property.failure result then SOME (s, result, stats') else NONE end
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    89
      in
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    90
        case get_first is_failure (shrink obj) of
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    91
          SOME (obj, result, stats') => try_shrink (obj, result, stats') (stats, badobjs)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    92
        | NONE => status' (obj, result, (stats', badobjs))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    93
      end
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    94
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    95
    fun iter (NONE, (stats, badobjs)) = finish (stats, map apply_show badobjs)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    96
      | iter (SOME (obj, stream), (stats, badobjs)) =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    97
        if #count stats >= Config.get ctxt gen_target then
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    98
          finish (stats, map apply_show badobjs)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
    99
        else
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   100
          let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   101
            val (result, stats') = Property.test prop (obj, stats)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   102
            val badobjs' = if Property.failure result then
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   103
                try_shrink (obj, result, stats') (stats, badobjs)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   104
              else
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   105
                status' (obj, result, (stats', badobjs))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   106
          in iter (next stream, (stats', badobjs')) end
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   107
  in
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   108
    fn stream => iter (next stream, (s0, []))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   109
  end
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   110
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   111
fun check' ctxt s0 = cpsCheck ctxt s0 (fn _ => [])
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   112
fun check ctxt = check' ctxt Property.stats
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   113
fun checks ctxt = cpsCheck ctxt Property.stats
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   114
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   115
fun checkGen ctxt (gen, show) (tag, prop) =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   116
  check' ctxt {count = 0, tags = [("__GEN", 0)]}
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   117
    (limit ctxt gen, show) (tag, prop) Generator.stream
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   118
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   119
fun checkGenShrink ctxt shrink (gen, show) (tag, prop) =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   120
  cpsCheck ctxt {count=0, tags=[("__GEN", 0)]} shrink
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   121
    (limit ctxt gen, show) (tag, prop) Generator.stream
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   122
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   123
fun checkOne ctxt show (tag, prop) obj =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   124
  check ctxt (List.getItem, show) (tag, prop) [obj]
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   125
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   126
(*call the compiler and pass resulting type string to the parser*)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   127
fun determine_type ctxt s =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   128
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   129
    val return = Unsynchronized.ref "return"
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   130
    val context : ML_Compiler0.context =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   131
     {name_space = #name_space ML_Env.context,
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   132
      print_depth = SOME 1000000,
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   133
      here = #here ML_Env.context,
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   134
      print = fn r => return := r,
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   135
      error = #error ML_Env.context}
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   136
    val _ =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   137
      Context.setmp_generic_context (SOME (Context.Proof ctxt))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   138
        (fn () =>
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   139
          ML_Compiler0.ML context
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   140
            {line = 0, file = "generated code", verbose = true, debug = false} s) ()
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   141
  in
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   142
    Gen_Construction.parse_pred (! return)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   143
  end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   144
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   145
(*call the compiler and run the test*)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   146
fun run_test ctxt s =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   147
  Context.setmp_generic_context (SOME (Context.Proof ctxt))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   148
    (fn () =>
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   149
      ML_Compiler0.ML ML_Env.context
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   150
        {line = 0, file = "generated code", verbose = false, debug = false} s) ();
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   151
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   152
(*split input into tokens*)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   153
fun input_split s =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   154
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   155
    fun dot c = c = #"."
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   156
    fun space c = c = #" "
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   157
    val (head, code) = Substring.splitl (not o dot) (Substring.full s)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   158
  in
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   159
   (String.tokens space (Substring.string head),
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   160
    Substring.string (Substring.dropl dot code))
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   161
  end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   162
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   163
(*create the function from the input*)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   164
fun make_fun s =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   165
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   166
    val scan_param = Scan.one (fn s => s <> ";")
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   167
    fun parameters s = Scan.repeat1 scan_param s
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   168
    val p = $$ "ALL" |-- parameters
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   169
    val (split, code) = input_split s
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   170
    val stop = Scan.stopper (fn _ => ";") (fn s => s = ";");
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   171
    val (params, _) = Scan.finite stop p split
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   172
  in "fn (" ^ commas params ^ ") => " ^ code end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   173
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   174
(*read input and perform the test*)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   175
fun gen_check_property check ctxt s =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   176
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   177
    val func = make_fun s
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   178
    val (_, ty) = determine_type ctxt func
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   179
  in run_test ctxt (check ctxt "Check" (ty, func)) end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   180
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   181
val check_property = gen_check_property Gen_Construction.build_check
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   182
(*val check_property_safe = gen_check_property Gen_Construction.safe_check*)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   183
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   184
(*perform test for specification function*)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   185
fun gen_check_property_f check ctxt s =
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   186
  let
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   187
    val (name, ty) = determine_type ctxt s
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   188
  in run_test ctxt (check ctxt name (ty, s)) end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   189
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   190
val check_property_f = gen_check_property_f Gen_Construction.build_check
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   191
(*val check_property_safe_f_ = gen_check_property_f Gen_Construction.safe_check*)
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   192
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   193
end;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   194
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   195
fun check_property s = Spec_Check.check_property (Context.the_local_context ()) s;
d4af818e0880 Backed out changeset fe8d0f4da0e6
nipkow
parents:
diff changeset
   196