src/Pure/bires.ML
author wenzelm
Sat, 05 Jul 2025 15:03:26 +0200
changeset 82807 be34513a58a1
parent 82806 7189368734cd
child 82808 cb93bd70c561
permissions -rw-r--r--
clarified signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
82805
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/bires.ML
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
     2
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
82806
7189368734cd tuned signature: more explicit types;
wenzelm
parents: 82805
diff changeset
     3
    Author:     Makarius
82805
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
     4
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
     5
Biresolution and resolution using nets.
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
     6
*)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
     7
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
     8
signature BIRES =
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
     9
sig
82806
7189368734cd tuned signature: more explicit types;
wenzelm
parents: 82805
diff changeset
    10
  type rule = bool * thm
7189368734cd tuned signature: more explicit types;
wenzelm
parents: 82805
diff changeset
    11
  type 'a netpair = ('a * rule) Net.net * ('a * rule) Net.net;
82807
be34513a58a1 clarified signature;
wenzelm
parents: 82806
diff changeset
    12
  val insert_tagged_rule: 'a * rule -> 'a netpair -> 'a netpair
be34513a58a1 clarified signature;
wenzelm
parents: 82806
diff changeset
    13
  val insert_tagged_rules: ('a * rule) list -> 'a netpair -> 'a netpair
be34513a58a1 clarified signature;
wenzelm
parents: 82806
diff changeset
    14
  val delete_tagged_rule: rule -> 'a netpair -> 'a netpair
be34513a58a1 clarified signature;
wenzelm
parents: 82806
diff changeset
    15
  val delete_tagged_rules: rule list -> 'a netpair -> 'a netpair
82806
7189368734cd tuned signature: more explicit types;
wenzelm
parents: 82805
diff changeset
    16
  val eq_kbrl: ('a * rule) * ('a * rule) -> bool
82805
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    17
  val build_net: thm list -> (int * thm) Net.net
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    18
  val biresolution_from_nets_tac: Proof.context ->
82806
7189368734cd tuned signature: more explicit types;
wenzelm
parents: 82805
diff changeset
    19
    ('a list -> rule list) -> bool -> 'a Net.net * 'a Net.net -> int -> tactic
7189368734cd tuned signature: more explicit types;
wenzelm
parents: 82805
diff changeset
    20
  val biresolve_from_nets_tac: Proof.context -> int netpair -> int -> tactic
7189368734cd tuned signature: more explicit types;
wenzelm
parents: 82805
diff changeset
    21
  val bimatch_from_nets_tac: Proof.context -> int netpair -> int -> tactic
82805
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    22
  val filt_resolve_from_net_tac: Proof.context -> int -> (int * thm) Net.net -> int -> tactic
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    23
  val resolve_from_net_tac: Proof.context -> (int * thm) Net.net -> int -> tactic
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    24
  val match_from_net_tac: Proof.context -> (int * thm) Net.net -> int -> tactic
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    25
end
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    26
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    27
structure Bires: BIRES =
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    28
struct
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    29
82806
7189368734cd tuned signature: more explicit types;
wenzelm
parents: 82805
diff changeset
    30
type rule = bool * thm;  (*eres flag, see Thm.biresolution*)
7189368734cd tuned signature: more explicit types;
wenzelm
parents: 82805
diff changeset
    31
7189368734cd tuned signature: more explicit types;
wenzelm
parents: 82805
diff changeset
    32
type 'a netpair = ('a * rule) Net.net * ('a * rule) Net.net;
7189368734cd tuned signature: more explicit types;
wenzelm
parents: 82805
diff changeset
    33
7189368734cd tuned signature: more explicit types;
wenzelm
parents: 82805
diff changeset
    34
82805
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    35
(** To preserve the order of the rules, tag them with increasing integers **)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    36
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    37
(*insert one tagged brl into the pair of nets*)
82807
be34513a58a1 clarified signature;
wenzelm
parents: 82806
diff changeset
    38
fun insert_tagged_rule (kbrl as (k, (eres, th))) (inet, enet) =
82805
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    39
  if eres then
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    40
    (case try Thm.major_prem_of th of
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    41
      SOME prem => (inet, Net.insert_term (K false) (prem, kbrl) enet)
82807
be34513a58a1 clarified signature;
wenzelm
parents: 82806
diff changeset
    42
    | NONE => error "insert_tagged_rule: elimination rule with no premises")
82805
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    43
  else (Net.insert_term (K false) (Thm.concl_of th, kbrl) inet, enet);
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    44
82807
be34513a58a1 clarified signature;
wenzelm
parents: 82806
diff changeset
    45
fun insert_tagged_rules rls = fold_rev insert_tagged_rule rls;
be34513a58a1 clarified signature;
wenzelm
parents: 82806
diff changeset
    46
be34513a58a1 clarified signature;
wenzelm
parents: 82806
diff changeset
    47
82805
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    48
(*delete one kbrl from the pair of nets*)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    49
fun eq_kbrl ((_, (_, th)), (_, (_, th'))) = Thm.eq_thm_prop (th, th')
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    50
82807
be34513a58a1 clarified signature;
wenzelm
parents: 82806
diff changeset
    51
fun delete_tagged_rule (brl as (eres, th)) (inet, enet) =
82805
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    52
  (if eres then
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    53
    (case try Thm.major_prem_of th of
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    54
      SOME prem => (inet, Net.delete_term eq_kbrl (prem, ((), brl)) enet)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    55
    | NONE => (inet, enet))  (*no major premise: ignore*)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    56
  else (Net.delete_term eq_kbrl (Thm.concl_of th, ((), brl)) inet, enet))
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    57
  handle Net.DELETE => (inet,enet);
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    58
82807
be34513a58a1 clarified signature;
wenzelm
parents: 82806
diff changeset
    59
fun delete_tagged_rules rls = fold_rev delete_tagged_rule rls;
be34513a58a1 clarified signature;
wenzelm
parents: 82806
diff changeset
    60
82805
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    61
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    62
(*biresolution using a pair of nets rather than rules.
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    63
    function "order" must sort and possibly filter the list of brls.
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    64
    boolean "match" indicates matching or unification.*)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    65
fun biresolution_from_nets_tac ctxt order match (inet, enet) =
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    66
  SUBGOAL
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    67
    (fn (prem, i) =>
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    68
      let
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    69
        val hyps = Logic.strip_assums_hyp prem;
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    70
        val concl = Logic.strip_assums_concl prem;
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    71
        val kbrls = Net.unify_term inet concl @ maps (Net.unify_term enet) hyps;
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    72
      in PRIMSEQ (Thm.biresolution (SOME ctxt) match (order kbrls) i) end);
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    73
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    74
(*versions taking pre-built nets.  No filtering of brls*)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    75
fun biresolve_from_nets_tac ctxt = biresolution_from_nets_tac ctxt order_list false;
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    76
fun bimatch_from_nets_tac ctxt = biresolution_from_nets_tac ctxt order_list true;
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    77
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    78
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    79
(*** Simpler version for resolve_tac -- only one net, and no hyps ***)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    80
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    81
(*insert one tagged rl into the net*)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    82
fun insert_krl (krl as (k,th)) =
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    83
  Net.insert_term (K false) (Thm.concl_of th, krl);
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    84
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    85
(*build a net of rules for resolution*)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    86
fun build_net rls =
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    87
  fold_rev insert_krl (tag_list 1 rls) Net.empty;
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    88
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    89
(*resolution using a net rather than rules; pred supports filt_resolve_tac*)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    90
fun filt_resolution_from_net_tac ctxt match pred net =
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    91
  SUBGOAL (fn (prem, i) =>
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    92
    let val krls = Net.unify_term net (Logic.strip_assums_concl prem) in
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    93
      if pred krls then
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    94
        PRIMSEQ (Thm.biresolution (SOME ctxt) match (map (pair false) (order_list krls)) i)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    95
      else no_tac
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    96
    end);
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    97
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    98
(*Resolve the subgoal using the rules (making a net) unless too flexible,
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
    99
   which means more than maxr rules are unifiable.      *)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
   100
fun filt_resolve_from_net_tac ctxt maxr net =
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
   101
  let fun pred krls = length krls <= maxr
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
   102
  in filt_resolution_from_net_tac ctxt false pred net end;
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
   103
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
   104
(*versions taking pre-built nets*)
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
   105
fun resolve_from_net_tac ctxt = filt_resolution_from_net_tac ctxt false (K true);
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
   106
fun match_from_net_tac ctxt = filt_resolution_from_net_tac ctxt true (K true);
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
   107
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
   108
end;
61aae966dd95 clarified modules: explicit structure Bires;
wenzelm
parents:
diff changeset
   109