author | wenzelm |
Tue, 05 Apr 2011 14:25:18 +0200 | |
changeset 42224 | 578a51fae383 |
parent 42104 | 22e37d9bc21c |
permissions | -rw-r--r-- |
41141
ad923cdd4a5d
added example to exercise higher-order reasoning with Sledgehammer and Metis
blanchet
parents:
36925
diff
changeset
|
1 |
(* Title: HOL/Metis_Examples/TransClosure.thy |
23449 | 2 |
Author: Lawrence C Paulson, Cambridge University Computer Laboratory |
41144 | 3 |
Author: Jasmin Blanchette, TU Muenchen |
23449 | 4 |
|
41144 | 5 |
Testing Metis. |
23449 | 6 |
*) |
7 |
||
8 |
theory TransClosure |
|
36494
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
9 |
imports Main |
23449 | 10 |
begin |
11 |
||
42104
22e37d9bc21c
made one more Metis example use the new Skolemizer
blanchet
parents:
41144
diff
changeset
|
12 |
declare [[metis_new_skolemizer]] |
22e37d9bc21c
made one more Metis example use the new Skolemizer
blanchet
parents:
41144
diff
changeset
|
13 |
|
22e37d9bc21c
made one more Metis example use the new Skolemizer
blanchet
parents:
41144
diff
changeset
|
14 |
type_synonym addr = nat |
23449 | 15 |
|
16 |
datatype val |
|
17 |
= Unit -- "dummy result value of void expressions" |
|
18 |
| Null -- "null reference" |
|
19 |
| Bool bool -- "Boolean value" |
|
42104
22e37d9bc21c
made one more Metis example use the new Skolemizer
blanchet
parents:
41144
diff
changeset
|
20 |
| Intg int -- "integer value" |
23449 | 21 |
| Addr addr -- "addresses of objects in the heap" |
22 |
||
36490
5abf45444a16
redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents:
35096
diff
changeset
|
23 |
consts R :: "(addr \<times> addr) set" |
23449 | 24 |
|
36490
5abf45444a16
redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents:
35096
diff
changeset
|
25 |
consts f :: "addr \<Rightarrow> val" |
23449 | 26 |
|
36490
5abf45444a16
redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents:
35096
diff
changeset
|
27 |
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
|
28 |
\<Longrightarrow> \<exists>c. (b, c) \<in> R \<and> (a, c) \<in> R\<^sup>*" |
36501
6c7ba330ab42
disabled spurious invocation of (interactive) sledgehammer;
wenzelm
parents:
36494
diff
changeset
|
29 |
(* sledgehammer *) |
36494
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
30 |
proof - |
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
31 |
assume A1: "f c = Intg x" |
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
32 |
assume A2: "\<forall>y. f b = Intg y \<longrightarrow> y \<noteq> x" |
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
33 |
assume A3: "(a, b) \<in> R\<^sup>*" |
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
34 |
assume A4: "(b, c) \<in> R\<^sup>*" |
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
35 |
have F1: "f c \<noteq> f b" using A2 A1 by metis |
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
36 |
have F2: "\<forall>u. (b, u) \<in> R \<longrightarrow> (a, u) \<in> R\<^sup>*" using A3 by (metis transitive_closure_trans(6)) |
42104
22e37d9bc21c
made one more Metis example use the new Skolemizer
blanchet
parents:
41144
diff
changeset
|
37 |
have F3: "\<exists>x. (b, x b c R) \<in> R \<or> c = b" using A4 by (metis converse_rtranclE) |
36494
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
38 |
have "c \<noteq> b" using F1 by metis |
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
39 |
hence "\<exists>u. (b, u) \<in> R" using F3 by metis |
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
40 |
thus "\<exists>c. (b, c) \<in> R \<and> (a, c) \<in> R\<^sup>*" using F2 by metis |
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
41 |
qed |
23449 | 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>*" |
36925 | 45 |
(* sledgehammer [isar_proof, isar_shrink_factor = 2] *) |
36490
5abf45444a16
redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents:
35096
diff
changeset
|
46 |
proof - |
5abf45444a16
redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents:
35096
diff
changeset
|
47 |
assume A1: "f c = Intg x" |
5abf45444a16
redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents:
35096
diff
changeset
|
48 |
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
|
49 |
assume A3: "(a, b) \<in> R\<^sup>*" |
5abf45444a16
redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents:
35096
diff
changeset
|
50 |
assume A4: "(b, c) \<in> R\<^sup>*" |
5abf45444a16
redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents:
35096
diff
changeset
|
51 |
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
|
52 |
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
|
53 |
have "b \<noteq> c" using A1 A2 by metis |
36494
2478dd225b68
add an Isar proof found with Sledgehammer that involves a Skolem constant (internally)
blanchet
parents:
36490
diff
changeset
|
54 |
hence "\<exists>x\<^isub>1. (b, x\<^isub>1) \<in> R" using A4 by (metis converse_rtranclE) |
36490
5abf45444a16
redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents:
35096
diff
changeset
|
55 |
thus "\<exists>c. (b, c) \<in> R \<and> (a, c) \<in> R\<^sup>*" using F1 by (metis transitive_closure_trans(6)) |
23449 | 56 |
qed |
57 |
||
42104
22e37d9bc21c
made one more Metis example use the new Skolemizer
blanchet
parents:
41144
diff
changeset
|
58 |
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> |
36490
5abf45444a16
redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents:
35096
diff
changeset
|
59 |
\<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
|
60 |
apply (erule_tac x = b in converse_rtranclE) |
5abf45444a16
redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents:
35096
diff
changeset
|
61 |
apply metis |
5abf45444a16
redo Sledgehammer proofs (and get rid of "neg_clausify")
blanchet
parents:
35096
diff
changeset
|
62 |
by (metis transitive_closure_trans(6)) |
23449 | 63 |
|
64 |
end |