38 val classical = classical |
38 val classical = classical |
39 val hyp_subst_tacs=[hyp_subst_tac] |
39 val hyp_subst_tacs=[hyp_subst_tac] |
40 end; |
40 end; |
41 |
41 |
42 structure Classical = ClassicalFun(Classical_Data); |
42 structure Classical = ClassicalFun(Classical_Data); |
43 open Classical; |
43 structure BasicClassical: BASIC_CLASSICAL = Classical; |
|
44 open BasicClassical; |
44 |
45 |
45 (*Propositional rules*) |
46 (*Propositional rules*) |
46 val prop_cs = empty_cs addSIs [refl,TrueI,conjI,disjCI,impI,notI,iffI] |
47 val prop_cs = empty_cs addSIs [refl,TrueI,conjI,disjCI,impI,notI,iffI] |
47 addSEs [conjE,disjE,impCE,FalseE,iffCE]; |
48 addSEs [conjE,disjE,impCE,FalseE,iffCE]; |
48 |
49 |
49 (*Quantifier rules*) |
50 (*Quantifier rules*) |
50 val HOL_cs = prop_cs addSIs [allI,ex_ex1I] addIs [exI, select_equality] |
51 val HOL_cs = prop_cs addSIs [allI,ex_ex1I] addIs [exI, select_equality] |
51 addSEs [exE] addEs [allE]; |
52 addSEs [exE] addEs [allE]; |
52 |
53 |
53 claset_ref() := HOL_cs; |
54 val clasetup = [fn thy => (claset_ref_of thy := HOL_cs; thy)]; |
54 |
|
55 (*Better then ex1E for classical reasoner: needs no quantifier duplication!*) |
|
56 val major::prems = goal thy |
|
57 "[| ?! x. P(x); \ |
|
58 \ !!x. [| P(x); ALL y y'. P(y) & P(y') --> y=y' |] ==> R \ |
|
59 \ |] ==> R"; |
|
60 by (rtac (major RS ex1E) 1); |
|
61 by (REPEAT (ares_tac (allI::prems) 1)); |
|
62 by (etac (dup_elim allE) 1); |
|
63 by (Fast_tac 1); |
|
64 qed "alt_ex1E"; |
|
65 |
|
66 AddSEs [alt_ex1E]; |
|
67 |
|
68 (*** Applying BlastFun to create Blast_tac ***) |
|
69 structure Blast_Data = |
|
70 struct |
|
71 type claset = Classical.claset |
|
72 val notE = notE |
|
73 val ccontr = ccontr |
|
74 val contr_tac = Classical.contr_tac |
|
75 val dup_intr = Classical.dup_intr |
|
76 val hyp_subst_tac = Hypsubst.blast_hyp_subst_tac |
|
77 val claset = Classical.claset |
|
78 val rep_cs = Classical.rep_cs |
|
79 val cla_modifiers = Classical.cla_modifiers; |
|
80 val cla_meth' = Classical.cla_meth' |
|
81 end; |
|
82 |
|
83 structure Blast = BlastFun(Blast_Data); |
|
84 Blast.overloaded ("op =", domain_type); (*overloading of equality as iff*) |
|
85 |
|
86 val Blast_tac = Blast.Blast_tac |
|
87 and blast_tac = Blast.blast_tac; |
|