src/HOL/Tools/Nunchaku/nunchaku_model.ML
author blanchet
Fri, 08 Sep 2017 00:02:05 +0200
changeset 66616 ee56847876b2
parent 66614 1f1c5d85d232
child 66623 8fc868e9e1bf
permissions -rw-r--r--
updated parser for Nunchaku irrelevant output
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     1
(*  Title:      HOL/Nunchaku/Tools/nunchaku_model.ML
66614
1f1c5d85d232 moved Nunchaku to Main; the goal is to move Nitpick out in the next 1-2 years
blanchet
parents: 64389
diff changeset
     2
    Author:     Jasmin Blanchette, VU Amsterdam
1f1c5d85d232 moved Nunchaku to Main; the goal is to move Nitpick out in the next 1-2 years
blanchet
parents: 64389
diff changeset
     3
    Copyright   2015, 2016, 2017
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     4
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     5
Abstract syntax tree for Nunchaku models.
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     6
*)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     7
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     8
signature NUNCHAKU_MODEL =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     9
sig
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    10
  type ident = Nunchaku_Problem.ident
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    11
  type ty = Nunchaku_Problem.ty
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    12
  type tm = Nunchaku_Problem.tm
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    13
  type name_pool = Nunchaku_Problem.name_pool
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    14
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    15
  type ty_entry = ty * tm list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    16
  type tm_entry = tm * tm
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    17
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    18
  type nun_model =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    19
    {type_model: ty_entry list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    20
     const_model: tm_entry list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    21
     skolem_model: tm_entry list}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    22
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    23
  val str_of_nun_model: nun_model -> string
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    24
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    25
  val allocate_ugly: name_pool -> string * string -> string * name_pool
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    26
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    27
  val ugly_nun_model: name_pool -> nun_model -> nun_model
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    28
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    29
  datatype token =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    30
    Ident of ident
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    31
  | Symbol of ident
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    32
  | Atom of ident * int
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    33
  | End_of_Stream
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    34
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    35
  val parse_tok: ''a -> ''a list -> ''a * ''a list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    36
  val parse_ident: token list -> ident * token list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    37
  val parse_id: ident -> token list -> token * token list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    38
  val parse_sym: ident -> token list -> token * token list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    39
  val parse_atom: token list -> (ident * int) * token list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    40
  val nun_model_of_str: string -> nun_model
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    41
end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    42
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    43
structure Nunchaku_Model : NUNCHAKU_MODEL =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    44
struct
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    45
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    46
open Nunchaku_Problem;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    47
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    48
type ty_entry = ty * tm list;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    49
type tm_entry = tm * tm;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    50
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    51
type nun_model =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    52
  {type_model: ty_entry list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    53
   const_model: tm_entry list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    54
   skolem_model: tm_entry list};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    55
66616
ee56847876b2 updated parser for Nunchaku irrelevant output
blanchet
parents: 66614
diff changeset
    56
