src/Provers/quantifier1.ML
author wenzelm
Mon, 13 Apr 2020 22:08:14 +0200
changeset 71751 abf3e80bd815
parent 71512 fe93a863d946
child 71773 7c2f4dd48fb6
permissions -rw-r--r--
tuned NEWS;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35762
af3ff2ba4c54 removed old CVS Ids;
wenzelm
parents: 31197
diff changeset
     1
(*  Title:      Provers/quantifier1.ML
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
     2
    Author:     Tobias Nipkow
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
     3
    Copyright   1997  TU Munich
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
     4
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
     5
Simplification procedures for turning
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
     6
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
     7
            ? x. ... & x = t & ...
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
     8
     into   ? x. x = t & ... & ...
11232
558a4feebb04 generalization of 1 point rules for ALL
nipkow
parents: 11221
diff changeset
     9
     where the `? x. x = t &' in the latter formula must be eliminated
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    10
           by ordinary simplification.
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    11
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    12
     and   ! x. (... & x = t & ...) --> P x
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    13
     into  ! x. x = t --> (... & ...) --> P x
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    14
     where the `!x. x=t -->' in the latter formula is eliminated
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    15
           by ordinary simplification.
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    16
11232
558a4feebb04 generalization of 1 point rules for ALL
nipkow
parents: 11221
diff changeset
    17
     And analogously for t=x, but the eqn is not turned around!
558a4feebb04 generalization of 1 point rules for ALL
nipkow
parents: 11221
diff changeset
    18
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    19
     NB Simproc is only triggered by "!x. P(x) & P'(x) --> Q(x)";
38456
6769ccd90ad6 typos in comment
blanchet
parents: 36610
diff changeset
    20
        "!x. x=t --> P(x)" is covered by the congruence rule for -->;
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    21
        "!x. t=x --> P(x)" must be taken care of by an ordinary rewrite rule.
11232
558a4feebb04 generalization of 1 point rules for ALL
nipkow
parents: 11221
diff changeset
    22
        As must be "? x. t=x & P(x)".
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    23
11221
60c6e91f6079 added simproc for bounded quantifiers
nipkow
parents: 7951
diff changeset
    24
     And similarly for the bounded quantifiers.
60c6e91f6079 added simproc for bounded quantifiers
nipkow
parents: 7951
diff changeset
    25
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    26
Gries etc call this the "1 point rules"
31166
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
    27
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
    28
The above also works for !x1..xn. and ?x1..xn by moving the defined
38456
6769ccd90ad6 typos in comment
blanchet
parents: 36610
diff changeset
    29
quantifier inside first, but not for nested bounded quantifiers.
31166
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
    30
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
    31
For set comprehensions the basic permutations
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
    32
      ... & x = t & ...  ->  x = t & (... & ...)
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
    33
      ... & t = x & ...  ->  t = x & (... & ...)
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
    34
are also exported.
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
    35
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
    36
To avoid looping, NONE is returned if the term cannot be rearranged,
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
    37
esp if x=t/t=x sits at the front already.
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    38
*)
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    39
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    40
signature QUANTIFIER1_DATA =
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    41
sig
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    42
  (*abstract syntax*)
42460
1805c67dc7aa simplified Data signature;
wenzelm
parents: 42459
diff changeset
    43
  val dest_eq: term -> (term * term) option
1805c67dc7aa simplified Data signature;
wenzelm
parents: 42459
diff changeset
    44
  val dest_conj: term -> (term * term) option
1805c67dc7aa simplified Data signature;
wenzelm
parents: 42459
diff changeset
    45
  val dest_imp: term -> (term * term) option
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    46
  val conj: term
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    47
  val imp: term
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    48
  (*rules*)
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    49
  val iff_reflection: thm (* P <-> Q ==> P == Q *)
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    50
  val iffI: thm
12523
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
    51
  val iff_trans: thm
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    52
  val conjI: thm
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    53
  val conjE: thm
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    54
  val impI: thm
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    55
  val mp: thm
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    56
  val exI: thm
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    57
  val exE: thm
11232
558a4feebb04 generalization of 1 point rules for ALL
nipkow
parents: 11221
diff changeset
    58
  val uncurry: thm (* P --> Q --> R ==> P & Q --> R *)
