src/ZF/ex/proplog.ML
author clasohm
Thu, 16 Sep 1993 12:20:38 +0200
changeset 0 a5a9c433f639
child 7 268f93ab3bc4
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	ZF/ex/prop-log.ML
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Tobias Nipkow & Lawrence C Paulson
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1992  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
For ex/prop-log.thy.  Inductive definition of propositional logic.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
Soundness and completeness w.r.t. truth-tables.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
Prove: If H|=p then G|=p where G:Fin(H)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
open PropLog;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
(*** prop_rec -- by Vset recursion ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
val prop_congs = mk_typed_congs Prop.thy 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
		   [("b", "[i,i,i]=>i"), ("d", "[i,i,i,i]=>i")];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
(** conversion rules **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
goal PropLog.thy "prop_rec(Fls,b,c,d) = b";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
by (rtac (prop_rec_def RS def_Vrec RS trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
by (rewrite_goals_tac Prop.con_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
by (SIMP_TAC rank_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
val prop_rec_Fls = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
goal PropLog.thy "prop_rec(#v,b,c,d) = c(v)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
by (rtac (prop_rec_def RS def_Vrec RS trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
by (rewrite_goals_tac Prop.con_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
by (SIMP_TAC (rank_ss addcongs prop_congs) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
val prop_rec_Var = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
goal PropLog.thy "prop_rec(p=>q,b,c,d) = \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
\      d(p, q, prop_rec(p,b,c,d), prop_rec(q,b,c,d))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
by (rtac (prop_rec_def RS def_Vrec RS trans) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
by (rewrite_goals_tac Prop.con_defs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
by (SIMP_TAC (rank_ss addcongs prop_congs) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
val prop_rec_Imp = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
val prop_rec_ss = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
    arith_ss addrews [prop_rec_Fls, prop_rec_Var, prop_rec_Imp];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
(*** Semantics of propositional logic ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
(** The function is_true **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
goalw PropLog.thy [is_true_def] "is_true(Fls,t) <-> False";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
by (SIMP_TAC (prop_rec_ss addrews [one_not_0 RS not_sym]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
val is_true_Fls = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
goalw PropLog.thy [is_true_def] "is_true(#v,t) <-> v:t";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
by (SIMP_TAC (prop_rec_ss addrews [one_not_0 RS not_sym] 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
	      addsplits [expand_if]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
val is_true_Var = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
goalw PropLog.thy [is_true_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
    "is_true(p=>q,t) <-> (is_true(p,t)-->is_true(q,t))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
by (SIMP_TAC (prop_rec_ss addsplits [expand_if]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
val is_true_Imp = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
(** The function hyps **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
goalw PropLog.thy [hyps_def] "hyps(Fls,t) = 0";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
by (SIMP_TAC prop_rec_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
val hyps_Fls = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
goalw PropLog.thy [hyps_def] "hyps(#v,t) = {if(v:t, #v, #v=>Fls)}";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
by (SIMP_TAC prop_rec_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
val hyps_Var = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
goalw PropLog.thy [hyps_def] "hyps(p=>q,t) = hyps(p,t) Un hyps(q,t)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
by (SIMP_TAC prop_rec_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
val hyps_Imp = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
val prop_ss = prop_rec_ss 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
    addcongs Prop.congs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
    addcongs (mk_congs PropLog.thy ["Fin", "thms", "op |=","is_true","hyps"])
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
    addrews Prop.intrs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
    addrews [is_true_Fls, is_true_Var, is_true_Imp,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
	     hyps_Fls, hyps_Var, hyps_Imp];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
(*** Proof theory of propositional logic ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
structure PropThms = Inductive_Fun
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
 (val thy = PropLog.thy;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
  val rec_doms = [("thms","prop")];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
  val sintrs = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
      ["[| p:H;  p:prop |] ==> H |- p",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
       "[| p:prop;  q:prop |] ==> H |- p=>q=>p",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
       "[| p:prop;  q:prop;  r:prop |] ==> H |- (p=>q=>r) => (p=>q) => p=>r",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
       "p:prop ==> H |- ((p=>Fls) => Fls) => p",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
       "[| H |- p=>q;  H |- p;  p:prop;  q:prop |] ==> H |- q"];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
  val monos = [];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
  val con_defs = [];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
  val type_intrs = Prop.intrs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
  val type_elims = []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
goalw PropThms.thy PropThms.defs "!!G H. G<=H ==> thms(G) <= thms(H)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
by (rtac lfp_mono 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
by (REPEAT (rtac PropThms.bnd_mono 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
by (REPEAT (ares_tac (univ_mono::basic_monos) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
val thms_mono = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
val thms_in_pl = PropThms.dom_subset RS subsetD;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
val [thms_H, thms_K, thms_S, thms_DN, weak_thms_MP] = PropThms.intrs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
(*Modus Ponens rule -- this stronger version avoids typecheck*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
goal PropThms.thy "!!p q H. [| H |- p=>q;  H |- p |] ==> H |- q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
by (rtac weak_thms_MP 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
by (REPEAT (eresolve_tac [asm_rl, thms_in_pl, thms_in_pl RS ImpE] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
val thms_MP = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
(*Rule is called I for Identity Combinator, not for Introduction*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
goal PropThms.thy "!!p H. p:prop ==> H |- p=>p";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
by (rtac (thms_S RS thms_MP RS thms_MP) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
by (rtac thms_K 5);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
by (rtac thms_K 4);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
by (REPEAT (ares_tac [ImpI] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
val thms_I = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   122
(** Weakening, left and right **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   123
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
(* [| G<=H;  G|-p |] ==> H|-p   Order of premises is convenient with RS*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
val weaken_left = standard (thms_mono RS subsetD);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
(* H |- p ==> cons(a,H) |- p *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
val weaken_left_cons = subset_consI RS weaken_left;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
val weaken_left_Un1  = Un_upper1 RS weaken_left;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
val weaken_left_Un2  = Un_upper2 RS weaken_left;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
goal PropThms.thy "!!H p q. [| H |- q;  p:prop |] ==> H |- p=>q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
by (rtac (thms_K RS thms_MP) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
by (REPEAT (ares_tac [thms_in_pl] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
val weaken_right = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   137
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
(*The deduction theorem*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
goal PropThms.thy "!!p q H. [| cons(p,H) |- q;  p:prop |] ==>  H |- p=>q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
by (etac PropThms.induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
by (fast_tac (ZF_cs addIs [thms_I, thms_H RS weaken_right]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   142
by (fast_tac (ZF_cs addIs [thms_K RS weaken_right]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
by (fast_tac (ZF_cs addIs [thms_S RS weaken_right]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
by (fast_tac (ZF_cs addIs [thms_DN RS weaken_right]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
by (fast_tac (ZF_cs addIs [thms_S RS thms_MP RS thms_MP]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
val deduction = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   149
(*The cut rule*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
goal PropThms.thy "!!H p q. [| H|-p;  cons(p,H) |- q |] ==>  H |- q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
by (rtac (deduction RS thms_MP) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
by (REPEAT (ares_tac [thms_in_pl] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
val cut = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   155
goal PropThms.thy "!!H p. [| H |- Fls; p:prop |] ==> H |- p";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
by (rtac (thms_DN RS thms_MP) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   157
by (rtac weaken_right 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   158
by (REPEAT (ares_tac (Prop.intrs@[consI1]) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
val thms_FlsE = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
(* [| H |- p=>Fls;  H |- p;  q: prop |] ==> H |- q *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
val thms_notE = standard (thms_MP RS thms_FlsE);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   163
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   164
(*Soundness of the rules wrt truth-table semantics*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   165
val [major] = goalw PropThms.thy [sat_def] "H |- p ==> H |= p";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   166
by (rtac (major RS PropThms.induct) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   167
by (fast_tac (ZF_cs addSDs [is_true_Imp RS iffD1 RS mp]) 5);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   168
by (ALLGOALS (SIMP_TAC prop_ss));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   169
val soundness = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   170
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   171
(*** Towards the completeness proof ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
val [premf,premq] = goal PropThms.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
    "[| H |- p=>Fls; q: prop |] ==> H |- p=>q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   175
by (rtac (premf RS thms_in_pl RS ImpE) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
by (rtac deduction 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   177
by (rtac (premf RS weaken_left_cons RS thms_notE) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
by (REPEAT (ares_tac [premq, consI1, thms_H] 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   179
val Fls_Imp = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   180
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   181
val [premp,premq] = goal PropThms.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   182
    "[| H |- p;  H |- q=>Fls |] ==> H |- (p=>q)=>Fls";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   183
by (cut_facts_tac ([premp,premq] RL [thms_in_pl]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   184
by (etac ImpE 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
by (rtac deduction 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   186
by (rtac (premq RS weaken_left_cons RS thms_MP) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   187
by (rtac (consI1 RS thms_H RS thms_MP) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   188
by (rtac (premp RS weaken_left_cons) 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   189
by (REPEAT (ares_tac Prop.intrs 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   190
val Imp_Fls = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   191
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   192
(*Typical example of strengthening the induction formula*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   193
val [major] = goal PropThms.thy 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   194
    "p: prop ==> hyps(p,t) |- if(is_true(p,t), p, p=>Fls)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   195
by (rtac (expand_if RS iffD2) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   196
by (rtac (major RS Prop.induct) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   197
by (ALLGOALS (ASM_SIMP_TAC (prop_ss addrews [thms_I, thms_H])));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   198
by (fast_tac (ZF_cs addIs [weaken_left_Un1, weaken_left_Un2, 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   199
			   weaken_right, Imp_Fls]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   200
                    addSEs [Fls_Imp]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   201
val hyps_thms_if = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   202
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   203
(*Key lemma for completeness; yields a set of assumptions satisfying p*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   204
val [premp,sat] = goalw PropThms.thy [sat_def]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   205
    "[| p: prop;  0 |= p |] ==> hyps(p,t) |- p";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   206
by (rtac (sat RS spec RS mp RS if_P RS subst) 1 THEN
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   207
    rtac (premp RS hyps_thms_if) 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   208
by (fast_tac ZF_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   209
val sat_thms_p = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   210
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   211
(*For proving certain theorems in our new propositional logic*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   212
val thms_cs = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   213
    ZF_cs addSIs [FlsI, VarI, ImpI, deduction]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   214
          addIs [thms_in_pl, thms_H, thms_H RS thms_MP];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   215
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   216
(*The excluded middle in the form of an elimination rule*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   217
val prems = goal PropThms.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   218
    "[| p: prop;  q: prop |] ==> H |- (p=>q) => ((p=>Fls)=>q) => q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   219
by (rtac (deduction RS deduction) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   220
by (rtac (thms_DN RS thms_MP) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   221
by (ALLGOALS (best_tac (thms_cs addSIs prems)));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   222
val thms_excluded_middle = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   223
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   224
(*Hard to prove directly because it requires cuts*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   225
val prems = goal PropThms.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   226
    "[| cons(p,H) |- q;  cons(p=>Fls,H) |- q;  p: prop |] ==> H |- q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   227
by (rtac (thms_excluded_middle RS thms_MP RS thms_MP) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   228
by (REPEAT (resolve_tac (prems@Prop.intrs@[deduction,thms_in_pl]) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   229
val thms_excluded_middle_rule = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   230
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   231
(*** Completeness -- lemmas for reducing the set of assumptions ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   232
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   233
(*For the case hyps(p,t)-cons(#v,Y) |- p;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   234
  we also have hyps(p,t)-{#v} <= hyps(p, t-{v}) *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   235
val [major] = goal PropThms.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   236
    "p: prop ==> hyps(p, t-{v}) <= cons(#v=>Fls, hyps(p,t)-{#v})";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   237
by (rtac (major RS Prop.induct) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   238
by (SIMP_TAC prop_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   239
by (ASM_SIMP_TAC (prop_ss addsplits [expand_if]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   240
by (fast_tac (ZF_cs addSEs Prop.free_SEs) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   241
by (ASM_SIMP_TAC prop_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   242
by (fast_tac ZF_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   243
val hyps_Diff = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   244
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   245
(*For the case hyps(p,t)-cons(#v => Fls,Y) |- p;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   246
  we also have hyps(p,t)-{#v=>Fls} <= hyps(p, cons(v,t)) *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   247
val [major] = goal PropThms.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   248
    "p: prop ==> hyps(p, cons(v,t)) <= cons(#v, hyps(p,t)-{#v=>Fls})";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   249
by (rtac (major RS Prop.induct) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   250
by (SIMP_TAC prop_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   251
by (ASM_SIMP_TAC (prop_ss addsplits [expand_if]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   252
by (fast_tac (ZF_cs addSEs Prop.free_SEs) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   253
by (ASM_SIMP_TAC prop_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   254
by (fast_tac ZF_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   255
val hyps_cons = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   256
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   257
(** Two lemmas for use with weaken_left **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   258
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   259
goal ZF.thy "B-C <= cons(a, B-cons(a,C))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   260
by (fast_tac ZF_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   261
val cons_Diff_same = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   262
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   263
goal ZF.thy "cons(a, B-{c}) - D <= cons(a, B-cons(c,D))";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   264
by (fast_tac ZF_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   265
val cons_Diff_subset2 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   266
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   267
(*The set hyps(p,t) is finite, and elements have the form #v or #v=>Fls;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   268
 could probably prove the stronger hyps(p,t) : Fin(hyps(p,0) Un hyps(p,nat))*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   269
val [major] = goal PropThms.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   270
    "p: prop ==> hyps(p,t) : Fin(UN v:nat. {#v, #v=>Fls})";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   271
by (rtac (major RS Prop.induct) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   272
by (ASM_SIMP_TAC (prop_ss addrews [Fin_0I, Fin_consI, UN_I] 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   273
		  addsplits [expand_if]) 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   274
by (ALLGOALS (ASM_SIMP_TAC (prop_ss addrews [Un_0, Fin_0I, Fin_UnI])));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   275
val hyps_finite = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   276
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   277
val Diff_weaken_left = subset_refl RSN (2, Diff_mono) RS weaken_left;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   278
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   279
(*Induction on the finite set of assumptions hyps(p,t0).
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   280
  We may repeatedly subtract assumptions until none are left!*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   281
val [premp,sat] = goal PropThms.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   282
    "[| p: prop;  0 |= p |] ==> ALL t. hyps(p,t) - hyps(p,t0) |- p";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   283
by (rtac (premp RS hyps_finite RS Fin_induct) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   284
by (SIMP_TAC (prop_ss addrews [premp, sat, sat_thms_p, Diff_0]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   285
by (safe_tac ZF_cs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   286
(*Case hyps(p,t)-cons(#v,Y) |- p *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   287
by (rtac thms_excluded_middle_rule 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   288
by (etac VarI 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   289
by (rtac (cons_Diff_same RS weaken_left) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   290
by (etac spec 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   291
by (rtac (cons_Diff_subset2 RS weaken_left) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   292
by (rtac (premp RS hyps_Diff RS Diff_weaken_left) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   293
by (etac spec 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   294
(*Case hyps(p,t)-cons(#v => Fls,Y) |- p *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   295
by (rtac thms_excluded_middle_rule 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   296
by (etac VarI 3);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   297
by (rtac (cons_Diff_same RS weaken_left) 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   298
by (etac spec 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   299
by (rtac (cons_Diff_subset2 RS weaken_left) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   300
by (rtac (premp RS hyps_cons RS Diff_weaken_left) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   301
by (etac spec 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   302
val completeness_0_lemma = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   303
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   304
(*The base case for completeness*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   305
val [premp,sat] = goal PropThms.thy "[| p: prop;  0 |= p |] ==> 0 |- p";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   306
by (rtac (Diff_cancel RS subst) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   307
by (rtac (sat RS (premp RS completeness_0_lemma RS spec)) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   308
val completeness_0 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   309
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   310
(*A semantic analogue of the Deduction Theorem*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   311
goalw PropThms.thy [sat_def] "!!H p q. [| cons(p,H) |= q |] ==> H |= p=>q";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   312
by (SIMP_TAC prop_ss 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   313
by (fast_tac ZF_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   314
val sat_Imp = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   315
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   316
goal PropThms.thy "!!H. H: Fin(prop) ==> ALL p:prop. H |= p --> H |- p";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   317
by (etac Fin_induct 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   318
by (safe_tac (ZF_cs addSIs [completeness_0]));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   319
by (rtac (weaken_left_cons RS thms_MP) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   320
by (fast_tac (ZF_cs addSIs [sat_Imp,ImpI]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   321
by (fast_tac thms_cs 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   322
val completeness_lemma = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   323
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   324
val completeness = completeness_lemma RS bspec RS mp;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   325
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   326
val [finite] = goal PropThms.thy "H: Fin(prop) ==> H |- p <-> H |= p & p:prop";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   327
by (fast_tac (ZF_cs addSEs [soundness, finite RS completeness, 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   328
			    thms_in_pl]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   329
val thms_iff = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   330
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   331
writeln"Reached end of file.";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   332
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   333