fun base_of_id id = hd (space_explode "/" id);
ee56847876b2 updated parser for Nunchaku irrelevant output
blanchet
parents: 66614
diff changeset
    57
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    58
val nun_SAT = str_of_ident "SAT";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    59
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    60
fun str_of_ty_entry (ty, tms) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    61
  "type " ^ str_of_ty ty ^ " := {" ^ commas (map str_of_tm tms) ^ "}.";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    62
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    63
fun str_of_tm_entry (tm, value) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    64
  "val " ^ str_of_tm tm ^ " := " ^ str_of_tm value ^ ".";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    65
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    66
fun str_of_nun_model {type_model, const_model, skolem_model} =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    67
  map str_of_ty_entry type_model @ "" :: map str_of_tm_entry const_model @ "" ::
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    68
  map str_of_tm_entry skolem_model
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    69
  |> cat_lines;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    70
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    71
fun fold_map_ty_entry_idents f (ty, atoms) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    72
  fold_map_ty_idents f ty
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    73
  ##>> fold_map (fold_map_tm_idents f) atoms;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    74
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    75
fun fold_map_tm_entry_idents f (tm, value) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    76
  fold_map_tm_idents f tm
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    77
  ##>> fold_map_tm_idents f value;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    78
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    79
fun fold_map_nun_model_idents f {type_model, const_model, skolem_model} =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    80
  fold_map (fold_map_ty_entry_idents f) type_model
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    81
  ##>> fold_map (fold_map_tm_entry_idents f) const_model
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    82
  ##>> fold_map (fold_map_tm_entry_idents f) skolem_model
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    83
  #>> (fn ((type_model, const_model), skolem_model) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    84
    {type_model = type_model, const_model = const_model, skolem_model = skolem_model});
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    85
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    86
fun swap_name_pool ({nice_of_ugly, ugly_of_nice} : name_pool) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    87
  {nice_of_ugly = ugly_of_nice, ugly_of_nice = nice_of_ugly};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    88
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    89
fun allocate_ugly pool (nice, ugly_sugg) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    90
  allocate_nice (swap_name_pool pool) (nice, ugly_sugg) ||> swap_name_pool;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    91
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    92
fun ugly_ident nice (pool as {ugly_of_nice, ...}) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    93
  (case Symtab.lookup ugly_of_nice nice of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    94
    NONE => allocate_ugly pool (nice, nice)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    95
  | SOME ugly => (ugly, pool));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    96
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    97
fun ugly_nun_model pool model =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    98
  fst (fold_map_nun_model_idents ugly_ident model pool);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    99
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   100
datatype token =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   101
  Ident of ident
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   102
| Symbol of ident
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   103
| Atom of ident * int
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   104
| End_of_Stream;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   105
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   106
val rev_str = String.implode o rev o String.explode;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   107
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   108
fun atom_of_str s =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   109
  (case first_field "_" (rev_str s) of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   110
    SOME (rev_suf, rev_pre) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   111
    let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   112
      val pre = rev_str rev_pre;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   113
      val suf = rev_str rev_suf;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   114
    in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   115
      (case Int.fromString suf of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   116
        SOME j => Atom (ident_of_str pre, j)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   117
      | NONE => raise Fail "ill-formed atom")
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   118
    end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   119
  | NONE => raise Fail "ill-formed atom");
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   120
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   121
fun is_alnum_etc_char c = Char.isAlphaNum c orelse c = #"_" orelse c = #"/";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   122
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   123
val multi_ids =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   124
  [nun_arrow, nun_assign, nun_conj, nun_disj, nun_implies, nun_unparsable, nun_irrelevant];
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   125
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   126
val nun_anon_fun_prefix_exploded = String.explode nun_anon_fun_prefix;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   127
val [nun_dollar_char] = String.explode nun_dollar;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   128
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   129
fun next_token [] = (End_of_Stream, [])
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   130
  | next_token (c :: cs) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   131
    if Char.isSpace c then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   132
      next_token cs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   133
    else if c = nun_dollar_char then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   134
      let val n = find_index (not o is_alnum_etc_char) cs in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   135
        (if n = ~1 then (cs, []) else chop n cs)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   136
        |>> (String.implode
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   137
          #> (if is_prefix (op =) nun_anon_fun_prefix_exploded cs then ident_of_str #> Ident
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   138
            else atom_of_str))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   139
      end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   140
    else if is_alnum_etc_char c then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   141
      let val n = find_index (not o is_alnum_etc_char) cs in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   142
        (if n = ~1 then (cs, []) else chop n cs)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   143
        |>> (cons c #> String.implode #> ident_of_str #> Ident)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   144
      end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   145
    else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   146
      let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   147
        fun next_multi id =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   148
          let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   149
            val s = str_of_ident id;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   150
            val n = String.size s - 1;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   151
          in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   152
            if c = String.sub (s, 0) andalso
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   153
               is_prefix (op =) (String.explode (String.substring (s, 1, n))) cs then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   154
              SOME (Symbol id, drop n cs)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   155
            else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   156
              NONE
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   157
          end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   158
      in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   159
        (case get_first next_multi multi_ids of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   160
          SOME res => res
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   161
        | NONE => (Symbol (ident_of_str (String.str c)), cs))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   162
      end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   163
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   164
val tokenize =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   165
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   166
    fun toks cs =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   167
      (case next_token cs of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   168
        (End_of_Stream, []) => []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   169
      | (tok, cs') => tok :: toks cs');
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   170
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   171
    toks o String.explode
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   172
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   173
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   174
fun parse_enum sep scan = scan ::: Scan.repeat (sep |-- scan);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   175
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   176
fun parse_tok tok = Scan.one (curry (op =) tok);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   177
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   178
val parse_ident = Scan.some (try (fn Ident id => id));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   179
val parse_id = parse_tok o Ident;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   180
val parse_sym = parse_tok o Symbol;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   181
val parse_atom = Scan.some (try (fn Atom id_j => id_j));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   182
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   183
val confusing_ids = [nun_else, nun_then, nun_with];
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   184
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   185
val parse_confusing_id = Scan.one (fn Ident id => member (op =) confusing_ids id | _ => false);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   186
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   187
fun parse_ty toks =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   188
  (parse_ty_arg -- Scan.option (parse_sym nun_arrow -- parse_ty)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   189
   >> (fn (ty, NONE) => ty
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   190
     | (lhs, SOME (Symbol id, rhs)) => NType (id, [lhs, rhs]))) toks
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   191
and parse_ty_arg toks =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   192
  (parse_ident >> (rpair [] #> NType)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   193
   || parse_sym nun_lparen |-- parse_ty --| parse_sym nun_rparen) toks;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   194
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   195
val parse_choice_or_unique =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   196
  (parse_tok (Ident nun_choice) || parse_tok (Ident nun_unique)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   197
   || parse_tok (Ident nun_unique_unsafe))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   198
  -- parse_ty_arg
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   199
  >> (fn (Ident id, ty) => NConst (id, [ty], mk_arrows_ty ([ty, prop_ty], ty)));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   200
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   201
fun parse_tm toks =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   202
  (parse_id nun_lambda |-- Scan.repeat parse_arg --| parse_sym nun_dot -- parse_tm >> nabss
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   203
  || parse_id nun_mu |-- parse_arg --| parse_sym nun_dot -- parse_tm
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   204
     >> (fn (var, body) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   205
       let val ty = safe_ty_of body in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   206
         NApp (NConst (nun_mu, [ty], mk_arrow_ty (mk_arrow_ty (ty, ty), ty)), NAbs (var, body))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   207
       end)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   208
   || parse_id nun_if |-- parse_tm --| parse_id nun_then -- parse_tm --| parse_id nun_else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   209
       -- parse_tm
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   210
     >> (fn ((cond, th), el) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   211
       let val ty = safe_ty_of th in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   212
         napps (NConst (nun_if, [ty], mk_arrows_ty ([prop_ty, ty, ty], ty)), [cond, th, el])
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   213
       end)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   214
   || parse_implies) toks
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   215
and parse_implies toks =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   216
  (parse_disj -- Scan.option (parse_sym nun_implies -- parse_implies)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   217
   >> (fn (tm, NONE) => tm
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   218
     | (lhs, SOME (Symbol id, rhs)) => napps (NConst (id, [], dummy_ty), [lhs, rhs]))) toks
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   219
and parse_disj toks =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   220
  (parse_conj -- Scan.option (parse_sym nun_disj -- parse_disj)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   221
   >> (fn (tm, NONE) => tm
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   222
     | (lhs, SOME (Symbol id, rhs)) => napps (NConst (id, [], dummy_ty), [lhs, rhs]))) toks
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   223
and parse_conj toks =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   224
  (parse_equals -- Scan.option (parse_sym nun_conj -- parse_conj)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   225
   >> (fn (tm, NONE) => tm
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   226
     | (lhs, SOME (Symbol id, rhs)) => napps (NConst (id, [], dummy_ty), [lhs, rhs]))) toks
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   227
and parse_equals toks =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   228
  (parse_comb -- Scan.option (parse_sym nun_equals -- parse_comb)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   229
   >> (fn (tm, NONE) => tm
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   230
     | (lhs, SOME (Symbol id, rhs)) => napps (NConst (id, [], dummy_ty), [lhs, rhs]))) toks
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   231
and parse_comb toks =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   232
  (parse_arg -- Scan.repeat (Scan.unless parse_confusing_id parse_arg) >> napps) toks
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   233
and parse_arg toks =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   234
  (parse_choice_or_unique
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   235
   || parse_ident >> (fn id => NConst (id, [], dummy_ty))
66616
ee56847876b2 updated parser for Nunchaku irrelevant output
blanchet
parents: 66614
diff changeset
   236
   || parse_sym nun_irrelevant |-- parse_ident
ee56847876b2 updated parser for Nunchaku irrelevant output
blanchet
parents: 66614
diff changeset
   237
     >> (fn num => NConst (nun_irrelevant ^ num, [], dummy_ty))
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   238
   || parse_sym nun_unparsable |-- parse_ty >> (fn ty => NConst (nun_unparsable, [], ty))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   239
   || parse_sym nun_lparen |-- parse_tm -- Scan.option (parse_sym nun_colon |-- parse_ty)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   240
      --| parse_sym nun_rparen
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   241
     >> (fn (NConst (id, [], _), SOME ty) => NConst (id, [], ty)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   242
       | (tm, _) => tm)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   243
   || parse_atom >> (fn (id, j) => NAtom (j, NType (id, [])))) toks;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   244
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   245
val parse_witness_name =
66616
ee56847876b2 updated parser for Nunchaku irrelevant output
blanchet
parents: 66614
diff changeset
   246
  parse_ident >> (fn id => NConst (base_of_id id, [], dummy_ty));
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   247
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   248
val parse_witness =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   249
  parse_id nun__witness_of |-- parse_sym nun_lparen |-- (parse_id nun_forall || parse_id nun_exists)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   250
  |-- Scan.option (parse_sym nun_lparen) |-- parse_witness_name
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   251
  --| Scan.repeat (Scan.one (curry (op <>) (Symbol nun_assign)));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   252
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   253
datatype entry =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   254
  Type_Entry of ty_entry
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   255
| Skolem_Entry of tm_entry
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   256
| Const_Entry of tm_entry;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   257
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   258
val parse_entry =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   259
  (parse_id nun_type |-- parse_ty --| parse_sym nun_assign --| parse_sym nun_lbrace --
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   260
       parse_enum (parse_sym nun_comma) parse_tm --| parse_sym nun_rbrace
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   261
     >> Type_Entry
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   262
   || parse_id nun_val |-- parse_witness --| parse_sym nun_assign -- parse_tm >> Skolem_Entry
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   263
   || parse_id nun_val |-- parse_tm --| parse_sym nun_assign -- parse_tm >> Const_Entry)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   264
  --| parse_sym nun_dot;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   265
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   266
val parse_model =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   267
  parse_id nun_SAT |-- parse_sym nun_colon |-- parse_sym nun_lbrace |-- Scan.repeat parse_entry
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   268
  --| parse_sym nun_rbrace;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   269
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   270
fun add_entry entry ({type_model, const_model, skolem_model} : nun_model) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   271
  (case entry of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   272
    Type_Entry e =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   273
    {type_model = e :: type_model, const_model = const_model, skolem_model = skolem_model}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   274
  | Skolem_Entry e =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   275
    {type_model = type_model, const_model = const_model, skolem_model = e :: skolem_model}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   276
  | Const_Entry e =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   277
    {type_model = type_model, const_model = e :: const_model, skolem_model = skolem_model});
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   278
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   279
fun nun_model_of_str str =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   280
  let val (entries, _) = parse_model (tokenize str) in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   281
    {type_model = [], const_model = [], skolem_model = []}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   282
    |> fold_rev add_entry entries
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   283
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   284
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   285
end;