558a4feebb04 generalization of 1 point rules for ALL
nipkow
parents: 11221
diff changeset
    59
  val iff_allI: thm (* !!x. P x <-> Q x ==> (!x. P x) = (!x. Q x) *)
12523
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
    60
  val iff_exI: thm (* !!x. P x <-> Q x ==> (? x. P x) = (? x. Q x) *)
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
    61
  val all_comm: thm (* (!x y. P x y) = (!y x. P x y) *)
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
    62
  val ex_comm: thm (* (? x y. P x y) = (? y x. P x y) *)
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    63
end;
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    64
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    65
signature QUANTIFIER1 =
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    66
sig
59498
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
    67
  val prove_one_point_all_tac: Proof.context -> tactic
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
    68
  val prove_one_point_ex_tac: Proof.context -> tactic
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 42460
diff changeset
    69
  val rearrange_all: Proof.context -> cterm -> thm option
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
    70
  val rearrange_All: Proof.context -> cterm -> thm option
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 42460
diff changeset
    71
  val rearrange_ex: Proof.context -> cterm -> thm option
54998
8601434fa334 tuned signature;
wenzelm
parents: 51717
diff changeset
    72
  val rearrange_ball: (Proof.context -> tactic) -> Proof.context -> cterm -> thm option
8601434fa334 tuned signature;
wenzelm
parents: 51717
diff changeset
    73
  val rearrange_bex: (Proof.context -> tactic) -> Proof.context -> cterm -> thm option
8601434fa334 tuned signature;
wenzelm
parents: 51717
diff changeset
    74
  val rearrange_Collect: (Proof.context -> tactic) -> Proof.context -> cterm -> thm option
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    75
end;
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    76
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    77
functor Quantifier1(Data: QUANTIFIER1_DATA): QUANTIFIER1 =
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    78
struct
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    79
11232
558a4feebb04 generalization of 1 point rules for ALL
nipkow
parents: 11221
diff changeset
    80
(* FIXME: only test! *)
12523
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
    81
fun def xs eq =
42457
de868abd131e do not open ML structures;
wenzelm
parents: 42456
diff changeset
    82
  (case Data.dest_eq eq of
42460
1805c67dc7aa simplified Data signature;
wenzelm
parents: 42459
diff changeset
    83
    SOME (s, t) =>
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    84
      let val n = length xs in
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    85
        s = Bound n andalso not (loose_bvar1 (t, n)) orelse
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    86
        t = Bound n andalso not (loose_bvar1 (s, n))
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    87
      end
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    88
  | NONE => false);
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
    89
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    90
fun extract_conj fst xs t =
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    91
  (case Data.dest_conj t of
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    92
    NONE => NONE
42460
1805c67dc7aa simplified Data signature;
wenzelm
parents: 42459
diff changeset
    93
  | SOME (P, Q) =>
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    94
      if def xs P then (if fst then NONE else SOME (xs, P, Q))
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    95
      else if def xs Q then SOME (xs, Q, P)
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    96
      else
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    97
        (case extract_conj false xs P of
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    98
          SOME (xs, eq, P') => SOME (xs, eq, Data.conj $ P' $ Q)
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
    99
        | NONE =>
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   100
            (case extract_conj false xs Q of
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   101
              SOME (xs, eq, Q') => SOME (xs, eq, Data.conj $ P $ Q')
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   102
            | NONE => NONE)));
11232
558a4feebb04 generalization of 1 point rules for ALL
nipkow
parents: 11221
diff changeset
   103
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   104
fun extract_imp fst xs t =
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   105
  (case Data.dest_imp t of
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   106
    NONE => NONE
42460
1805c67dc7aa simplified Data signature;
wenzelm
parents: 42459
diff changeset
   107
  | SOME (P, Q) =>
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   108
      if def xs P then (if fst then NONE else SOME (xs, P, Q))
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   109
      else
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   110
        (case extract_conj false xs P of
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   111
          SOME (xs, eq, P') => SOME (xs, eq, Data.imp $ P' $ Q)
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   112
        | NONE =>
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   113
            (case extract_imp false xs Q of
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   114
              NONE => NONE
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   115
            | SOME (xs, eq, Q') => SOME (xs, eq, Data.imp $ P $ Q'))));
