src/HOL/Tools/Nunchaku/nunchaku_collect.ML
author wenzelm
Sat, 05 Jan 2019 17:24:33 +0100
changeset 69597 ff784d5a5bfb
parent 69593 3dda49e08b9d
child 69991 6b097aeb3650
permissions -rw-r--r--
isabelle update -u control_cartouches;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
66646
383d8e388d1b tuned headers;
wenzelm
parents: 66635
diff changeset
     1
(*  Title:      HOL/Tools/Nunchaku/nunchaku_collect.ML
66614
1f1c5d85d232 moved Nunchaku to Main; the goal is to move Nitpick out in the next 1-2 years
blanchet
parents: 65458
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: 65458
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
Collecting of Isabelle/HOL definitions etc. for Nunchaku.
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_COLLECT =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
     9
sig
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    10
  val dest_co_datatype_case: Proof.context -> string * typ -> (string * typ) list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    11
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    12
  type isa_type_spec =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    13
    {abs_typ: typ,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    14
     rep_typ: typ,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    15
     wrt: term,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    16
     abs: term,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    17
     rep: term}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    18
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    19
  type isa_co_data_spec =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    20
    {typ: typ,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    21
     ctrs: term list}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    22
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    23
  type isa_const_spec =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    24
    {const: term,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    25
     props: term list}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    26
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    27
  type isa_rec_spec =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    28
    {const: term,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    29
     props: term list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    30
     pat_complete: bool}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    31
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    32
  type isa_consts_spec =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    33
    {consts: term list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    34
     props: term list}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    35
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    36
  datatype isa_command =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    37
    ITVal of typ * (int option * int option)
64411
0af9926e1303 adapted Nunchaku's input syntax to new design decisions
blanchet
parents: 64389
diff changeset
    38
  | ITypedef of isa_type_spec
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    39
  | IQuotient of isa_type_spec
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    40
  | ICoData of BNF_Util.fp_kind * isa_co_data_spec list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    41
  | IVal of term
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    42
  | ICoPred of BNF_Util.fp_kind * bool * isa_const_spec list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    43
  | IRec of isa_rec_spec list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    44
  | ISpec of isa_consts_spec
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    45
  | IAxiom of term
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    46
  | IGoal of term
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    47
  | IEval of term
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    48
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    49
  type isa_problem =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    50
    {commandss: isa_command list list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    51
     sound: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    52
     complete: bool}
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    53
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    54
  exception CYCLIC_DEPS of unit
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    55
  exception TOO_DEEP_DEPS of unit
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    56
  exception TOO_META of term
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    57
  exception UNEXPECTED_POLYMORPHISM of term
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    58
  exception UNEXPECTED_VAR of term
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    59
  exception UNSUPPORTED_FUNC of term
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    60
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    61
  val isa_problem_of_subgoal: Proof.context -> bool -> ((string * typ) option * bool option) list ->
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    62
    (term option * bool) list -> (typ option * (int option * int option)) list -> bool ->
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    63
    Time.time -> term list -> term list -> term -> term list * isa_problem
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    64
  val pat_completes_of_isa_problem: isa_problem -> term list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    65
  val str_of_isa_problem: Proof.context -> isa_problem -> string
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    66
end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    67
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    68
structure Nunchaku_Collect : NUNCHAKU_COLLECT =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    69
struct
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    70
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    71
open Nunchaku_Util;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    72
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    73
type isa_type_spec =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    74
  {abs_typ: typ,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    75
   rep_typ: typ,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    76
   wrt: term,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    77
   abs: term,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    78
   rep: term};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    79
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    80
type isa_co_data_spec =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    81
  {typ: typ,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    82
   ctrs: term list};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    83
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    84
type isa_const_spec =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    85
  {const: term,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    86
   props: term list};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    87
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    88
type isa_rec_spec =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    89
  {const: term,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    90
   props: term list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    91
   pat_complete: bool};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    92
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    93
type isa_consts_spec =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    94
  {consts: term list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    95
   props: term list};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    96
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    97
datatype isa_command =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
    98
  ITVal of typ * (int option * int option)
64411
0af9926e1303 adapted Nunchaku's input syntax to new design decisions
blanchet
parents: 64389
diff changeset
    99
| ITypedef of isa_type_spec
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   100
| IQuotient of isa_type_spec
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   101
| ICoData of BNF_Util.fp_kind * isa_co_data_spec list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   102
| IVal of term
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   103
| ICoPred of BNF_Util.fp_kind * bool * isa_const_spec list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   104
| IRec of isa_rec_spec list
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   105
| ISpec of isa_consts_spec
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   106
| IAxiom of term
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   107
| IGoal of term
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   108
| IEval of term;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   109
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   110
type isa_problem =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   111
  {commandss: isa_command list list,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   112
   sound: bool,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   113
   complete: bool};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   114
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   115
exception CYCLIC_DEPS of unit;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   116
exception TOO_DEEP_DEPS of unit;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   117
exception TOO_META of term;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   118
exception UNEXPECTED_POLYMORPHISM of term;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   119
exception UNEXPECTED_VAR of term;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   120
exception UNSUPPORTED_FUNC of term;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   121
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   122
fun str_of_and_list str_of_elem =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   123
  map str_of_elem #> space_implode ("\nand ");
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   124
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   125
val key_of_typ =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   126
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   127
    fun key_of (Type (s, [])) = s
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   128
      | key_of (Type (s, Ts)) = s ^ "(" ^ commas (map key_of Ts) ^ ")"
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   129
      | key_of (TFree (s, _)) = s;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   130
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   131
    prefix "y" o key_of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   132
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   133
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   134
fun key_of_const ctxt =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   135
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   136
    val thy = Proof_Context.theory_of ctxt;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   137
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   138
    fun key_of (Const (x as (s, _))) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   139
        (case Sign.const_typargs thy x of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   140
          [] => s
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   141
        | Ts => s ^ "(" ^ commas (map key_of_typ Ts) ^ ")")
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   142
      | key_of (Free (s, _)) = s;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   143
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   144
    prefix "t" o key_of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   145
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   146
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   147
val add_type_keys = fold_subtypes (insert (op =) o key_of_typ);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   148
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   149
fun add_aterm_keys ctxt t =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   150
  if is_Const t orelse is_Free t then insert (op =) (key_of_const ctxt t) else I;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   151
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   152
fun add_keys ctxt t =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   153
  fold_aterms (add_aterm_keys ctxt) t
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   154
  #> fold_types add_type_keys t;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   155
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   156
fun close_form except t =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   157
  fold (fn ((s, i), T) => fn t' =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   158
      HOLogic.all_const T $ Abs (s, T, abstract_over (Var ((s, i), T), t')))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   159
    (Term.add_vars t [] |> subtract (op =) except) t;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   160
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   161
(* "imp_conjL[symmetric]" is important for inductive predicates with multiple assumptions. *)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   162
val basic_defs =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   163
  @{thms Ball_def[abs_def] Bex_def[abs_def] case_bool_if Ex1_def[abs_def]
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   164
    imp_conjL[symmetric, abs_def] Let_def[abs_def] rmember_def[symmetric, abs_def]};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   165
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   166
fun unfold_basic_def ctxt =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   167
  let val thy = Proof_Context.theory_of ctxt in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   168
    Pattern.rewrite_term thy (map (Logic.dest_equals o Thm.prop_of) basic_defs) []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   169
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   170
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   171
val has_polymorphism = exists_type (exists_subtype is_TVar);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   172
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   173
fun whack_term thy whacks =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   174
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   175
    fun whk t =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   176
      if triple_lookup (term_match thy o swap) whacks t = SOME true then
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   177
        Const (\<^const_name>\<open>unreachable\<close>, fastype_of t)
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   178
      else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   179
        (case t of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   180
          u $ v => whk u $ whk v
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   181
        | Abs (s, T, u) => Abs (s, T, whk u)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   182
        | _ => t);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   183
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   184
    whk
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   185
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   186
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   187
fun preprocess_term_basic falsify ctxt whacks t =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   188
  let val thy = Proof_Context.theory_of ctxt in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   189
    if has_polymorphism t then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   190
      raise UNEXPECTED_POLYMORPHISM t
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   191
    else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   192
      t
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   193
      |> attach_typeS
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   194
      |> whack_term thy whacks
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   195
      |> Object_Logic.atomize_term ctxt
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   196
      |> tap (fn t' => fastype_of t' <> \<^typ>\<open>prop\<close> orelse raise TOO_META t)
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   197
      |> falsify ? HOLogic.mk_not
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   198
      |> unfold_basic_def ctxt
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   199
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   200
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   201
val check_closed = tap (fn t => null (Term.add_vars t []) orelse raise UNEXPECTED_VAR t);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   202
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   203
val preprocess_prop = close_form [] oooo preprocess_term_basic;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   204
val preprocess_closed_term = check_closed ooo preprocess_term_basic false;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   205
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   206
val is_type_builtin = member (op =) [\<^type_name>\<open>bool\<close>, \<^type_name>\<open>fun\<close>];
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   207
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   208
val is_const_builtin =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   209
  member (op =) [\<^const_name>\<open>All\<close>, \<^const_name>\<open>conj\<close>, \<^const_name>\<open>disj\<close>, \<^const_name>\<open>Eps\<close>,
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   210
    \<^const_name>\<open>HOL.eq\<close>, \<^const_name>\<open>Ex\<close>, \<^const_name>\<open>False\<close>, \<^const_name>\<open>If\<close>,
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   211
    \<^const_name>\<open>implies\<close>, \<^const_name>\<open>Not\<close>, \<^const_name>\<open>The\<close>, \<^const_name>\<open>The_unsafe\<close>,
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   212
    \<^const_name>\<open>True\<close>];
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   213
64411
0af9926e1303 adapted Nunchaku's input syntax to new design decisions
blanchet
parents: 64389
diff changeset
   214
datatype type_classification = Builtin | TVal | Typedef | Quotient | Co_Datatype;
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   215
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   216
fun classify_type_name ctxt T_name =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   217
  if is_type_builtin T_name then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   218
    Builtin
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   219
  else if T_name = \<^type_name>\<open>itself\<close> then
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   220
    Co_Datatype
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   221
  else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   222
    (case BNF_FP_Def_Sugar.fp_sugar_of ctxt T_name of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   223
      SOME _ => Co_Datatype
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   224
    | NONE =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   225
      (case Ctr_Sugar.ctr_sugar_of ctxt T_name of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   226
        SOME _ => Co_Datatype
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   227
      | NONE =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   228
        (case Quotient_Info.lookup_quotients ctxt T_name of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   229
          SOME _ => Quotient
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   230
        | NONE =>
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   231
          if T_name = \<^type_name>\<open>set\<close> then
64411
0af9926e1303 adapted Nunchaku's input syntax to new design decisions
blanchet
parents: 64389
diff changeset
   232
            Typedef
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   233
          else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   234
            (case Typedef.get_info ctxt T_name of
64411
0af9926e1303 adapted Nunchaku's input syntax to new design decisions
blanchet
parents: 64389
diff changeset
   235
              _ :: _ => Typedef
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   236
            | [] => TVal))));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   237
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   238
fun fp_kind_of_ctr_sugar_kind Ctr_Sugar.Codatatype = BNF_Util.Greatest_FP
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   239
  | fp_kind_of_ctr_sugar_kind _ = BNF_Util.Least_FP;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   240
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   241
fun mutual_co_datatypes_of ctxt (T_name, Ts) =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   242
  (if T_name = \<^type_name>\<open>itself\<close> then
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   243
     (BNF_Util.Least_FP, [\<^typ>\<open>'a itself\<close>], [[@{const Pure.type ('a)}]])
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   244
   else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   245
     let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   246
       val (fp, ctr_sugars) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   247
         (case BNF_FP_Def_Sugar.fp_sugar_of ctxt T_name of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   248
           SOME (fp_sugar as {fp, fp_res = {Ts, ...}, ...}) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   249
           (fp,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   250
            (case Ts of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   251
              [_] => [fp_sugar]
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   252
            | _ => map (the o BNF_FP_Def_Sugar.fp_sugar_of ctxt o fst o dest_Type) Ts)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   253
            |> map (#ctr_sugar o #fp_ctr_sugar))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   254
         | NONE =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   255
           (case Ctr_Sugar.ctr_sugar_of ctxt T_name of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   256
             SOME (ctr_sugar as {kind, ...}) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   257
             (* Any freely constructed type that is not a codatatype is considered a datatype. This
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   258
                is sound (but incomplete) for model finding. *)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   259
             (fp_kind_of_ctr_sugar_kind kind, [ctr_sugar])));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   260
     in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   261
       (fp, map #T ctr_sugars, map #ctrs ctr_sugars)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   262
     end)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   263
  |> @{apply 3(2)} (map ((fn Type (s, _) => Type (s, Ts))))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   264
  |> @{apply 3(3)} (map (map (Ctr_Sugar.mk_ctr Ts)));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   265
66624
blanchet
parents: 66614
diff changeset
   266
fun typedef_of ctxt T_name =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   267
  if T_name = \<^type_name>\<open>set\<close> then
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   268
    let
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   269
      val A = Logic.varifyT_global \<^typ>\<open>'a\<close>;
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   270
      val absT = Type (\<^type_name>\<open>set\<close>, [A]);
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   271
      val repT = A --> HOLogic.boolT;
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69593
diff changeset
   272
      val pred = Abs (Name.uu, repT, \<^const>\<open>True\<close>);
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   273
      val abs = Const (\<^const_name>\<open>Collect\<close>, repT --> absT);
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   274
      val rep = Const (\<^const_name>\<open>rmember\<close>, absT --> repT);
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   275
    in
64411
0af9926e1303 adapted Nunchaku's input syntax to new design decisions
blanchet
parents: 64389
diff changeset
   276
      (absT, repT, pred, abs, rep)
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   277
    end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   278
  else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   279
    (case Typedef.get_info ctxt T_name of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   280
      (* When several entries are returned, it shouldn't matter much which one we take (according to
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   281
         Florian Haftmann). The "Logic.varifyT_global" calls are a workaround because these types'
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   282
         variables sometimes clash with locally fixed type variables. *)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   283
      ({abs_type, rep_type, Abs_name, Rep_name, ...}, {Rep, ...}) :: _ =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   284
      let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   285
        val absT = Logic.varifyT_global abs_type;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   286
        val repT = Logic.varifyT_global rep_type;
66624
blanchet
parents: 66614
diff changeset
   287
        val set = Thm.prop_of Rep
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   288
          |> HOLogic.dest_Trueprop
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   289
          |> HOLogic.dest_mem
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   290
          |> snd;
66624
blanchet
parents: 66614
diff changeset
   291
        val pred = Abs (Name.uu, repT, HOLogic.mk_mem (Bound 0, set));
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   292
        val abs = Const (Abs_name, repT --> absT);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   293
        val rep = Const (Rep_name, absT --> repT);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   294
      in
64411
0af9926e1303 adapted Nunchaku's input syntax to new design decisions
blanchet
parents: 64389
diff changeset
   295
        (absT, repT, pred, abs, rep)
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   296
      end);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   297
66624
blanchet
parents: 66614
diff changeset
   298
fun quotient_of ctxt T_name =
64412
2ed3da32bf41 preprocess typedefs and quotients correctly
blanchet
parents: 64411
diff changeset
   299
  (case Quotient_Info.lookup_quotients ctxt T_name of
66624
blanchet
parents: 66614
diff changeset
   300
    SOME {equiv_rel, qtyp, rtyp, quot_thm, ...} =>
blanchet
parents: 66614
diff changeset
   301
    let val _ $ (_ $ _ $ abs $ rep) = Thm.prop_of quot_thm in
64412
2ed3da32bf41 preprocess typedefs and quotients correctly
blanchet
parents: 64411
diff changeset
   302
      (qtyp, rtyp, equiv_rel, abs, rep)
2ed3da32bf41 preprocess typedefs and quotients correctly
blanchet
parents: 64411
diff changeset
   303
    end);
2ed3da32bf41 preprocess typedefs and quotients correctly
blanchet
parents: 64411
diff changeset
   304
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   305
fun is_co_datatype_ctr ctxt (s, T) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   306
  (case body_type T of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   307
    Type (fpT_name, Ts) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   308
    classify_type_name ctxt fpT_name = Co_Datatype andalso
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   309
    let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   310
      val ctrs =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   311
        if fpT_name = \<^type_name>\<open>itself\<close> then
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   312
          [Const (\<^const_name>\<open>Pure.type\<close>, \<^typ>\<open>'a itself\<close>)]
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   313
        else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   314
          (case BNF_FP_Def_Sugar.fp_sugar_of ctxt fpT_name of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   315
            SOME {fp_ctr_sugar = {ctr_sugar = {ctrs, ...}, ...}, ...} => ctrs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   316
          | NONE =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   317
            (case Ctr_Sugar.ctr_sugar_of ctxt fpT_name of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   318
              SOME {ctrs, ...} => ctrs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   319
            | _ => []));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   320
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   321
      fun is_right_ctr (t' as Const (s', _)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   322
        s = s' andalso fastype_of (Ctr_Sugar.mk_ctr Ts t') = T;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   323
    in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   324
      exists is_right_ctr ctrs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   325
    end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   326
  | _  => false);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   327
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   328
fun dest_co_datatype_case ctxt (s, T) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   329
  let val thy = Proof_Context.theory_of ctxt in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   330
    (case strip_fun_type (Sign.the_const_type thy s) of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   331
      (gen_branch_Ts, gen_body_fun_T) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   332
      (case gen_body_fun_T of
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   333
        Type (\<^type_name>\<open>fun\<close>, [Type (fpT_name, _), _]) =>
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   334
        if classify_type_name ctxt fpT_name = Co_Datatype then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   335
          let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   336
            val Type (_, fpTs) = domain_type (funpow (length gen_branch_Ts) range_type T);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   337
            val (ctrs0, Const (case_name, _)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   338
              (case BNF_FP_Def_Sugar.fp_sugar_of ctxt fpT_name of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   339
                SOME {fp_ctr_sugar = {ctr_sugar = {ctrs, casex, ...}, ...}, ...} => (ctrs, casex)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   340
              | NONE =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   341
                (case Ctr_Sugar.ctr_sugar_of ctxt fpT_name of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   342
                  SOME {ctrs, casex, ...} => (ctrs, casex)));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   343
          in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   344
            if s = case_name then map (dest_Const o Ctr_Sugar.mk_ctr fpTs) ctrs0
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   345
            else raise Fail "non-case"
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   346
          end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   347
        else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   348
          raise Fail "non-case"))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   349
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   350
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   351
val is_co_datatype_case = can o dest_co_datatype_case;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   352
66624
blanchet
parents: 66614
diff changeset
   353
fun is_quotient_abs ctxt (s, T) =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   354
  (case T of
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   355
    Type (\<^type_name>\<open>fun\<close>, [_, Type (absT_name, _)]) =>
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   356
    classify_type_name ctxt absT_name = Quotient andalso
66624
blanchet
parents: 66614
diff changeset
   357
    (case quotient_of ctxt absT_name of
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   358
      (_, _, _, Const (s', _), _) => s' = s)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   359
  | _ => false);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   360
66624
blanchet
parents: 66614
diff changeset
   361
fun is_quotient_rep ctxt (s, T) =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   362
  (case T of
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   363
    Type (\<^type_name>\<open>fun\<close>, [Type (absT_name, _), _]) =>
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   364
    classify_type_name ctxt absT_name = Quotient andalso
66624
blanchet
parents: 66614
diff changeset
   365
    (case quotient_of ctxt absT_name of
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   366
      (_, _, _, _, Const (s', _)) => s' = s)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   367
  | _ => false);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   368
66624
blanchet
parents: 66614
diff changeset
   369
fun is_maybe_typedef_abs ctxt absT_name s =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   370
  if absT_name = \<^type_name>\<open>set\<close> then
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   371
    s = \<^const_name>\<open>Collect\<close>
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   372
  else
66624
blanchet
parents: 66614
diff changeset
   373
    (case try (typedef_of ctxt) absT_name of
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   374
      SOME (_, _, _, Const (s', _), _) => s' = s
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   375
    | NONE => false);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   376
66624
blanchet
parents: 66614
diff changeset
   377
fun is_maybe_typedef_rep ctxt absT_name s =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   378
  if absT_name = \<^type_name>\<open>set\<close> then
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   379
    s = \<^const_name>\<open>rmember\<close>
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   380
  else
66624
blanchet
parents: 66614
diff changeset
   381
    (case try (typedef_of ctxt) absT_name of
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   382
      SOME (_, _, _, _, Const (s', _)) => s' = s
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   383
    | NONE => false);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   384
66624
blanchet
parents: 66614
diff changeset
   385
fun is_typedef_abs ctxt (s, T) =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   386
  (case T of
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   387
    Type (\<^type_name>\<open>fun\<close>, [_, Type (absT_name, _)]) =>
66624
blanchet
parents: 66614
diff changeset
   388
    classify_type_name ctxt absT_name = Typedef andalso is_maybe_typedef_abs ctxt absT_name s
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   389
  | _ => false);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   390
66624
blanchet
parents: 66614
diff changeset
   391
fun is_typedef_rep ctxt (s, T) =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   392
  (case T of
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   393
    Type (\<^type_name>\<open>fun\<close>, [Type (absT_name, _), _]) =>
66624
blanchet
parents: 66614
diff changeset
   394
    classify_type_name ctxt absT_name = Typedef andalso is_maybe_typedef_rep ctxt absT_name s
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   395
  | _ => false);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   396
66624
blanchet
parents: 66614
diff changeset
   397
fun is_stale_typedef_abs ctxt (s, T) =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   398
  (case T of
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   399
    Type (\<^type_name>\<open>fun\<close>, [_, Type (absT_name, _)]) =>
66624
blanchet
parents: 66614
diff changeset
   400
    classify_type_name ctxt absT_name <> Typedef andalso is_maybe_typedef_abs ctxt absT_name s
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   401
  | _ => false);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   402
66624
blanchet
parents: 66614
diff changeset
   403
fun is_stale_typedef_rep ctxt (s, T) =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   404
  (case T of
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   405
    Type (\<^type_name>\<open>fun\<close>, [Type (absT_name, _), _]) =>
66624
blanchet
parents: 66614
diff changeset
   406
    classify_type_name ctxt absT_name <> Typedef andalso is_maybe_typedef_rep ctxt absT_name s
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   407
  | _ => false);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   408
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   409
fun instantiate_constant_types_in_term ctxt csts target =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   410
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   411
    val thy = Proof_Context.theory_of ctxt;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   412
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   413
    fun try_const _ _ (res as SOME _) = res
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   414
      | try_const (s', T') cst NONE =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   415
        (case cst of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   416
          Const (s, T) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   417
          if s = s' then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   418
            SOME (Sign.typ_match thy (T', T) Vartab.empty)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   419
            handle Type.TYPE_MATCH => NONE
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   420
          else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   421
            NONE
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   422
        | _ => NONE);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   423
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   424
    fun subst_for (Const x) = fold (try_const x) csts NONE
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   425
      | subst_for (t as Free _) = if member (op aconv) csts t then SOME Vartab.empty else NONE
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   426
      | subst_for (t1 $ t2) = (case subst_for t1 of SOME subst => SOME subst | NONE => subst_for t2)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   427
      | subst_for (Abs (_, _, t')) = subst_for t'
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   428
      | subst_for _ = NONE;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   429
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   430
    (case subst_for target of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   431
      SOME subst => Envir.subst_term_types subst target
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   432
    | NONE => raise Type.TYPE_MATCH)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   433
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   434
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   435
datatype card = One | Fin | Fin_or_Inf | Inf
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   436
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   437
(* Similar to "ATP_Util.tiny_card_of_type". *)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   438
fun card_of_type ctxt =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   439
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   440
    fun max_card Inf _ = Inf
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   441
      | max_card _ Inf = Inf
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   442
      | max_card Fin_or_Inf _ = Fin_or_Inf
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   443
      | max_card _ Fin_or_Inf = Fin_or_Inf
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   444
      | max_card Fin _ = Fin
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   445
      | max_card _ Fin = Fin
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   446
      | max_card One One = One;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   447
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   448
    fun card_of avoid T =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   449
      if member (op =) avoid T then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   450
        Inf
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   451
      else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   452
        (case T of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   453
          TFree _ => Fin_or_Inf
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   454
        | TVar _ => Inf
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   455
        | Type (\<^type_name>\<open>fun\<close>, [T1, T2]) =>
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   456
          (case (card_of avoid T1, card_of avoid T2) of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   457
            (_, One) => One
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   458
          | (k1, k2) => max_card k1 k2)
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   459
        | Type (\<^type_name>\<open>prod\<close>, [T1, T2]) =>
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   460
          (case (card_of avoid T1, card_of avoid T2) of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   461
            (k1, k2) => max_card k1 k2)
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   462
        | Type (\<^type_name>\<open>set\<close>, [T']) => card_of avoid (T' --> HOLogic.boolT)
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   463
        | Type (T_name, Ts) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   464
          (case try (mutual_co_datatypes_of ctxt) (T_name, Ts) of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   465
            NONE => Inf
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   466
          | SOME (_, fpTs, ctrss) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   467
            (case ctrss of [[_]] => One | _ => Fin)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   468
            |> fold (fold (fold (max_card o card_of (fpTs @ avoid)) o binder_types o fastype_of))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   469
              ctrss));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   470
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   471
    card_of []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   472
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   473
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   474
fun int_of_classif Spec_Rules.Equational = 1
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   475
  | int_of_classif Spec_Rules.Inductive = 2
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   476
  | int_of_classif Spec_Rules.Co_Inductive = 3
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   477
  | int_of_classif Spec_Rules.Unknown = 4;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   478
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   479
val classif_ord = int_ord o apply2 int_of_classif;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   480
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   481
fun spec_rules_of ctxt (x as (s, T)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   482
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   483
    val thy = Proof_Context.theory_of ctxt;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   484
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   485
    fun subst_of t0 =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   486
      try (Sign.typ_match thy (fastype_of t0, T)) Vartab.empty;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   487
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   488
    fun process_spec _ (res as SOME _) = res
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   489
      | process_spec (classif, (ts0, ths as _ :: _)) NONE =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   490
        (case get_first subst_of ts0 of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   491
          SOME subst =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   492
          (let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   493
             val ts = map (Envir.subst_term_types subst) ts0;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   494
             val poly_props = map Thm.prop_of ths;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   495
             val props = map (instantiate_constant_types_in_term ctxt ts) poly_props;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   496
           in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   497
             if exists (exists (exists_type (exists_subtype is_TVar))) [ts, props] then NONE
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   498
             else SOME (classif, ts, props, poly_props)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   499
           end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   500
           handle Type.TYPE_MATCH => NONE)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   501
        | NONE => NONE)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   502
      | process_spec _ NONE = NONE;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   503
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   504
    fun spec_rules () =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   505
      Spec_Rules.retrieve ctxt (Const x)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   506
      |> sort (classif_ord o apply2 fst);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   507
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   508
    val specs =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   509
      if s = \<^const_name>\<open>The\<close> then
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   510
        [(Spec_Rules.Unknown, ([Logic.varify_global \<^term>\<open>The\<close>], [@{thm theI_unique}]))]
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   511
      else if s = \<^const_name>\<open>finite\<close> then
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   512
        let val card = card_of_type ctxt T in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   513
          if card = Inf orelse card = Fin_or_Inf then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   514
            spec_rules ()
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   515
          else
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   516
            [(Spec_Rules.Equational, ([Logic.varify_global \<^term>\<open>finite\<close>],
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   517
               [Skip_Proof.make_thm thy (Logic.varify_global \<^prop>\<open>finite A = True\<close>)]))]
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   518
        end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   519
      else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   520
        spec_rules ();
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   521
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   522
    fold process_spec specs NONE
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   523
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   524
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   525
fun lhs_of_equation (Const (\<^const_name>\<open>Pure.eq\<close>, _) $ t $ _) = t
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69593
diff changeset
   526
  | lhs_of_equation (\<^const>\<open>Trueprop\<close> $ (Const (\<^const_name>\<open>HOL.eq\<close>, _) $ t $ _)) = t;
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   527
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   528
fun specialize_definition_type thy x def0 =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   529
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   530
    val def = specialize_type thy x def0;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   531
    val lhs = lhs_of_equation def;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   532
  in
67405
e9ab4ad7bd15 uniform use of Standard ML op-infix -- eliminated warnings;
wenzelm
parents: 67399
diff changeset
   533
    if exists_Const (curry (op =) x) lhs then def else raise Fail "cannot specialize"
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   534
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   535
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   536
fun definition_of thy (x as (s, _)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   537
  Defs.specifications_of (Theory.defs_of thy) (Defs.Const, s)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   538
  |> map_filter #def
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   539
  |> map_filter (try (specialize_definition_type thy x o Thm.prop_of o Thm.axiom thy))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   540
  |> try hd;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   541
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   542
fun is_builtin_theory thy_id =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   543
  Context.subthy_id (thy_id, Context.theory_id \<^theory>\<open>Hilbert_Choice\<close>);
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   544
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   545
val orphan_axioms_of =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   546
  Spec_Rules.get
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   547
  #> filter (curry (op =) Spec_Rules.Unknown o fst)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   548
  #> map snd
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   549
  #> filter (null o fst)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   550
  #> maps snd
65458
cf504b7a7aa7 tuned signature;
wenzelm
parents: 64412
diff changeset
   551
  #> filter_out (is_builtin_theory o Thm.theory_id)
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   552
  #> map Thm.prop_of;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   553
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   554
fun keys_of _ (ITVal (T, _)) = [key_of_typ T]
64411
0af9926e1303 adapted Nunchaku's input syntax to new design decisions
blanchet
parents: 64389
diff changeset
   555
  | keys_of _ (ITypedef {abs_typ, ...}) = [key_of_typ abs_typ]
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   556
  | keys_of _ (IQuotient {abs_typ, ...}) = [key_of_typ abs_typ]
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   557
  | keys_of _ (ICoData (_, specs)) = map (key_of_typ o #typ) specs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   558
  | keys_of ctxt (IVal const) = [key_of_const ctxt const]
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   559
  | keys_of ctxt (ICoPred (_, _, specs)) = map (key_of_const ctxt o #const) specs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   560
  | keys_of ctxt (IRec specs) = map (key_of_const ctxt o #const) specs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   561
  | keys_of ctxt (ISpec {consts, ...}) = map (key_of_const ctxt) consts
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   562
  | keys_of _ (IAxiom _) = []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   563
  | keys_of _ (IGoal _) = []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   564
  | keys_of _ (IEval _) = [];
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   565
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   566
fun co_data_spec_deps_of ctxt ({ctrs, ...} : isa_co_data_spec) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   567
  fold (add_keys ctxt) ctrs [];
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   568
fun const_spec_deps_of ctxt consts props =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   569
  fold (add_keys ctxt) props [] |> subtract (op =) (map (key_of_const ctxt) consts);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   570
fun consts_spec_deps_of ctxt {consts, props} =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   571
  fold (add_keys ctxt) props [] |> subtract (op =) (map (key_of_const ctxt) consts);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   572
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   573
fun deps_of _ (ITVal _) = []
64411
0af9926e1303 adapted Nunchaku's input syntax to new design decisions
blanchet
parents: 64389
diff changeset
   574
  | deps_of ctxt (ITypedef {wrt, ...}) = add_keys ctxt wrt []
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   575
  | deps_of ctxt (IQuotient {wrt, ...}) = add_keys ctxt wrt []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   576
  | deps_of ctxt (ICoData (_, specs)) = maps (co_data_spec_deps_of ctxt) specs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   577
  | deps_of _ (IVal const) = add_type_keys (fastype_of const) []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   578
  | deps_of ctxt (ICoPred (_, _, specs)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   579
    maps (const_spec_deps_of ctxt (map #const specs) o #props) specs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   580
  | deps_of ctxt (IRec specs) = maps (const_spec_deps_of ctxt (map #const specs) o #props) specs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   581
  | deps_of ctxt (ISpec spec) = consts_spec_deps_of ctxt spec
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   582
  | deps_of ctxt (IAxiom prop) = add_keys ctxt prop []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   583
  | deps_of ctxt (IGoal prop) = add_keys ctxt prop []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   584
  | deps_of ctxt (IEval t) = add_keys ctxt t [];
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   585
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   586
fun consts_of_rec_or_spec (IRec specs) = map #const specs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   587
  | consts_of_rec_or_spec (ISpec {consts, ...}) = consts;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   588
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   589
fun props_of_rec_or_spec (IRec specs) = maps #props specs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   590
  | props_of_rec_or_spec (ISpec {props, ...}) = props;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   591
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   592
fun merge_two_rec_or_spec cmd cmd' =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   593
  ISpec {consts = consts_of_rec_or_spec cmd @ consts_of_rec_or_spec cmd',
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   594
    props = props_of_rec_or_spec cmd @ props_of_rec_or_spec cmd'};
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   595
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   596
fun merge_two (ICoData (fp, specs)) (ICoData (fp', specs'), complete) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   597
    (ICoData (BNF_Util.case_fp fp fp fp', specs @ specs'), complete andalso fp = fp')
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   598
  | merge_two (IRec specs) (IRec specs', complete) = (IRec (specs @ specs'), complete)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   599
  | merge_two (cmd as IRec _) (cmd' as ISpec _, complete) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   600
    (merge_two_rec_or_spec cmd cmd', complete)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   601
  | merge_two (cmd as ISpec _) (cmd' as IRec _, complete) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   602
    (merge_two_rec_or_spec cmd cmd', complete)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   603
  | merge_two (cmd as ISpec _) (cmd' as ISpec _, complete) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   604
    (merge_two_rec_or_spec cmd cmd', complete)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   605
  | merge_two _ _ = raise CYCLIC_DEPS ();
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   606
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   607
fun sort_isa_commands_topologically ctxt cmds =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   608
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   609
    fun normal_pairs [] = []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   610
      | normal_pairs (all as normal :: _) = map (rpair normal) all;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   611
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   612
    fun add_node [] _ = I
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   613
      | add_node (normal :: _) cmd = Graph.new_node (normal, cmd);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   614
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   615
    fun merge_scc (cmd :: cmds) complete = fold merge_two cmds (cmd, complete);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   616
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   617
    fun sort_problem (cmds, complete) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   618
      let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   619
        val keyss = map (keys_of ctxt) cmds;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   620
        val normal_keys = Symtab.make (maps normal_pairs keyss);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   621
        val normalize = Symtab.lookup normal_keys;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   622
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   623
        fun add_deps [] _ = I
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   624
          | add_deps (normal :: _) cmd =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   625
            let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   626
              val deps = deps_of ctxt cmd
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   627
                |> map_filter normalize
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   628
                |> remove (op =) normal;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   629
            in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   630
              fold (fn dep => Graph.add_edge (dep, normal)) deps
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   631
            end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   632
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   633
        val cmd_of_key = the o AList.lookup (op =) (map hd keyss ~~ cmds);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   634
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   635
        val G = Graph.empty
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   636
          |> fold2 add_node keyss cmds
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   637
          |> fold2 add_deps keyss cmds;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   638
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   639
        val cmd_sccs = rev (Graph.strong_conn G)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   640
          |> map (map cmd_of_key);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   641
      in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   642
        if exists (can (fn _ :: _ :: _ => ())) cmd_sccs then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   643
          sort_problem (fold_map merge_scc cmd_sccs complete)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   644
        else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   645
          (Graph.schedule (K snd) G, complete)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   646
      end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   647
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   648
    val typedecls = filter (can (fn ITVal _ => ())) cmds;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   649
    val (mixed, complete) =
64411
0af9926e1303 adapted Nunchaku's input syntax to new design decisions
blanchet
parents: 64389
diff changeset
   650
      (filter (can (fn ITypedef _ => () | IQuotient _ => () | ICoData _ => () | IVal _ => ()
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   651
         | ICoPred _ => () | IRec _ => () | ISpec _ => ())) cmds, true)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   652
      |> sort_problem;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   653
    val axioms = filter (can (fn IAxiom _ => ())) cmds;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   654
    val goals = filter (can (fn IGoal _ => ())) cmds;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   655
    val evals = filter (can (fn IEval _ => ())) cmds;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   656
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   657
    (typedecls @ mixed @ axioms @ goals @ evals, complete)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   658
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   659
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   660
fun group_of (ITVal _) = 1
64411
0af9926e1303 adapted Nunchaku's input syntax to new design decisions
blanchet
parents: 64389
diff changeset
   661
  | group_of (ITypedef _) = 2
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   662
  | group_of (IQuotient _) = 3
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   663
  | group_of (ICoData _) = 4
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   664
  | group_of (IVal _) = 5
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   665
  | group_of (ICoPred _) = 6
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   666
  | group_of (IRec _) = 7
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   667
  | group_of (ISpec _) = 8
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   668
  | group_of (IAxiom _) = 9
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   669
  | group_of (IGoal _) = 10
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   670
  | group_of (IEval _) = 11;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   671
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   672
fun group_isa_commands [] = []
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   673
  | group_isa_commands [cmd] = [[cmd]]
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   674
  | group_isa_commands (cmd :: cmd' :: cmds) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   675
    let val (group :: groups) = group_isa_commands (cmd' :: cmds) in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   676
      if group_of cmd = group_of cmd' then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   677
        (cmd :: group) :: groups
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   678
      else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   679
        [cmd] :: (group :: groups)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   680
    end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   681
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   682
fun defined_by (Const (\<^const_name>\<open>All\<close>, _) $ t) = defined_by t
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   683
  | defined_by (Abs (_, _, t)) = defined_by t
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69593
diff changeset
   684
  | defined_by (\<^const>\<open>implies\<close> $ _ $ u) = defined_by u
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   685
  | defined_by (Const (\<^const_name>\<open>HOL.eq\<close>, _) $ t $ _) = head_of t
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   686
  | defined_by t = head_of t;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   687
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   688
fun partition_props [_] props = SOME [props]
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   689
  | partition_props consts props =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   690
    let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   691
      val propss = map (fn const => filter (fn prop => defined_by prop aconv const) props) consts;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   692
    in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   693
      if eq_set (op aconv) (props, flat propss) andalso forall (not o null) propss then SOME propss
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   694
      else NONE
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   695
    end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   696
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   697
fun hol_concl_head (Const (\<^const_name>\<open>All\<close>, _) $ Abs (_, _, t)) = hol_concl_head t
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   698
  | hol_concl_head (Const (\<^const_name>\<open>implies\<close>, _) $ _ $ t) = hol_concl_head t
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   699
  | hol_concl_head (t $ _) = hol_concl_head t
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   700
  | hol_concl_head t = t;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   701
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   702
fun is_inductive_set_intro t =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   703
  (case hol_concl_head t of
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   704
    Const (\<^const_name>\<open>rmember\<close>, _) => true
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   705
  | _ => false);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   706
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   707
exception NO_TRIPLE of unit;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   708
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   709
fun triple_for_intro_rule ctxt x rule =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   710
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   711
    val (prems, concl) = Logic.strip_horn rule
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   712
      |>> map (Object_Logic.atomize_term ctxt)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   713
      ||> Object_Logic.atomize_term ctxt;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   714
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   715
    val (mains, sides) = List.partition (exists_Const (curry (op =) x)) prems;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   716
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   717
    val is_right_head = curry (op aconv) (Const x) o head_of;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   718
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   719
    if forall is_right_head mains then (sides, mains, concl) else raise NO_TRIPLE ()
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   720
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   721
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   722
val tuple_for_args = HOLogic.mk_tuple o snd o strip_comb;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   723
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   724
fun wf_constraint_for rel sides concl mains =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   725
  HOLogic.mk_mem (HOLogic.mk_prod (apply2 tuple_for_args (mains, concl)), Var rel)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   726
  |> fold (curry HOLogic.mk_imp) sides
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   727
  |> close_form [rel];
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   728
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   729
fun wf_constraint_for_triple rel (sides, mains, concl) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   730
  map (wf_constraint_for rel sides concl) mains
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   731
  |> foldr1 HOLogic.mk_conj;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   732
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   733
fun terminates_by ctxt timeout goal tac =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   734
  can (SINGLE (Classical.safe_tac ctxt) #> the
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   735
    #> SINGLE (DETERM_TIMEOUT timeout (tac ctxt (auto_tac ctxt))) #> the
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   736
    #> Goal.finish ctxt) goal;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   737
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   738
val max_cached_wfs = 50;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   739
val cached_timeout = Synchronized.var "Nunchaku_Collect.cached_timeout" Time.zeroTime;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   740
val cached_wf_props = Synchronized.var "Nunchaku_Collect.cached_wf_props" ([] : (term * bool) list);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   741
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   742
val termination_tacs = [Lexicographic_Order.lex_order_tac true, ScnpReconstruct.sizechange_tac];
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   743
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   744
fun is_wellfounded_inductive_predicate ctxt wfs debug wf_timeout const intros =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   745
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   746
    val thy = Proof_Context.theory_of ctxt;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   747
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   748
    val Const (x as (_, T)) = head_of (HOLogic.dest_Trueprop (Logic.strip_imp_concl (hd intros)));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   749
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   750
    (case triple_lookup (const_match thy o swap) wfs (dest_Const const) of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   751
      SOME (SOME wf) => wf
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   752
    | _ =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   753
      (case map (triple_for_intro_rule ctxt x) intros |> filter_out (null o #2) of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   754
        [] => true
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   755
      | triples =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   756
        let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   757
          val binders_T = HOLogic.mk_tupleT (binder_types T);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   758
          val rel_T = HOLogic.mk_setT (HOLogic.mk_prodT (binders_T, binders_T));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   759
          val j = fold (Integer.max o maxidx_of_term) intros 0 + 1;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   760
          val rel = (("R", j), rel_T);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   761
          val prop =
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   762
            Const (\<^const_name>\<open>wf\<close>, rel_T --> HOLogic.boolT) $ Var rel ::
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   763
            map (wf_constraint_for_triple rel) triples
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   764
            |> foldr1 HOLogic.mk_conj
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   765
            |> HOLogic.mk_Trueprop;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   766
        in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   767
          if debug then writeln ("Wellfoundedness goal: " ^ Syntax.string_of_term ctxt prop)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   768
          else ();
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   769
          if wf_timeout = Synchronized.value cached_timeout andalso
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   770
             length (Synchronized.value cached_wf_props) < max_cached_wfs then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   771
            ()
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   772
          else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   773
            (Synchronized.change cached_wf_props (K []);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   774
             Synchronized.change cached_timeout (K wf_timeout));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   775
          (case AList.lookup (op =) (Synchronized.value cached_wf_props) prop of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   776
            SOME wf => wf
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   777
          | NONE =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   778
            let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   779
              val goal = Goal.init (Thm.cterm_of ctxt prop);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   780
              val wf = exists (terminates_by ctxt wf_timeout goal) termination_tacs;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   781
            in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   782
              Synchronized.change cached_wf_props (cons (prop, wf)); wf
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   783
            end)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   784
        end)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   785
      handle
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   786
        List.Empty => false
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   787
      | NO_TRIPLE () => false)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   788
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   789
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   790
datatype lhs_pat =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   791
  Only_Vars
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   792
| Prim_Pattern of string
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   793
| Any_Pattern;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   794
66634
56456f388867 eliminate artifact of translation in printed Nunchaku model
blanchet
parents: 66624
diff changeset
   795
fun is_apparently_pat_complete ctxt props =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   796
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   797
    val is_Var_or_Bound = is_Var orf is_Bound;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   798
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   799
    fun lhs_pat_of t =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   800
      (case t of
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   801
        Const (\<^const_name>\<open>All\<close>, _) $ Abs (_, _, t) => lhs_pat_of t
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
   802
      | Const (\<^const_name>\<open>HOL.eq\<close>, _) $ u $ _ =>
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   803
        (case filter_out is_Var_or_Bound (snd (strip_comb u)) of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   804
          [] => Only_Vars
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   805
        | [v] =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   806
          (case strip_comb v of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   807
            (cst as Const (_, T), args) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   808
            (case body_type T of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   809
              Type (T_name, _) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   810
              if can (Ctr_Sugar.dest_ctr ctxt T_name) cst andalso forall is_Var_or_Bound args then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   811
                Prim_Pattern T_name
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   812
              else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   813
                Any_Pattern
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   814
            | _ => Any_Pattern)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   815
          | _ => Any_Pattern)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   816
        | _ => Any_Pattern)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   817
      | _ => Any_Pattern);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   818
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   819
    (case map lhs_pat_of props of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   820
      [] => false
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   821
    | pats as Prim_Pattern T_name :: _ =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   822
      forall (can (fn Prim_Pattern _ => ())) pats andalso
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   823
      length pats = length (#ctrs (the (Ctr_Sugar.ctr_sugar_of ctxt T_name)))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   824
    | pats => forall (curry (op =) Only_Vars) pats)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   825
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   826
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   827
(* Prevents divergence in case of cyclic or infinite axiom dependencies. *)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   828
val axioms_max_depth = 255
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   829
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   830
fun isa_problem_of_subgoal ctxt falsify wfs whacks cards debug wf_timeout evals0 some_assms0
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   831
    subgoal0 =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   832
  let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   833
    val thy = Proof_Context.theory_of ctxt;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   834
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   835
    fun card_of T =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   836
      (case triple_lookup (typ_match thy o swap) cards T of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   837
        NONE => (NONE, NONE)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   838
      | SOME (c1, c2) => (if c1 = SOME 1 then NONE else c1, c2));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   839
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   840
    fun axioms_of_class class =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   841
      #axioms (Axclass.get_info thy class)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   842
      handle ERROR _ => [];
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   843
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   844
    fun monomorphize_class_axiom T t =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   845
      (case Term.add_tvars t [] of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   846
        [] => t
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   847
      | [(x, S)] => Envir.subst_term_types (Vartab.make [(x, (S, T))]) t);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   848
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   849
    fun consider_sort depth T S (seens as (seenS, seenT, seen), problem) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   850
      if member (op =) seenS S then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   851
        (seens, problem)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   852
      else if depth > axioms_max_depth then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   853
        raise TOO_DEEP_DEPS ()
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   854
      else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   855
        let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   856
          val seenS = S :: seenS;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   857
          val seens = (seenS, seenT, seen);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   858
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   859
          val supers = Sign.complete_sort thy S;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   860
          val axioms0 = maps (map Thm.prop_of o axioms_of_class) supers;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   861
          val axioms = map (preprocess_prop false ctxt whacks o monomorphize_class_axiom T) axioms0;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   862
        in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   863
          (seens, map IAxiom axioms @ problem)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   864
          |> fold (consider_term (depth + 1)) axioms
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   865
        end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   866
    and consider_type depth T =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   867
      (case T of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   868
        Type (s, Ts) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   869
        if is_type_builtin s then fold (consider_type depth) Ts
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   870
        else consider_non_builtin_type depth T
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   871
      | _ => consider_non_builtin_type depth T)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   872
    and consider_non_builtin_type depth T (seens as (seenS, seenT, seen), problem) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   873
      if member (op =) seenT T then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   874
        (seens, problem)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   875
      else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   876
        let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   877
          val seenT = T :: seenT;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   878
          val seens = (seenS, seenT, seen);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   879
64412
2ed3da32bf41 preprocess typedefs and quotients correctly
blanchet
parents: 64411
diff changeset
   880
          fun consider_typedef_or_quotient itypedef_or_quotient tuple_of s =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   881
            let
66624
blanchet
parents: 66614
diff changeset
   882
              val (T0, repT0, wrt0, abs0, rep0) = tuple_of ctxt s;
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   883
              val tyenv = Sign.typ_match thy (T0, T) Vartab.empty;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   884
              val substT = Envir.subst_type tyenv;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   885
              val subst = Envir.subst_term_types tyenv;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   886
              val repT = substT repT0;
66624
blanchet
parents: 66614
diff changeset
   887
              val wrt = preprocess_prop false ctxt whacks (subst wrt0);
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   888
              val abs = subst abs0;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   889
              val rep = subst rep0;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   890
            in
64412
2ed3da32bf41 preprocess typedefs and quotients correctly
blanchet
parents: 64411
diff changeset
   891
              apsnd (cons (itypedef_or_quotient {abs_typ = T, rep_typ = repT, wrt = wrt, abs = abs,
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   892
                rep = rep}))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   893
              #> consider_term (depth + 1) wrt
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   894
            end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   895
        in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   896
          (seens, problem)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   897
          |> (case T of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   898
               TFree (_, S) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   899
               apsnd (cons (ITVal (T, card_of T)))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   900
               #> consider_sort depth T S
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   901
             | TVar (_, S) => consider_sort depth T S
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   902
             | Type (s, Ts) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   903
               fold (consider_type depth) Ts
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   904
               #> (case classify_type_name ctxt s of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   905
                    Co_Datatype =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   906
                    let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   907
                      val (fp, fpTs, ctrss) = mutual_co_datatypes_of ctxt (s, Ts);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   908
                      val specs = map2 (fn T => fn ctrs => {typ = T, ctrs = ctrs}) fpTs ctrss;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   909
                    in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   910
                      (fn ((seenS, seenT, seen), problem) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   911
                          ((seenS, union (op =) fpTs seenT, seen), ICoData (fp, specs) :: problem))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   912
                      #> fold (fold (consider_type (depth + 1) o fastype_of)) ctrss
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   913
                    end
64412
2ed3da32bf41 preprocess typedefs and quotients correctly
blanchet
parents: 64411
diff changeset
   914
                  | Typedef => consider_typedef_or_quotient ITypedef typedef_of s
2ed3da32bf41 preprocess typedefs and quotients correctly
blanchet
parents: 64411
diff changeset
   915
                  | Quotient => consider_typedef_or_quotient IQuotient quotient_of s
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   916
                  | TVal => apsnd (cons (ITVal (T, card_of T)))))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   917
        end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   918
    and consider_term depth t =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   919
      (case t of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   920
        t1 $ t2 => fold (consider_term depth) [t1, t2]
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   921
      | Var (_, T) => consider_type depth T
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   922
      | Bound _ => I
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   923
      | Abs (_, T, t') =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   924
        consider_term depth t'
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   925
        #> consider_type depth T
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   926
      | _ => (fn (seens as (seenS, seenT, seen), problem) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   927
          if member (op aconv) seen t then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   928
            (seens, problem)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   929
          else if depth > axioms_max_depth then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   930
            raise TOO_DEEP_DEPS ()
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   931
          else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   932
            let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   933
              val seen = t :: seen;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   934
              val seens = (seenS, seenT, seen);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   935
            in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   936
              (case t of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   937
                Const (x as (s, T)) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   938
                (if is_const_builtin s orelse is_co_datatype_ctr ctxt x orelse
66624
blanchet
parents: 66614
diff changeset
   939
                    is_co_datatype_case ctxt x orelse is_quotient_abs ctxt x orelse
blanchet
parents: 66614
diff changeset
   940
                    is_quotient_rep ctxt x orelse is_typedef_abs ctxt x orelse
blanchet
parents: 66614
diff changeset
   941
                    is_typedef_rep ctxt x then
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   942
                   (seens, problem)
66624
blanchet
parents: 66614
diff changeset
   943
                 else if is_stale_typedef_abs ctxt x orelse is_stale_typedef_rep ctxt x then
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   944
                   raise UNSUPPORTED_FUNC t
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   945
                 else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   946
                   (case spec_rules_of ctxt x of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   947
                     SOME (classif, consts, props0, poly_props) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   948
                     let
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   949
                       val props = map (preprocess_prop false ctxt whacks) props0;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   950
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   951
                       fun def_or_spec () =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   952
                         (case definition_of thy x of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   953
                           SOME eq0 =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   954
                           let val eq = preprocess_prop false ctxt whacks eq0 in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   955
                             ([eq], [IRec [{const = t, props = [eq], pat_complete = true}]])
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   956
                           end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   957
                         | NONE => (props, [ISpec {consts = consts, props = props}]));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   958
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   959
                       val (props', cmds) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   960
                         if null props then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   961
                           ([], map IVal consts)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   962
                         else if classif = Spec_Rules.Equational then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   963
                           (case partition_props consts props of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   964
                             SOME propss =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   965
                             (props,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   966
                              [IRec (map2 (fn const => fn props =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   967
                                   {const = const, props = props,
66634
56456f388867 eliminate artifact of translation in printed Nunchaku model
blanchet
parents: 66624
diff changeset
   968
                                    pat_complete = is_apparently_pat_complete ctxt props})
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   969
                                 consts propss)])
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   970
                           | NONE => def_or_spec ())
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   971
                         else if member (op =) [Spec_Rules.Inductive, Spec_Rules.Co_Inductive]
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   972
                             classif then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   973
                           if is_inductive_set_intro (hd props) then
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   974
                             def_or_spec ()
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   975
                           else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   976
                             (case partition_props consts props of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   977
                               SOME propss =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   978
                               (props,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   979
                                [ICoPred (if classif = Spec_Rules.Inductive then BNF_Util.Least_FP
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   980
                                   else BNF_Util.Greatest_FP,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   981
                                 length consts = 1 andalso
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   982
                                 is_wellfounded_inductive_predicate ctxt wfs debug wf_timeout
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   983
                                   (the_single consts) poly_props,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   984
                                 map2 (fn const => fn props => {const = const, props = props})
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   985
                                   consts propss)])
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   986
                             | NONE => def_or_spec ())
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   987
                         else
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   988
                           def_or_spec ();
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   989
                     in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   990
                       ((seenS, seenT, union (op aconv) consts seen), cmds @ problem)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   991
                       |> fold (consider_term (depth + 1)) props'
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   992
                     end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   993
                   | NONE =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   994
                     (case definition_of thy x of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   995
                       SOME eq0 =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   996
                       let val eq = preprocess_prop false ctxt whacks eq0 in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   997
                         (seens, IRec [{const = t, props = [eq], pat_complete = true}] :: problem)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   998
                         |> consider_term (depth + 1) eq
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
   999
                       end
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1000
                     | NONE => (seens, IVal t :: problem))))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1001
                |> consider_type depth T
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1002
              | Free (_, T) =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1003
                (seens, IVal t :: problem)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1004
                |> consider_type depth T)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1005
            end));
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1006
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1007
    val (poly_axioms, mono_axioms0) = orphan_axioms_of ctxt
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1008
      |> List.partition has_polymorphism;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1009
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69593
diff changeset
  1010
    fun implicit_evals_of pol (\<^const>\<open>Not\<close> $ t) = implicit_evals_of (not pol) t
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69593
diff changeset
  1011
      | implicit_evals_of pol (\<^const>\<open>implies\<close> $ t $ u) =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1012
        (case implicit_evals_of pol u of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1013
          [] => implicit_evals_of (not pol) t
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1014
        | ts => ts)
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69593
diff changeset
  1015
      | implicit_evals_of pol (\<^const>\<open>conj\<close> $ t $ u) =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1016
        union (op aconv) (implicit_evals_of pol t) (implicit_evals_of pol u)
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69593
diff changeset
  1017
      | implicit_evals_of pol (\<^const>\<open>disj\<close> $ t $ u) =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1018
        union (op aconv) (implicit_evals_of pol t) (implicit_evals_of pol u)
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
  1019
      | implicit_evals_of false (Const (\<^const_name>\<open>HOL.eq\<close>, _) $ t $ u) =
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1020
        distinct (op aconv) [t, u]
69593
3dda49e08b9d isabelle update -u control_cartouches;
wenzelm
parents: 67405
diff changeset
  1021
      | implicit_evals_of true (Const (\<^const_name>\<open>HOL.eq\<close>, _) $ t $ _) = [t]
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1022
      | implicit_evals_of _ _ = [];
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1023
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1024
    val mono_axioms_and_some_assms =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1025
      map (preprocess_prop false ctxt whacks) (mono_axioms0 @ some_assms0);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1026
    val subgoal = preprocess_prop falsify ctxt whacks subgoal0;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1027
    val implicit_evals = implicit_evals_of true subgoal;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1028
    val evals = map (preprocess_closed_term ctxt whacks) evals0;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1029
    val seens = ([], [], []);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1030
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1031
    val (commandss, complete) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1032
      (seens,
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1033
       map IAxiom mono_axioms_and_some_assms @ [IGoal subgoal] @ map IEval (implicit_evals @ evals))
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1034
      |> fold (consider_term 0) (subgoal :: evals @ mono_axioms_and_some_assms)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1035
      |> snd
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1036
      |> rev (* prettier *)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1037
      |> sort_isa_commands_topologically ctxt
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1038
      |>> group_isa_commands;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1039
  in
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1040
    (poly_axioms, {commandss = commandss, sound = true, complete = complete})
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1041
  end;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1042
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1043
fun add_pat_complete_of_command cmd =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1044
  (case cmd of
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1045
    ICoPred (_, _, specs) => union (op =) (map #const specs)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1046
  | IRec specs =>
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1047
    union (op =) (map_filter (try (fn {const, pat_complete = true, ...} => const)) specs)
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1048
  | _ => I);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1049
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1050
fun pat_completes_of_isa_problem {commandss, ...} =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1051
  fold (fold add_pat_complete_of_command) commandss [];
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1052
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1053
fun str_of_isa_term_with_type ctxt t =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1054
  Syntax.string_of_term ctxt t ^ " : " ^ Syntax.string_of_typ ctxt (fastype_of t);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1055
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1056
fun is_triv_wrt (Abs (_, _, body)) = is_triv_wrt body
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 69593
diff changeset
  1057
  | is_triv_wrt \<^const>\<open>True\<close> = true
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1058
  | is_triv_wrt _ = false;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1059
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1060
fun str_of_isa_type_spec ctxt {abs_typ, rep_typ, wrt, abs, rep} =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1061
  Syntax.string_of_typ ctxt abs_typ ^ " := " ^ Syntax.string_of_typ ctxt rep_typ ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1062
  (if is_triv_wrt wrt then "" else "\n  wrt " ^ Syntax.string_of_term ctxt wrt) ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1063
  "\n  abstract " ^ Syntax.string_of_term ctxt abs ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1064
  "\n  concrete " ^ Syntax.string_of_term ctxt rep;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1065
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1066
fun str_of_isa_co_data_spec ctxt {typ, ctrs} =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1067
  Syntax.string_of_typ ctxt typ ^ " :=\n  " ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1068
  space_implode "\n| " (map (str_of_isa_term_with_type ctxt) ctrs);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1069
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1070
fun str_of_isa_const_spec ctxt {const, props} =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1071
  str_of_isa_term_with_type ctxt const ^ " :=\n  " ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1072
  space_implode ";\n  " (map (Syntax.string_of_term ctxt) props);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1073
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1074
fun str_of_isa_rec_spec ctxt {const, props, pat_complete} =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1075
  str_of_isa_term_with_type ctxt const ^ (if pat_complete then " [pat_complete]" else "") ^
66635
dbe1dc1f0016 tuned whitespace in Nunchaku output
blanchet
parents: 66634
diff changeset
  1076
  " :=\n  " ^ space_implode ";\n  " (map (Syntax.string_of_term ctxt) props);
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1077
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1078
fun str_of_isa_consts_spec ctxt {consts, props} =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1079
  space_implode " and\n     " (map (str_of_isa_term_with_type ctxt) consts) ^ " :=\n  " ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1080
  space_implode ";\n  " (map (Syntax.string_of_term ctxt) props);
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1081
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1082
fun str_of_isa_card NONE = ""
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1083
  | str_of_isa_card (SOME k) = signed_string_of_int k;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1084
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1085
fun str_of_isa_cards_suffix (NONE, NONE) = ""
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1086
  | str_of_isa_cards_suffix (c1, c2) = " " ^ str_of_isa_card c1 ^ "-" ^ str_of_isa_card c2;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1087
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1088
fun str_of_isa_command ctxt (ITVal (T, cards)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1089
    "type " ^ Syntax.string_of_typ ctxt T ^ str_of_isa_cards_suffix cards
64411
0af9926e1303 adapted Nunchaku's input syntax to new design decisions
blanchet
parents: 64389
diff changeset
  1090
  | str_of_isa_command ctxt (ITypedef spec) = "typedef " ^ str_of_isa_type_spec ctxt spec
64389
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1091
  | str_of_isa_command ctxt (IQuotient spec) = "quotient " ^ str_of_isa_type_spec ctxt spec
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1092
  | str_of_isa_command ctxt (ICoData (fp, specs)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1093
    BNF_Util.case_fp fp "data" "codata" ^ " " ^ str_of_and_list (str_of_isa_co_data_spec ctxt) specs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1094
  | str_of_isa_command ctxt (IVal t) = "val " ^ str_of_isa_term_with_type ctxt t
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1095
  | str_of_isa_command ctxt (ICoPred (fp, wf, specs)) =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1096
    BNF_Util.case_fp fp "pred" "copred" ^ " " ^ (if wf then "[wf] " else "") ^
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1097
    str_of_and_list (str_of_isa_const_spec ctxt) specs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1098
  | str_of_isa_command ctxt (IRec specs) = "rec " ^ str_of_and_list (str_of_isa_rec_spec ctxt) specs
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1099
  | str_of_isa_command ctxt (ISpec spec) = "spec " ^ str_of_isa_consts_spec ctxt spec
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1100
  | str_of_isa_command ctxt (IAxiom prop) = "axiom " ^ Syntax.string_of_term ctxt prop
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1101
  | str_of_isa_command ctxt (IGoal prop) = "goal " ^ Syntax.string_of_term ctxt prop
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1102
  | str_of_isa_command ctxt (IEval t) = "eval " ^ Syntax.string_of_term ctxt t;
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1103
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1104
fun str_of_isa_problem ctxt {commandss, sound, complete} =
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1105
  map (cat_lines o map (suffix "." o str_of_isa_command ctxt)) commandss
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1106
  |> space_implode "\n\n" |> suffix "\n"
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1107
  |> prefix ("# " ^ (if sound then "sound" else "unsound") ^ "\n")
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1108
  |> prefix ("# " ^ (if complete then "complete" else "incomplete") ^ "\n");
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1109
6273d4c8325b added Nunchaku integration
blanchet
parents:
diff changeset
  1110
end;