src/HOL/Metis_Examples/Clausify.thy
author blanchet
Thu, 14 Apr 2011 11:24:05 +0200
changeset 42343 118cc349de35
parent 42342 6babd86a54a4
child 42345 5ecd55993606
permissions -rw-r--r--
compile
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42343
118cc349de35 compile
blanchet
parents: 42342
diff changeset
     1
(*  Title:      HOL/Metis_Examples/Clausify.thy
42338
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
     2
    Author:     Jasmin Blanchette, TU Muenchen
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
     3
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
     4
Testing Metis's clausifier.
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
     5
*)
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
     6
42343
118cc349de35 compile
blanchet
parents: 42342
diff changeset
     7
theory Clausify
42338
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
     8
imports Complex_Main
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
     9
begin
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    10
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    11
text {* Definitional CNF for goal *}
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    12
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    13
(* FIXME: shouldn't need this *)
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    14
declare [[unify_search_bound = 100]]
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    15
declare [[unify_trace_bound = 100]]
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    16
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    17
axiomatization p :: "nat \<Rightarrow> nat \<Rightarrow> bool" where
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    18
pax: "\<exists>b. \<forall>a. ((p b a \<and> p 0 0 \<and> p 1 a) \<or> (p 0 1 \<and> p 1 0 \<and> p a b))"
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    19
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    20
declare [[metis_new_skolemizer = false]]
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    21
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    22
lemma "\<exists>b. \<forall>a. \<exists>x. (p b a \<or> x) \<and> (p 0 0 \<or> x) \<and> (p 1 a \<or> x) \<and>
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    23
                   (p 0 1 \<or> \<not> x) \<and> (p 1 0 \<or> \<not> x) \<and> (p a b \<or> \<not> x)"
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    24
by (metis pax)
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    25
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    26
lemma "\<exists>b. \<forall>a. \<exists>x. (p b a \<or> x) \<and> (p 0 0 \<or> x) \<and> (p 1 a \<or> x) \<and>
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    27
                   (p 0 1 \<or> \<not> x) \<and> (p 1 0 \<or> \<not> x) \<and> (p a b \<or> \<not> x)"
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    28
by (metisFT pax)
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    29
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    30
declare [[metis_new_skolemizer]]
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    31
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    32
lemma "\<exists>b. \<forall>a. \<exists>x. (p b a \<or> x) \<and> (p 0 0 \<or> x) \<and> (p 1 a \<or> x) \<and>
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    33
                   (p 0 1 \<or> \<not> x) \<and> (p 1 0 \<or> \<not> x) \<and> (p a b \<or> \<not> x)"
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    34
by (metis pax)
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    35
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    36
lemma "\<exists>b. \<forall>a. \<exists>x. (p b a \<or> x) \<and> (p 0 0 \<or> x) \<and> (p 1 a \<or> x) \<and>
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    37
                   (p 0 1 \<or> \<not> x) \<and> (p 1 0 \<or> \<not> x) \<and> (p a b \<or> \<not> x)"
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    38
by (metisFT pax)
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    39
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    40
text {* New Skolemizer *}
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    41
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    42
declare [[metis_new_skolemizer]]
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    43
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    44
lemma
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    45
  fixes x :: real
42342
6babd86a54a4 handle case where the same Skolem name is given different types in different subgoals in the new Skolemizer (this can happen if several type-instances of the same fact are needed by Metis, cf. example in "Clausify.thy") -- the solution reintroduces old code removed in a6725f293377
blanchet
parents: 42340
diff changeset
    46
  assumes fn_le: "!!n. f n \<le> x" and 1: "f ----> lim f"
42338
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    47
  shows "lim f \<le> x"
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    48
by (metis 1 LIMSEQ_le_const2 fn_le)
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    49
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    50
definition
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    51
  bounded :: "'a::metric_space set \<Rightarrow> bool" where
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    52
  "bounded S \<longleftrightarrow> (\<exists>x eee. \<forall>y\<in>S. dist x y \<le> eee)"
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    53
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    54
lemma "bounded T \<Longrightarrow> S \<subseteq> T ==> bounded S"
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    55
by (metis bounded_def subset_eq)
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    56
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    57
lemma
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    58
  assumes a: "Quotient R Abs Rep"
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    59
  shows "symp R"
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    60
using a unfolding Quotient_def using sympI
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    61
by metisFT
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    62
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    63
lemma
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    64
  "(\<exists>x \<in> set xs. P x) \<longleftrightarrow>
42342
6babd86a54a4 handle case where the same Skolem name is given different types in different subgoals in the new Skolemizer (this can happen if several type-instances of the same fact are needed by Metis, cf. example in "Clausify.thy") -- the solution reintroduces old code removed in a6725f293377
blanchet
parents: 42340
diff changeset
    65
   (\<exists>ys x zs. xs = ys @ x # zs \<and> P x \<and> (\<forall>z \<in> set zs. \<not> P z))"
42338
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    66
by (metis split_list_last_prop [where P = P] in_set_conv_decomp)
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    67
42342
6babd86a54a4 handle case where the same Skolem name is given different types in different subgoals in the new Skolemizer (this can happen if several type-instances of the same fact are needed by Metis, cf. example in "Clausify.thy") -- the solution reintroduces old code removed in a6725f293377
blanchet
parents: 42340
diff changeset
    68
lemma ex_tl: "EX ys. tl ys = xs"
6babd86a54a4 handle case where the same Skolem name is given different types in different subgoals in the new Skolemizer (this can happen if several type-instances of the same fact are needed by Metis, cf. example in "Clausify.thy") -- the solution reintroduces old code removed in a6725f293377
blanchet
parents: 42340
diff changeset
    69
using tl.simps(2) by fast
6babd86a54a4 handle case where the same Skolem name is given different types in different subgoals in the new Skolemizer (this can happen if several type-instances of the same fact are needed by Metis, cf. example in "Clausify.thy") -- the solution reintroduces old code removed in a6725f293377
blanchet
parents: 42340
diff changeset
    70
6babd86a54a4 handle case where the same Skolem name is given different types in different subgoals in the new Skolemizer (this can happen if several type-instances of the same fact are needed by Metis, cf. example in "Clausify.thy") -- the solution reintroduces old code removed in a6725f293377
blanchet
parents: 42340
diff changeset
    71
lemma "(\<exists>ys\<Colon>nat list. tl ys = xs) \<and> (\<exists>bs\<Colon>int list. tl bs = as)"
6babd86a54a4 handle case where the same Skolem name is given different types in different subgoals in the new Skolemizer (this can happen if several type-instances of the same fact are needed by Metis, cf. example in "Clausify.thy") -- the solution reintroduces old code removed in a6725f293377
blanchet
parents: 42340
diff changeset
    72
by (metis ex_tl)
6babd86a54a4 handle case where the same Skolem name is given different types in different subgoals in the new Skolemizer (this can happen if several type-instances of the same fact are needed by Metis, cf. example in "Clausify.thy") -- the solution reintroduces old code removed in a6725f293377
blanchet
parents: 42340
diff changeset
    73
42338
802f2fe7a0c9 started clausifier examples
blanchet
parents:
diff changeset
    74
end