12523
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
   116
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   117
fun extract_conj_from_judgment ctxt fst xs t =
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   118
  if Object_Logic.is_judgment ctxt t
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   119
  then
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   120
    (case extract_conj fst xs (Object_Logic.drop_judgment ctxt t) of
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   121
      NONE => NONE
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   122
    | SOME (xs, eq, P) => SOME (xs, Object_Logic.ensure_propT ctxt eq, Object_Logic.ensure_propT ctxt P))
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   123
  else NONE;
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   124
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   125
fun extract_implies ctxt fst xs t =
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   126
  (case try Logic.dest_implies t of
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   127
    NONE => NONE
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   128
  | SOME (P, Q) =>
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   129
      if def xs P then (if fst then NONE else SOME (xs, P, Q))
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   130
      else
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   131
        (case extract_conj_from_judgment ctxt false xs P of
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   132
          SOME (xs, eq, P') => SOME (xs, eq, Logic.implies $ P' $ Q)
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   133
        | NONE =>
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   134
            (case extract_implies ctxt false xs Q of
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   135
              NONE => NONE
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   136
            | SOME (xs, eq, Q') => (SOME (xs, eq, Logic.implies $ P $ Q')))));
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   137
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   138
fun extract_quant ctxt extract q =
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   139
  let
42460
1805c67dc7aa simplified Data signature;
wenzelm
parents: 42459
diff changeset
   140
    fun exqu xs ((qC as Const (qa, _)) $ Abs (x, T, Q)) =
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   141
          if qa = q then exqu ((qC, x, T) :: xs) Q else NONE
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   142
      | exqu xs P = extract ctxt (null xs) xs P
31166
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
   143
  in exqu [] end;
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
   144
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   145
fun iff_reflection_tac ctxt =
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   146
  resolve_tac ctxt [Data.iff_reflection] 1;
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
   147
59498
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   148
fun qcomm_tac ctxt qcomm qI i =
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   149
  REPEAT_DETERM (resolve_tac ctxt [qcomm] i THEN resolve_tac ctxt [qI] i);
12523
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
   150
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
   151
(* Proves (? x0..xn. ... & x0 = t & ...) = (? x1..xn x0. x0 = t & ... & ...)
11221
60c6e91f6079 added simproc for bounded quantifiers
nipkow
parents: 7951
diff changeset
   152
   Better: instantiate exI
60c6e91f6079 added simproc for bounded quantifiers
nipkow
parents: 7951
diff changeset
   153
*)
12523
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
   154
local
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   155
  val excomm = Data.ex_comm RS Data.iff_trans;
12523
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
   156
in
59498
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   157
  fun prove_one_point_ex_tac ctxt =
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   158
    qcomm_tac ctxt excomm Data.iff_exI 1 THEN resolve_tac ctxt [Data.iffI] 1 THEN
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   159
    ALLGOALS
59498
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   160
      (EVERY' [eresolve_tac ctxt [Data.exE], REPEAT_DETERM o eresolve_tac ctxt [Data.conjE],
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   161
        resolve_tac ctxt [Data.exI],
60774
6c28d8ed2488 proper context;
wenzelm
parents: 59582
diff changeset
   162
        DEPTH_SOLVE_1 o ares_tac ctxt [Data.conjI]])
12523
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
   163
end;
11221
60c6e91f6079 added simproc for bounded quantifiers
nipkow
parents: 7951
diff changeset
   164
12523
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
   165
(* Proves (! x0..xn. (... & x0 = t & ...) --> P x0) =
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
   166
          (! x1..xn x0. x0 = t --> (... & ...) --> P x0)
11221
60c6e91f6079 added simproc for bounded quantifiers
nipkow
parents: 7951
diff changeset
   167
*)
11232
558a4feebb04 generalization of 1 point rules for ALL
nipkow
parents: 11221
diff changeset
   168
local
59498
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   169
  fun tac ctxt =
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   170
    SELECT_GOAL
59498
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   171
      (EVERY1 [REPEAT o dresolve_tac ctxt [Data.uncurry],
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   172
        REPEAT o resolve_tac ctxt [Data.impI],
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   173
        eresolve_tac ctxt [Data.mp],
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   174
        REPEAT o eresolve_tac ctxt [Data.conjE],
60774
6c28d8ed2488 proper context;
wenzelm
parents: 59582
diff changeset
   175
        REPEAT o ares_tac ctxt [Data.conjI]]);
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   176
  val all_comm = Data.all_comm RS Data.iff_trans;
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   177
  val All_comm = @{thm swap_params [THEN transitive]};
