src/Pure/Isar/auto_bind.ML
author wenzelm
Sat, 06 Jan 2001 21:28:30 +0100
changeset 10808 cc4a3ed7e70b
parent 10377 6b595f9ae37e
child 11764 fd780dd6e0b4
permissions -rw-r--r--
added drop_judgment;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6783
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Isar/auto_bind.ML
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
8807
wenzelm
parents: 8612
diff changeset
     4
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
6783
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
     5
10359
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
     6
Logic specific patterns and automatic term bindings.
7675
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
     7
8227
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
     8
Note: the current implementation is not quite 'generic', but works
10359
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
     9
fine with common object-logics (HOL, FOL, ZF etc.).
6783
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    10
*)
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    11
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    12
signature AUTO_BIND =
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    13
sig
10359
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    14
  val is_judgment: term -> bool
10808
cc4a3ed7e70b added drop_judgment;
wenzelm
parents: 10377
diff changeset
    15
  val drop_judgment: term -> term
10377
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    16
  val atomic_judgment: theory -> string -> term
10359
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    17
  val add_judgment: bstring * string * mixfix -> theory -> theory
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    18
  val add_judgment_i: bstring * typ * mixfix -> theory -> theory
7599
40b7f7f51208 admit unbinding;
wenzelm
parents: 7474
diff changeset
    19
  val goal: term -> (indexname * term option) list
40b7f7f51208 admit unbinding;
wenzelm
parents: 7474
diff changeset
    20
  val facts: string -> term list -> (indexname * term option) list
9296
0d2b31e1ea1b export thesisN separately;
wenzelm
parents: 8807
diff changeset
    21
  val thesisN: string
6783
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    22
end;
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    23
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    24
structure AutoBind: AUTO_BIND =
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    25
struct
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    26
9464
e290583864e4 added is_judgment;
wenzelm
parents: 9296
diff changeset
    27
e290583864e4 added is_judgment;
wenzelm
parents: 9296
diff changeset
    28
(** judgments **)
7675
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
    29
10377
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    30
val TruepropN = "Trueprop";
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    31
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    32
fun is_judgment (Const (c, _) $ _) = c = TruepropN
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    33
  | is_judgment _ = false;
10359
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    34
10808
cc4a3ed7e70b added drop_judgment;
wenzelm
parents: 10377
diff changeset
    35
fun drop_judgment (Abs (x, T, t)) = Abs (x, T, drop_judgment t)
cc4a3ed7e70b added drop_judgment;
wenzelm
parents: 10377
diff changeset
    36
  | drop_judgment (tm as (Const (c, _) $ t)) = if c = TruepropN then t else tm
cc4a3ed7e70b added drop_judgment;
wenzelm
parents: 10377
diff changeset
    37
  | drop_judgment tm = tm;
cc4a3ed7e70b added drop_judgment;
wenzelm
parents: 10377
diff changeset
    38
cc4a3ed7e70b added drop_judgment;
wenzelm
parents: 10377
diff changeset
    39
val strip_judgment = drop_judgment o Logic.strip_assums_concl;
cc4a3ed7e70b added drop_judgment;
wenzelm
parents: 10377
diff changeset
    40
10377
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    41
fun atomic_judgment thy x =
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    42
  let  (*be robust wrt. low-level errors*)
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    43
    val aT = TFree ("'a", logicS);
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    44
    val T =
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    45
      if_none (Sign.const_type (Theory.sign_of thy) TruepropN) (aT --> propT)
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    46
      |> Term.map_type_tvar (fn ((x, _), S) => TFree (x, S));
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    47
    val U = Term.domain_type T handle Match => aT;
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    48
  in Const (TruepropN, T) $ Free (x, U) end;
8227
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    49
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    50
9464
e290583864e4 added is_judgment;
wenzelm
parents: 9296
diff changeset
    51
fun gen_add_judgment add (name, T, syn) thy =
10377
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    52
  if name = TruepropN then
9464
e290583864e4 added is_judgment;
wenzelm
parents: 9296
diff changeset
    53
    thy |> PureThy.global_path |> add [(name, T, syn)] |> PureThy.local_path
10377
6b595f9ae37e added atomic_judgment;
wenzelm
parents: 10359
diff changeset
    54
  else error ("Judgment name has to be " ^ quote TruepropN);
8227
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    55
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    56
val add_judgment = gen_add_judgment Theory.add_consts;
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    57
val add_judgment_i = gen_add_judgment Theory.add_consts_i;
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    58
6796
c2e5cb8cd50d facts: bind named props (from proof.ML/let_thms);
wenzelm
parents: 6783
diff changeset
    59
10359
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    60
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    61
(** bindings **)
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    62
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    63
val thesisN = "thesis";
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    64
val thisN = "this";
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    65
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    66
fun statement_binds name prop =
10808
cc4a3ed7e70b added drop_judgment;
wenzelm
parents: 10377
diff changeset
    67
  [((name, 0), Some (Term.list_abs (Logic.strip_params prop, strip_judgment prop)))];
10359
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    68
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    69
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    70
(* goal *)
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    71
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    72
fun goal prop = statement_binds thesisN prop;
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    73
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    74
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    75
(* facts *)
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    76
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    77
fun get_arg prop =
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    78
  (case strip_judgment prop of
10808
cc4a3ed7e70b added drop_judgment;
wenzelm
parents: 10377
diff changeset
    79
    _ $ t => Some (Term.list_abs (Logic.strip_params prop, t))
10359
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    80
  | _ => None);
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    81
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    82
fun facts _ [] = []
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    83
  | facts name props =
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    84
      let val prop = Library.last_elem props
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    85
      in [(Syntax.dddot_indexname, get_arg prop)] @ statement_binds thisN prop end;
445e3b87f28b improved statement bindings for props;
wenzelm
parents: 9464
diff changeset
    86
10808
cc4a3ed7e70b added drop_judgment;
wenzelm
parents: 10377
diff changeset
    87
6783
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    88
end;