src/HOL/meson_lemmas.ML
author paulson
Tue, 11 May 2004 10:48:00 +0200
changeset 14733 3eda95792083
parent 11460 e5fb885bfe3a
permissions -rw-r--r--
conversion to clauses for ordinary resolution rather than ME
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9869
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/meson_lemmas.ML
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
     4
    Copyright   1992  University of Cambridge
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
     5
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
     6
Lemmas for Meson.
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
     7
*)
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
     8
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
     9
(* Generation of contrapositives *)
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    10
14733
3eda95792083 conversion to clauses for ordinary resolution rather than ME
paulson
parents: 11460
diff changeset
    11
(*Inserts negated disjunct after removing the negation; P is a literal.
3eda95792083 conversion to clauses for ordinary resolution rather than ME
paulson
parents: 11460
diff changeset
    12
  Model elimination requires assuming the negation of every attempted subgoal,
3eda95792083 conversion to clauses for ordinary resolution rather than ME
paulson
parents: 11460
diff changeset
    13
  hence the negated disjuncts.*)
9869
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    14
val [major,minor] = Goal "~P|Q ==> ((~P==>P) ==> Q)";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    15
by (rtac (major RS disjE) 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    16
by (rtac notE 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    17
by (etac minor 2);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    18
by (ALLGOALS assume_tac);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    19
qed "make_neg_rule";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    20
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    21
(*For Plaisted's "Postive refinement" of the MESON procedure*)
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    22
Goal "~P|Q ==> (P ==> Q)";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    23
by (Blast_tac 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    24
qed "make_refined_neg_rule";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    25
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    26
(*P should be a literal*)
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    27
val [major,minor] = Goal "P|Q ==> ((P==>~P) ==> Q)";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    28
by (rtac (major RS disjE) 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    29
by (rtac notE 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    30
by (etac minor 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    31
by (ALLGOALS assume_tac);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    32
qed "make_pos_rule";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    33
14733
3eda95792083 conversion to clauses for ordinary resolution rather than ME
paulson
parents: 11460
diff changeset
    34
(** Versions of make_neg_rule and make_pos_rule that don't insert new 
3eda95792083 conversion to clauses for ordinary resolution rather than ME
paulson
parents: 11460
diff changeset
    35
    assumptions, for ordinary resolution. **)
3eda95792083 conversion to clauses for ordinary resolution rather than ME
paulson
parents: 11460
diff changeset
    36
3eda95792083 conversion to clauses for ordinary resolution rather than ME
paulson
parents: 11460
diff changeset
    37
val make_neg_rule' = make_refined_neg_rule;
3eda95792083 conversion to clauses for ordinary resolution rather than ME
paulson
parents: 11460
diff changeset
    38
3eda95792083 conversion to clauses for ordinary resolution rather than ME
paulson
parents: 11460
diff changeset
    39
Goal "[|P|Q; ~P|] ==> Q";
3eda95792083 conversion to clauses for ordinary resolution rather than ME
paulson
parents: 11460
diff changeset
    40
by (Blast_tac 1);
3eda95792083 conversion to clauses for ordinary resolution rather than ME
paulson
parents: 11460
diff changeset
    41
qed "make_pos_rule'";
9869
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    42
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    43
(* Generation of a goal clause -- put away the final literal *)
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    44
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    45
val [major,minor] = Goal "~P ==> ((~P==>P) ==> False)";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    46
by (rtac notE 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    47
by (rtac minor 2);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    48
by (ALLGOALS (rtac major));
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    49
qed "make_neg_goal";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    50
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    51
val [major,minor] = Goal "P ==> ((P==>~P) ==> False)";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    52
by (rtac notE 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    53
by (rtac minor 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    54
by (ALLGOALS (rtac major));
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    55
qed "make_pos_goal";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    56
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    57
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    58
(* Lemmas for forward proof (like congruence rules) *)
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    59
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    60
(*NOTE: could handle conjunctions (faster?) by
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    61
    nf(th RS conjunct2) RS (nf(th RS conjunct1) RS conjI) *)
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    62
val major::prems = Goal
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    63
    "[| P'&Q';  P' ==> P;  Q' ==> Q |] ==> P&Q";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    64
by (rtac (major RS conjE) 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    65
by (rtac conjI 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    66
by (ALLGOALS (eresolve_tac prems));
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    67
qed "conj_forward";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    68
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    69
val major::prems = Goal
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    70
    "[| P'|Q';  P' ==> P;  Q' ==> Q |] ==> P|Q";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    71
by (rtac (major RS disjE) 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    72
by (ALLGOALS (dresolve_tac prems));
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    73
by (ALLGOALS (eresolve_tac [disjI1,disjI2]));
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    74
qed "disj_forward";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    75
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    76
(*Version for removal of duplicate literals*)
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    77
val major::prems = Goal
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    78
    "[| P'|Q';  P' ==> P;  [| Q'; P==>False |] ==> Q |] ==> P|Q";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    79
by (cut_facts_tac [major] 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    80
by (blast_tac (claset() addIs prems) 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    81
qed "disj_forward2";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    82
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    83
val major::prems = Goal
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    84
    "[| ALL x. P'(x);  !!x. P'(x) ==> P(x) |] ==> ALL x. P(x)";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    85
by (rtac allI 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    86
by (resolve_tac prems 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    87
by (rtac (major RS spec) 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    88
qed "all_forward";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    89
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    90
val major::prems = Goal
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    91
    "[| EX x. P'(x);  !!x. P'(x) ==> P(x) |] ==> EX x. P(x)";
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    92
by (rtac (major RS exE) 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    93
by (rtac exI 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    94
by (eresolve_tac prems 1);
95dca9f991f2 improved meson setup;
wenzelm
parents:
diff changeset
    95
qed "ex_forward";