src/HOL/Metis_Examples/TransClosure.thy
author blanchet
Wed, 28 Apr 2010 14:19:26 +0200
changeset 36490 5abf45444a16
parent 35096 f36965a1fd42
child 36494 2478dd225b68
permissions -rw-r--r--
redo Sledgehammer proofs (and get rid of "neg_clausify")
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23449
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
     1
(*  Title:      HOL/MetisTest/TransClosure.thy
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
     2
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
     3
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
     4
Testing the metis method
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
     5
*)
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
     6
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
     7
theory TransClosure
36490
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
     8
imports Sledgehammer2d (* ### *)
23449
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
     9
begin
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    10
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    11
types addr = nat
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    12
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    13
datatype val
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    14
  = Unit        -- "dummy result value of void expressions"
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    15
  | Null        -- "null reference"
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    16
  | Bool bool   -- "Boolean value"
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    17
  | Intg int    -- "integer value" 
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    18
  | Addr addr   -- "addresses of objects in the heap"
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    19
36490
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    20
consts R :: "(addr \<times> addr) set"
23449
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    21
36490
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    22
consts f :: "addr \<Rightarrow> val"
23449
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    23
36490
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    24
lemma "\<lbrakk>f c = Intg x; \<forall>y. f b = Intg y \<longrightarrow> y \<noteq> x; (a, b) \<in> R\<^sup>*; (b, c) \<in> R\<^sup>*\<rbrakk>
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    25
       \<Longrightarrow> \<exists>c. (b, c) \<in> R \<and> (a, c) \<in> R\<^sup>*"
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    26
by (metis converse_rtranclE transitive_closure_trans(6))
23449
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    27
36490
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    28
lemma "\<lbrakk>f c = Intg x; \<forall>y. f b = Intg y \<longrightarrow> y \<noteq> x; (a, b) \<in> R\<^sup>*; (b,c) \<in> R\<^sup>*\<rbrakk>
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    29
       \<Longrightarrow> \<exists>c. (b, c) \<in> R \<and> (a, c) \<in> R\<^sup>*"
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    30
(* sledgehammer [isar_proof, shrink_factor = 2] *)
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    31
proof -
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    32
  assume A1: "f c = Intg x"
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    33
  assume A2: "\<forall>y. f b = Intg y \<longrightarrow> y \<noteq> x"
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    34
  assume A3: "(a, b) \<in> R\<^sup>*"
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    35
  assume A4: "(b, c) \<in> R\<^sup>*"
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    36
  have "(R\<^sup>*) (a, b)" using A3 by (metis mem_def)
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    37
  hence F1: "(a, b) \<in> R\<^sup>*" by (metis mem_def)
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    38
  have "b \<noteq> c" using A1 A2 by metis
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    39
  hence "\<exists>x\<^isub>1. (b, x\<^isub>1) \<in> R" using A4 by (metis mem_def converse_rtranclE)
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    40
  thus "\<exists>c. (b, c) \<in> R \<and> (a, c) \<in> R\<^sup>*" using F1 by (metis transitive_closure_trans(6))
23449
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    41
qed
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    42
36490
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    43
lemma "\<lbrakk>f c = Intg x; \<forall>y. f b = Intg y \<longrightarrow> y \<noteq> x; (a, b) \<in> R\<^sup>*; (b, c) \<in> R\<^sup>*\<rbrakk> 
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    44
       \<Longrightarrow> \<exists>c. (b, c) \<in> R \<and> (a, c) \<in> R\<^sup>*"
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    45
apply (erule_tac x = b in converse_rtranclE)
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    46
 apply metis
5abf45444a16 redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents: 35096
diff changeset
    47
by (metis transitive_closure_trans(6))
23449
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    48
dd874e6a3282 integration of Metis prover
paulson
parents:
diff changeset
    49
end