11232
558a4feebb04 generalization of 1 point rules for ALL
nipkow
parents: 11221
diff changeset
   178
in
59498
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   179
  fun prove_one_point_all_tac ctxt =
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   180
    EVERY1 [qcomm_tac ctxt all_comm Data.iff_allI,
59498
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
   181
      resolve_tac ctxt [Data.iff_allI],
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   182
      resolve_tac ctxt [Data.iffI],
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   183
      tac ctxt,
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   184
      tac ctxt];
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   185
  fun prove_one_point_All_tac ctxt =
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   186
    EVERY1 [qcomm_tac ctxt All_comm @{thm equal_allI},
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   187
      resolve_tac ctxt [@{thm equal_allI}],
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   188
      resolve_tac ctxt [@{thm equal_intr_rule}],
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   189
      Object_Logic.atomize_prems_tac ctxt,
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   190
      tac ctxt,
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   191
      Object_Logic.atomize_prems_tac ctxt,
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   192
      tac ctxt];
11232
558a4feebb04 generalization of 1 point rules for ALL
nipkow
parents: 11221
diff changeset
   193
end
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
   194
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   195
fun prove_conv ctxt tu tac =
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   196
  let
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   197
    val (goal, ctxt') =
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   198
      yield_singleton (Variable.import_terms true) (Logic.mk_equals tu) ctxt;
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   199
    val thm =
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   200
      Goal.prove ctxt' [] [] goal
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   201
        (fn {context = ctxt'', ...} => tac ctxt'');
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   202
  in singleton (Variable.export ctxt' ctxt) thm end;
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   203
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   204
fun renumber l u (Bound i) =
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   205
      Bound (if i < l orelse i > u then i else if i = u then l else i + 1)
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   206
  | renumber l u (s $ t) = renumber l u s $ renumber l u t
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   207
  | renumber l u (Abs (x, T, t)) = Abs (x, T, renumber (l + 1) (u + 1) t)
12523
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
   208
  | renumber _ _ atom = atom;
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
   209
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
   210
fun quantify qC x T xs P =
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   211
  let
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   212
    fun quant [] P = P
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   213
      | quant ((qC, x, T) :: xs) P = quant xs (qC $ Abs (x, T, P));
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   214
    val n = length xs;
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   215
    val Q = if n = 0 then P else renumber 0 n P;
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   216
  in quant xs (qC $ Abs (x, T, Q)) end;
12523
0d8d5bf549b0 now permutations of quantifiers are allowed as well.
nipkow
parents: 11232
diff changeset
   217
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 42460
diff changeset
   218
fun rearrange_all ctxt ct =
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59498
diff changeset
   219
  (case Thm.term_of ct of
42459
38b9f023cc34 misc tuning and simplification;
wenzelm
parents: 42458
diff changeset
   220
    F as (all as Const (q, _)) $ Abs (x, T, P) =>
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   221
      (case extract_quant ctxt (K extract_imp) q P of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15027
diff changeset
   222
        NONE => NONE
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   223
      | SOME (xs, eq, Q) =>
42457
de868abd131e do not open ML structures;
wenzelm
parents: 42456
diff changeset
   224
          let val R = quantify all x T xs (Data.imp $ eq $ Q)
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   225
          in SOME (prove_conv ctxt (F, R) (iff_reflection_tac THEN' prove_one_point_all_tac)) end)
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   226
  | _ => NONE);
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   227
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   228
fun rearrange_All ctxt ct =
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   229
  (case Thm.term_of ct of
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   230
    F as (all as Const (q, _)) $ Abs (x, T, P) =>
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   231
      (case extract_quant ctxt extract_implies q P of
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   232
        NONE => NONE
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   233
      | SOME (xs, eq, Q) =>
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   234
          let val R = quantify all x T xs (Logic.implies $ eq $ Q)
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   235
            in SOME (prove_conv ctxt (F, R) prove_one_point_All_tac) end)
42459
38b9f023cc34 misc tuning and simplification;
wenzelm
parents: 42458
diff changeset
   236
  | _ => NONE);
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
   237
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 42460
diff changeset
   238
fun rearrange_ball tac ctxt ct =
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59498
diff changeset
   239
  (case Thm.term_of ct of
42459
38b9f023cc34 misc tuning and simplification;
wenzelm
parents: 42458
diff changeset
   240
    F as Ball $ A $ Abs (x, T, P) =>
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   241
      (case extract_imp true [] P of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15027
diff changeset
   242
        NONE => NONE
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   243
      | SOME (xs, eq, Q) =>
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   244
          if not (null xs) then NONE
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   245
          else
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   246
            let val R = Data.imp $ eq $ Q
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   247
            in SOME (prove_conv ctxt (F, Ball $ A $ Abs (x, T, R)) (iff_reflection_tac THEN' tac)) end)
42459
38b9f023cc34 misc tuning and simplification;
wenzelm
parents: 42458
diff changeset
   248
  | _ => NONE);
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
   249
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 42460
diff changeset
   250
fun rearrange_ex ctxt ct =
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59498
diff changeset
   251
  (case Thm.term_of ct of
42459
38b9f023cc34 misc tuning and simplification;
wenzelm
parents: 42458
diff changeset
   252
    F as (ex as Const (q, _)) $ Abs (x, T, P) =>
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   253
      (case extract_quant ctxt (K extract_conj) q P of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15027
diff changeset
   254
        NONE => NONE
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   255
      | SOME (xs, eq, Q) =>
42457
de868abd131e do not open ML structures;
wenzelm
parents: 42456
diff changeset
   256
          let val R = quantify ex x T xs (Data.conj $ eq $ Q)
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   257
          in SOME (prove_conv ctxt (F, R) (iff_reflection_tac THEN' prove_one_point_ex_tac)) end)
42459
38b9f023cc34 misc tuning and simplification;
wenzelm
parents: 42458
diff changeset
   258
  | _ => NONE);
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
   259
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 42460
diff changeset
   260
fun rearrange_bex tac ctxt ct =
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59498
diff changeset
   261
  (case Thm.term_of ct of
42459
38b9f023cc34 misc tuning and simplification;
wenzelm
parents: 42458
diff changeset
   262
    F as Bex $ A $ Abs (x, T, P) =>
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   263
      (case extract_conj true [] P of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 15027
diff changeset
   264
        NONE => NONE
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   265
      | SOME (xs, eq, Q) =>
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   266
          if not (null xs) then NONE
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   267
          else SOME (prove_conv ctxt (F, Bex $ A $ Abs (x, T, Data.conj $ eq $ Q)) (iff_reflection_tac THEN' tac)))
42459
38b9f023cc34 misc tuning and simplification;
wenzelm
parents: 42458
diff changeset
   268
  | _ => NONE);
11221
60c6e91f6079 added simproc for bounded quantifiers
nipkow
parents: 7951
diff changeset
   269
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 42460
diff changeset
   270
fun rearrange_Collect tac ctxt ct =
59582
0fbed69ff081 tuned signature -- prefer qualified names;
wenzelm
parents: 59498
diff changeset
   271
  (case Thm.term_of ct of
42459
38b9f023cc34 misc tuning and simplification;
wenzelm
parents: 42458
diff changeset
   272
    F as Collect $ Abs (x, T, P) =>
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   273
      (case extract_conj true [] P of
31166
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
   274
        NONE => NONE
42458
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   275
      | SOME (_, eq, Q) =>
5dfae6d348fd misc tuning;
wenzelm
parents: 42457
diff changeset
   276
          let val R = Collect $ Abs (x, T, Data.conj $ eq $ Q)
71512
fe93a863d946 infrastructure for extraction of equations x = t from premises beneath meta-all
haftmann
parents: 60774
diff changeset
   277
          in SOME (prove_conv ctxt (F, R) (iff_reflection_tac THEN' tac)) end)
42459
38b9f023cc34 misc tuning and simplification;
wenzelm
parents: 42458
diff changeset
   278
  | _ => NONE);
31166
a90fe83f58ea "{x. P x & x=t & Q x}" is now rewritten to "if P t & Q t then {t} else {}"
nipkow
parents: 20049
diff changeset
   279
4319
afb60b8bf15e Quantifier elimination procs.
nipkow
parents:
diff changeset
   280
end;
42460
1805c67dc7aa simplified Data signature;
wenzelm
parents: 42459
diff changeset
   281