src/FOL/ex/Miniscope.thy
author wenzelm
Sun, 12 Mar 2017 18:50:02 +0100
changeset 65202 187277b77d50
parent 61489 b8d375aee0df
child 68536 e14848001c4c
permissions -rw-r--r--
suppress vacuous messages;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19820
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
     1
(*  Title:      FOL/ex/Miniscope.thy
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
     2
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
     3
    Copyright   1994  University of Cambridge
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
     4
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
     5
Classical First-Order Logic.
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
     6
Conversion to nnf/miniscope format: pushing quantifiers in.
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
     7
Demonstration of formula rewriting by proof.
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
     8
*)
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
     9
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    10
theory Miniscope
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    11
imports FOL
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    12
begin
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    13
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    14
lemmas ccontr = FalseE [THEN classical]
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    15
60770
240563fbf41d isabelle update_cartouches;
wenzelm
parents: 59498
diff changeset
    16
subsection \<open>Negation Normal Form\<close>
19820
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    17
60770
240563fbf41d isabelle update_cartouches;
wenzelm
parents: 59498
diff changeset
    18
subsubsection \<open>de Morgan laws\<close>
19820
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    19
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    20
lemma demorgans:
61489
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    21
  "\<not> (P \<and> Q) \<longleftrightarrow> \<not> P \<or> \<not> Q"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    22
  "\<not> (P \<or> Q) \<longleftrightarrow> \<not> P \<and> \<not> Q"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    23
  "\<not> \<not> P \<longleftrightarrow> P"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    24
  "\<And>P. \<not> (\<forall>x. P(x)) \<longleftrightarrow> (\<exists>x. \<not> P(x))"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    25
  "\<And>P. \<not> (\<exists>x. P(x)) \<longleftrightarrow> (\<forall>x. \<not> P(x))"
19820
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    26
  by blast+
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    27
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    28
(*** Removal of --> and <-> (positive and negative occurrences) ***)
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    29
(*Last one is important for computing a compact CNF*)
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    30
lemma nnf_simps:
61489
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    31
  "(P \<longrightarrow> Q) \<longleftrightarrow> (\<not> P \<or> Q)"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    32
  "\<not> (P \<longrightarrow> Q) \<longleftrightarrow> (P \<and> \<not> Q)"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    33
  "(P \<longleftrightarrow> Q) \<longleftrightarrow> (\<not> P \<or> Q) \<and> (\<not> Q \<or> P)"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    34
  "\<not> (P \<longleftrightarrow> Q) \<longleftrightarrow> (P \<or> Q) \<and> (\<not> P \<or> \<not> Q)"
19820
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    35
  by blast+
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    36
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    37
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    38
(* BEWARE: rewrite rules for <-> can confuse the simplifier!! *)
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    39
60770
240563fbf41d isabelle update_cartouches;
wenzelm
parents: 59498
diff changeset
    40
subsubsection \<open>Pushing in the existential quantifiers\<close>
19820
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    41
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    42
lemma ex_simps:
61489
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    43
  "(\<exists>x. P) \<longleftrightarrow> P"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    44
  "\<And>P Q. (\<exists>x. P(x) \<and> Q) \<longleftrightarrow> (\<exists>x. P(x)) \<and> Q"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    45
  "\<And>P Q. (\<exists>x. P \<and> Q(x)) \<longleftrightarrow> P \<and> (\<exists>x. Q(x))"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    46
  "\<And>P Q. (\<exists>x. P(x) \<or> Q(x)) \<longleftrightarrow> (\<exists>x. P(x)) \<or> (\<exists>x. Q(x))"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    47
  "\<And>P Q. (\<exists>x. P(x) \<or> Q) \<longleftrightarrow> (\<exists>x. P(x)) \<or> Q"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    48
  "\<And>P Q. (\<exists>x. P \<or> Q(x)) \<longleftrightarrow> P \<or> (\<exists>x. Q(x))"
19820
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    49
  by blast+
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    50
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    51
60770
240563fbf41d isabelle update_cartouches;
wenzelm
parents: 59498
diff changeset
    52
subsubsection \<open>Pushing in the universal quantifiers\<close>
19820
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    53
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    54
lemma all_simps:
61489
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    55
  "(\<forall>x. P) \<longleftrightarrow> P"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    56
  "\<And>P Q. (\<forall>x. P(x) \<and> Q(x)) \<longleftrightarrow> (\<forall>x. P(x)) \<and> (\<forall>x. Q(x))"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    57
  "\<And>P Q. (\<forall>x. P(x) \<and> Q) \<longleftrightarrow> (\<forall>x. P(x)) \<and> Q"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    58
  "\<And>P Q. (\<forall>x. P \<and> Q(x)) \<longleftrightarrow> P \<and> (\<forall>x. Q(x))"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    59
  "\<And>P Q. (\<forall>x. P(x) \<or> Q) \<longleftrightarrow> (\<forall>x. P(x)) \<or> Q"
b8d375aee0df more symbols;
wenzelm
parents: 60770
diff changeset
    60
  "\<And>P Q. (\<forall>x. P \<or> Q(x)) \<longleftrightarrow> P \<or> (\<forall>x. Q(x))"
19820
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    61
  by blast+
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    62
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    63
lemmas mini_simps = demorgans nnf_simps ex_simps all_simps
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    64
60770
240563fbf41d isabelle update_cartouches;
wenzelm
parents: 59498
diff changeset
    65
ML \<open>
51717
9e7d1c139569 simplifier uses proper Proof.context instead of historic type simpset;
wenzelm
parents: 31974
diff changeset
    66
val mini_ss = simpset_of (@{context} addsimps @{thms mini_simps});
59498
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
    67
fun mini_tac ctxt =
50b60f501b05 proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents: 58838
diff changeset
    68
  resolve_tac ctxt @{thms ccontr} THEN' asm_full_simp_tac (put_simpset mini_ss ctxt);
60770
240563fbf41d isabelle update_cartouches;
wenzelm
parents: 59498
diff changeset
    69
\<close>
19820
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    70
0d7564c798d0 removed obsolete ML files;
wenzelm
parents:
diff changeset
    71
end