src/HOL/Tools/Nunchaku/nunchaku_reconstruct.ML
author haftmann
Fri, 20 Oct 2017 20:57:55 +0200
changeset 66888 930abfdf8727
parent 66646 383d8e388d1b
child 67399 eab6ce8368fa
permissions -rw-r--r--
algebraic foundation for congruences
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
66646
383d8e388d1b tuned headers;
wenzelm
parents: 66633
diff changeset
     1
(*  Title:      HOL/Tools/Nunchaku/nunchaku_reconstruct.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
Reconstruction of Nunchaku models in Isabelle/HOL.
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_RECONSTRUCT =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     9
sig
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    10
  type nun_model = Nunchaku_Model.nun_model
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    11
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    12
  type typ_entry = typ * term list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    13
  type term_entry = term * term
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    14
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    15
  type isa_model =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    16
    {type_model: typ_entry list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    17
     free_model: term_entry list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    18
     pat_complete_model: term_entry list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    19
     pat_incomplete_model: term_entry list,
66623
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
    20
     skolem_model: term_entry list,
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
    21
     auxiliary_model: term_entry list}
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    22
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    23
  val str_of_isa_model: Proof.context -> isa_model -> string
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    24
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    25
  val isa_model_of_nun: Proof.context -> term list -> (typ option * string list) list ->
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    26
    nun_model -> isa_model
66623
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
    27
  val clean_up_isa_model: Proof.context -> isa_model -> isa_model
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    28
end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    29
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    30
structure Nunchaku_Reconstruct : NUNCHAKU_RECONSTRUCT =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    31
struct
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    32
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    33
open Nunchaku_Util;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    34
open Nunchaku_Problem;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    35
open Nunchaku_Translate;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    36
open Nunchaku_Model;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    37
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    38
type typ_entry = typ * term list;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    39
type term_entry = term * term;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    40
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    41
type isa_model =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    42
  {type_model: typ_entry list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    43
   free_model: term_entry list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    44
   pat_complete_model: term_entry list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    45
   pat_incomplete_model: term_entry list,
66623
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
    46
   skolem_model: term_entry list,
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
    47
   auxiliary_model: term_entry list};
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    48
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    49
val anonymousN = "anonymous";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    50
val irrelevantN = "irrelevant";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    51
val unparsableN = "unparsable";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    52
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    53
val nun_arrow_exploded = String.explode nun_arrow;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    54
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    55
val is_ty_meta = member (op =) (String.explode "()->,");
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    56
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    57
fun next_token_lowlevel [] = (End_of_Stream, [])
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    58
  | next_token_lowlevel (c :: cs) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    59
    if Char.isSpace c then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    60
      next_token_lowlevel cs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    61
    else if not (is_ty_meta c) then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    62
      let val n = find_index (Char.isSpace orf is_ty_meta) cs in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    63
        (if n = ~1 then (cs, []) else chop n cs)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    64
        |>> (cons c #> String.implode #> ident_of_str #> Ident)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    65
      end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    66
    else if is_prefix (op =) nun_arrow_exploded (c :: cs) then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    67
      (Ident nun_arrow, tl cs)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    68
    else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    69
      (Symbol (String.str c), cs);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    70
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    71
val tokenize_lowlevel =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    72
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    73
    fun toks cs =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    74
      (case next_token_lowlevel cs of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    75
        (End_of_Stream, []) => []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    76
      | (tok, cs') => tok :: toks cs');
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    77
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    78
    toks o String.explode
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    79
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    80
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    81
fun parse_lowlevel_ty tok =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    82
  (Scan.optional
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    83
     (parse_sym "(" |-- Scan.repeat (parse_lowlevel_ty --| Scan.option (parse_sym ",")) --|
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    84
      parse_sym ")")
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    85
     []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    86
   -- parse_ident >> (swap #> NType)) tok;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    87
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    88
val ty_of_lowlevel_str = fst o parse_lowlevel_ty o tokenize_lowlevel;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    89
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    90
fun ident_of_const (NConst (id, _, _)) = id
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    91
  | ident_of_const _ = nun_dummy;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    92
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    93
fun str_of_typ_entry ctxt (T, ts) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    94
  "type " ^ Syntax.string_of_typ ctxt T  ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    95
  " := {" ^ commas (map (Syntax.string_of_term ctxt) ts) ^ "}.";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    96
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    97
fun str_of_term_entry ctxt (tm, value) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    98
  "val " ^ Syntax.string_of_term ctxt tm ^ " := " ^ Syntax.string_of_term ctxt value ^ ".";
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    99
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   100
fun str_of_isa_model ctxt
66623
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   101
    {type_model, free_model, pat_complete_model, pat_incomplete_model, skolem_model,
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   102
     auxiliary_model} =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   103
  map (str_of_typ_entry ctxt) type_model @ "" ::
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   104
  map (str_of_term_entry ctxt) free_model @ "" ::
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   105
  map (str_of_term_entry ctxt) pat_complete_model @ "" ::
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   106
  map (str_of_term_entry ctxt) pat_incomplete_model @ "" ::
66623
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   107
  map (str_of_term_entry ctxt) skolem_model @ "" ::
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   108
  map (str_of_term_entry ctxt) auxiliary_model
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   109
  |> cat_lines;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   110
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   111
fun typ_of_nun ctxt =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   112
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   113
    fun typ_of (NType (id, tys)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   114
      let val Ts = map typ_of tys in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   115
        if id = nun_dummy then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   116
          dummyT
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   117
        else if id = nun_prop then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   118
          @{typ bool}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   119
        else if id = nun_arrow then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   120
          Type (@{type_name fun}, Ts)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   121
        else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   122
          (case try str_of_nun_tconst id of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   123
            SOME (args, s) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   124
            let val tys' = map ty_of_lowlevel_str args in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   125
              Type (s, map typ_of (tys' @ tys))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   126
            end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   127
          | NONE =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   128
            (case try str_of_nun_tfree id of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   129
              SOME s => TFree (Proof_Context.check_tfree ctxt (flip_quote s, dummyS))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   130
            | NONE => raise Fail ("unknown type constructor: " ^ quote (str_of_ident id))))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   131
      end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   132
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   133
    typ_of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   134
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   135
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   136
fun one_letter_of s =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   137
  let val c = String.sub (Long_Name.base_name s, 0) in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   138
    String.str (if Char.isAlpha c then c else #"x")
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   139
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   140
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   141
fun base_of_typ (Type (s, _)) = s
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   142
  | base_of_typ (TFree (s, _)) = flip_quote s
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   143
  | base_of_typ (TVar ((s, _), _)) = flip_quote s;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   144
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   145
fun term_of_nun ctxt atomss =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   146
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   147
    val thy = Proof_Context.theory_of ctxt;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   148
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   149
    val typ_of = typ_of_nun ctxt;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   150
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   151
    fun nth_atom T j =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   152
      let val ss = these (triple_lookup (typ_match thy) atomss T) in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   153
        if j >= 0 andalso j < length ss then nth ss j
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   154
        else one_letter_of (base_of_typ T) ^ nat_subscript (j + 1)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   155
      end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   156
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   157
    fun term_of _ (NAtom (j, ty)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   158
        let val T = typ_of ty in Var ((nth_atom T j, 0), T) end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   159
      | term_of bounds (NConst (id, tys0, ty)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   160
        if id = nun_conj then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   161
          HOLogic.conj
66623
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   162
        else if id = nun_choice then
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   163
          Const (@{const_name Eps}, typ_of ty)
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   164
        else if id = nun_disj then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   165
          HOLogic.disj
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   166
        else if id = nun_equals then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   167
          Const (@{const_name HOL.eq}, typ_of ty)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   168
        else if id = nun_false then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   169
          @{const False}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   170
        else if id = nun_if then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   171
          Const (@{const_name If}, typ_of ty)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   172
        else if id = nun_implies then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   173
          @{term implies}
66623
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   174
        else if id = nun_not then
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   175
          HOLogic.Not
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   176
        else if id = nun_unique then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   177
          Const (@{const_name The}, typ_of ty)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   178
        else if id = nun_unique_unsafe then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   179
          Const (@{const_name The_unsafe}, typ_of ty)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   180
        else if id = nun_true then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   181
          @{const True}
66623
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   182
        else if String.isPrefix nun_dollar_anon_fun_prefix id then
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   183
          let val j = Int.fromString (unprefix nun_dollar_anon_fun_prefix id) |> the_default ~1 in
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   184
            Var ((anonymousN ^ nat_subscript (j + 1), 0), typ_of ty)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   185
          end
66616
ee56847876b2 updated parser for Nunchaku irrelevant output
blanchet
parents: 66614
diff changeset
   186
        else if String.isPrefix nun_irrelevant id then
ee56847876b2 updated parser for Nunchaku irrelevant output
blanchet
parents: 66614
diff changeset
   187
          Var ((irrelevantN ^ nat_subscript (Value.parse_int (unprefix nun_irrelevant id)), 0),
ee56847876b2 updated parser for Nunchaku irrelevant output
blanchet
parents: 66614
diff changeset
   188
            dummyT)
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   189
        else if id = nun_unparsable then
66616
ee56847876b2 updated parser for Nunchaku irrelevant output
blanchet
parents: 66614
diff changeset
   190
          Var ((unparsableN, 0), typ_of ty)
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   191
        else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   192
          (case try str_of_nun_const id of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   193
            SOME (args, s) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   194
            let val tys = map ty_of_lowlevel_str args in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   195
              Sign.mk_const thy (s, map typ_of (tys @ tys0))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   196
            end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   197
          | NONE =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   198
            (case try str_of_nun_free id of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   199
              SOME s => Free (s, typ_of ty)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   200
            | NONE =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   201
              (case try str_of_nun_var id of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   202
                SOME s => Var ((s, 0), typ_of ty)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   203
              | NONE =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   204
                (case find_index (fn bound => ident_of_const bound = id) bounds of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   205
                  ~1 => Var ((str_of_ident id, 0), typ_of ty) (* shouldn't happen? *)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   206
                | j => Bound j))))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   207
      | term_of bounds (NAbs (var, body)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   208
        let val T = typ_of (safe_ty_of var) in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   209
          Abs (one_letter_of (base_of_typ T), T, term_of (var :: bounds) body)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   210
        end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   211
      | term_of bounds (NApp (func, arg)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   212
        let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   213
          fun same () = term_of bounds func $ term_of bounds arg;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   214
        in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   215
          (case (func, arg) of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   216
            (NConst (id, _, _), NAbs _) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   217
            if id = nun_mu then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   218
              let val Abs (s, T, body) = term_of bounds arg in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   219
                Const (@{const_name The}, (T --> HOLogic.boolT) --> T)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   220
                $ Abs (s, T, HOLogic.eq_const T $ Bound 0 $ body)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   221
              end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   222
            else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   223
              same ()
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   224
          | _ => same ())
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   225
        end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   226
      | term_of _ (NMatch _) = raise Fail "unexpected match";
66633
ec8fceca7fb6 nicer numeral output for nats and ints in Nunchaku
blanchet
parents: 66623
diff changeset
   227
ec8fceca7fb6 nicer numeral output for nats and ints in Nunchaku
blanchet
parents: 66623
diff changeset
   228
    fun rewrite_numbers (t as @{const Suc} $ _) =
ec8fceca7fb6 nicer numeral output for nats and ints in Nunchaku
blanchet
parents: 66623
diff changeset
   229
        (case try HOLogic.dest_nat t of
ec8fceca7fb6 nicer numeral output for nats and ints in Nunchaku
blanchet
parents: 66623
diff changeset
   230
          SOME n => HOLogic.mk_number @{typ nat} n
ec8fceca7fb6 nicer numeral output for nats and ints in Nunchaku
blanchet
parents: 66623
diff changeset
   231
        | NONE => t)
ec8fceca7fb6 nicer numeral output for nats and ints in Nunchaku
blanchet
parents: 66623
diff changeset
   232
      | rewrite_numbers (@{const Abs_Integ} $ (@{const Pair (nat, nat)} $ t $ u)) =
ec8fceca7fb6 nicer numeral output for nats and ints in Nunchaku
blanchet
parents: 66623
diff changeset
   233
        HOLogic.mk_number @{typ int} (HOLogic.dest_nat t - HOLogic.dest_nat u)
ec8fceca7fb6 nicer numeral output for nats and ints in Nunchaku
blanchet
parents: 66623
diff changeset
   234
      | rewrite_numbers (t $ u) = rewrite_numbers t $ rewrite_numbers u
ec8fceca7fb6 nicer numeral output for nats and ints in Nunchaku
blanchet
parents: 66623
diff changeset
   235
      | rewrite_numbers (Abs (s, T, t)) = Abs (s, T, rewrite_numbers t)
ec8fceca7fb6 nicer numeral output for nats and ints in Nunchaku
blanchet
parents: 66623
diff changeset
   236
      | rewrite_numbers t = t;
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   237
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   238
    term_of []
66633
ec8fceca7fb6 nicer numeral output for nats and ints in Nunchaku
blanchet
parents: 66623
diff changeset
   239
    #> rewrite_numbers
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   240
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   241
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   242
fun isa_typ_entry_of_nun ctxt atomss (ty, atoms) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   243
  (typ_of_nun ctxt ty, map (term_of_nun ctxt atomss) atoms);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   244
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   245
fun isa_term_entry_of_nun ctxt atomss (tm, value) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   246
  (term_of_nun ctxt atomss tm, term_of_nun ctxt atomss value);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   247
66623
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   248
fun isa_model_of_nun ctxt pat_completes atomss
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   249
    {type_model, const_model, skolem_model, auxiliary_model} =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   250
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   251
    val free_and_const_model = map (isa_term_entry_of_nun ctxt atomss) const_model;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   252
    val (free_model, (pat_complete_model, pat_incomplete_model)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   253
      List.partition (is_Free o fst) free_and_const_model
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   254
      ||> List.partition (member (op aconv) pat_completes o fst);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   255
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   256
    {type_model = map (isa_typ_entry_of_nun ctxt atomss) type_model, free_model = free_model,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   257
     pat_complete_model = pat_complete_model, pat_incomplete_model = pat_incomplete_model,
66623
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   258
     skolem_model = map (isa_term_entry_of_nun ctxt atomss) skolem_model,
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   259
     auxiliary_model = map (isa_term_entry_of_nun ctxt atomss) auxiliary_model}
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   260
  end;
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   261
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   262
fun clean_up_isa_model ctxt {type_model, free_model, pat_complete_model, pat_incomplete_model,
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   263
    skolem_model, auxiliary_model} =
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   264
  let
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   265
    val pat_complete_model' = if Config.get ctxt show_consts then pat_complete_model else [];
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   266
    val pat_incomplete_model' = pat_incomplete_model
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   267
      |> filter_out (can (fn Const (@{const_name unreachable}, _) => ()) o fst);
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   268
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   269
    val term_model = free_model @ pat_complete_model' @ pat_incomplete_model' @
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   270
      skolem_model @ auxiliary_model;
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   271
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   272
    (* Incomplete test: Can be led astray by references between the auxiliaries. *)
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   273
    fun is_auxiliary_referenced (aux, _) =
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   274
      exists (fn (lhs, rhs) =>
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   275
          not (lhs aconv aux) andalso exists_subterm (curry (op aconv) aux) rhs)
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   276
        term_model;
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   277
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   278
    val auxiliary_model' = filter is_auxiliary_referenced auxiliary_model;
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   279
  in
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   280
    {type_model = type_model, free_model = free_model, pat_complete_model = pat_complete_model',
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   281
     pat_incomplete_model = pat_incomplete_model', skolem_model = skolem_model,
8fc868e9e1bf better model parsing and display in Nunchaku
blanchet
parents: 66616
diff changeset
   282
     auxiliary_model = auxiliary_model'}
64389
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;