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