src/Pure/Isar/auto_bind.ML
author wenzelm
Thu, 13 Jul 2000 11:41:06 +0200
changeset 9296 0d2b31e1ea1b
parent 8807 0046be1769f9
child 9464 e290583864e4
permissions -rw-r--r--
export thesisN separately;
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
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
     6
Automatic term bindings -- logic specific patterns.
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
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
     9
fine with the more 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
7599
40b7f7f51208 admit unbinding;
wenzelm
parents: 7474
diff changeset
    14
  val goal: term -> (indexname * term option) list
40b7f7f51208 admit unbinding;
wenzelm
parents: 7474
diff changeset
    15
  val facts: string -> term list -> (indexname * term option) list
9296
0d2b31e1ea1b export thesisN separately;
wenzelm
parents: 8807
diff changeset
    16
  val thesisN: string
0d2b31e1ea1b export thesisN separately;
wenzelm
parents: 8807
diff changeset
    17
  val atomic_thesis: term -> term * term
8227
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    18
  val add_judgment: bstring * string * mixfix -> theory -> theory
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    19
  val add_judgment_i: bstring * typ * mixfix -> theory -> theory
6783
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    20
end;
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    21
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    22
structure AutoBind: AUTO_BIND =
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    23
struct
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    24
7675
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
    25
val thesisN = "thesis";
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
    26
val thisN = "this";
6796
c2e5cb8cd50d facts: bind named props (from proof.ML/let_thms);
wenzelm
parents: 6783
diff changeset
    27
7675
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
    28
8227
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    29
(** bindings **)
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    30
8612
e8ef58d6d6eb ?this: support params;
wenzelm
parents: 8227
diff changeset
    31
fun list_abs parms tm = foldr (fn ((x, T), t) => Abs (x, T, t)) (parms, tm);
e8ef58d6d6eb ?this: support params;
wenzelm
parents: 8227
diff changeset
    32
e8ef58d6d6eb ?this: support params;
wenzelm
parents: 8227
diff changeset
    33
7675
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
    34
(* goal *)
6783
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    35
6796
c2e5cb8cd50d facts: bind named props (from proof.ML/let_thms);
wenzelm
parents: 6783
diff changeset
    36
fun statement_binds (name, prop) =
c2e5cb8cd50d facts: bind named props (from proof.ML/let_thms);
wenzelm
parents: 6783
diff changeset
    37
  let
7331
aee8f76fe54c ??thesis: include params;
wenzelm
parents: 7048
diff changeset
    38
    val concl = Logic.strip_assums_concl prop;
aee8f76fe54c ??thesis: include params;
wenzelm
parents: 7048
diff changeset
    39
    val parms = Logic.strip_params prop;
aee8f76fe54c ??thesis: include params;
wenzelm
parents: 7048
diff changeset
    40
8612
e8ef58d6d6eb ?this: support params;
wenzelm
parents: 8227
diff changeset
    41
    val env = [(name ^ "_prop", Some prop), (name ^ "_concl", Some (list_abs parms concl)),
e8ef58d6d6eb ?this: support params;
wenzelm
parents: 8227
diff changeset
    42
      (name, case concl of Const ("Trueprop", _) $ t => Some (list_abs parms t) | _ => None)];
7474
43cedde6d52a removed Syntax.binding;
wenzelm
parents: 7452
diff changeset
    43
  in map (fn (s, t) => ((s, 0), t)) env end;
6783
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    44
7675
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
    45
fun goal prop = statement_binds (thesisN, prop);
6783
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    46
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    47
6796
c2e5cb8cd50d facts: bind named props (from proof.ML/let_thms);
wenzelm
parents: 6783
diff changeset
    48
(* facts *)
c2e5cb8cd50d facts: bind named props (from proof.ML/let_thms);
wenzelm
parents: 6783
diff changeset
    49
8612
e8ef58d6d6eb ?this: support params;
wenzelm
parents: 8227
diff changeset
    50
fun get_subject prop =
e8ef58d6d6eb ?this: support params;
wenzelm
parents: 8227
diff changeset
    51
  (case (Logic.strip_assums_concl prop) of
e8ef58d6d6eb ?this: support params;
wenzelm
parents: 8227
diff changeset
    52
    Const ("Trueprop", _) $ (_ $ t) => Some (list_abs (Logic.strip_params prop) t)
e8ef58d6d6eb ?this: support params;
wenzelm
parents: 8227
diff changeset
    53
  | _ => None);
6796
c2e5cb8cd50d facts: bind named props (from proof.ML/let_thms);
wenzelm
parents: 6783
diff changeset
    54
c2e5cb8cd50d facts: bind named props (from proof.ML/let_thms);
wenzelm
parents: 6783
diff changeset
    55
fun facts _ [] = []
7452
c2289eabf706 "this";
wenzelm
parents: 7331
diff changeset
    56
  | facts name props =
c2289eabf706 "this";
wenzelm
parents: 7331
diff changeset
    57
      let val prop = Library.last_elem props
8612
e8ef58d6d6eb ?this: support params;
wenzelm
parents: 8227
diff changeset
    58
      in [(Syntax.dddot_indexname, get_subject prop)] @ statement_binds (thisN, prop) end;
7675
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
    59
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
    60
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
    61
(* atomic_thesis *)
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
    62
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
    63
fun mk_free t = Free (thesisN, Term.fastype_of t);
c859160e78b0 added atomic_thesis;
wenzelm
parents: 7599
diff changeset
    64
9296
0d2b31e1ea1b export thesisN separately;
wenzelm
parents: 8807
diff changeset
    65
fun atomic_thesis ((c as Const ("Trueprop", _)) $ t) = (t, c $ mk_free t)
0d2b31e1ea1b export thesisN separately;
wenzelm
parents: 8807
diff changeset
    66
  | atomic_thesis t = (t, mk_free t);
8227
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    67
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    68
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    69
(** judgment **)
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    70
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    71
fun gen_add_judgment add args = PureThy.local_path o add [args] o PureThy.global_path;
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    72
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    73
val add_judgment = gen_add_judgment Theory.add_consts;
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    74
val add_judgment_i = gen_add_judgment Theory.add_consts_i;
d67db92897df add_judgment;
wenzelm
parents: 7675
diff changeset
    75
6796
c2e5cb8cd50d facts: bind named props (from proof.ML/let_thms);
wenzelm
parents: 6783
diff changeset
    76
6783
9cf9c17d9e35 renamed object_logic.ML to Isar/auto_bind.ML and tuned this module;
wenzelm
parents:
diff changeset
    77
end;