doc-src/TutorialI/CTL/CTLind.thy
author chaieb
Wed, 19 May 2004 11:23:59 +0200
changeset 14758 af3b71a46a1c
parent 12815 1f073030b97a
child 15904 a6fb4ddc05c7
permissions -rw-r--r--
A new implementation for presburger arithmetic following the one suggested in technical report Chaieb Amine and Tobias Nipkow. It is generic an smaller. the tactic has also changed and allows the abstaction over fuction occurences whose type is nat or int.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
     1
(*<*)theory CTLind = CTL:(*>*)
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
     2
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10855
diff changeset
     3
subsection{*CTL Revisited*}
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
     4
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
     5
text{*\label{sec:CTL-revisited}
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
     6
\index{CTL|(}%
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
     7
The purpose of this section is twofold: to demonstrate
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
     8
some of the induction principles and heuristics discussed above and to
10281
9554ce1c2e54 *** empty log message ***
nipkow
parents: 10241
diff changeset
     9
show how inductive definitions can simplify proofs.
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    10
In \S\ref{sec:CTL} we gave a fairly involved proof of the correctness of a
10795
9e888d60d3e5 minor edits to Chapters 1-3
paulson
parents: 10281
diff changeset
    11
model checker for CTL\@. In particular the proof of the
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    12
@{thm[source]infinity_lemma} on the way to @{thm[source]AF_lemma2} is not as
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
    13
simple as one might expect, due to the @{text SOME} operator
10281
9554ce1c2e54 *** empty log message ***
nipkow
parents: 10241
diff changeset
    14
involved. Below we give a simpler proof of @{thm[source]AF_lemma2}
9554ce1c2e54 *** empty log message ***
nipkow
parents: 10241
diff changeset
    15
based on an auxiliary inductive definition.
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    16
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    17
Let us call a (finite or infinite) path \emph{@{term A}-avoiding} if it does
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    18
not touch any node in the set @{term A}. Then @{thm[source]AF_lemma2} says
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    19
that if no infinite path from some state @{term s} is @{term A}-avoiding,
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    20
then @{prop"s \<in> lfp(af A)"}. We prove this by inductively defining the set
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    21
@{term"Avoid s A"} of states reachable from @{term s} by a finite @{term
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    22
A}-avoiding path:
10241
e0428c2778f1 wellfounded -> well-founded
paulson
parents: 10235
diff changeset
    23
% Second proof of opposite direction, directly by well-founded induction
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    24
% on the initial segment of M that avoids A.
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    25
*}
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    26
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    27
consts Avoid :: "state \<Rightarrow> state set \<Rightarrow> state set";
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    28
inductive "Avoid s A"
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    29
intros "s \<in> Avoid s A"
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    30
       "\<lbrakk> t \<in> Avoid s A; t \<notin> A; (t,u) \<in> M \<rbrakk> \<Longrightarrow> u \<in> Avoid s A";
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    31
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    32
text{*
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    33
It is easy to see that for any infinite @{term A}-avoiding path @{term f}
12492
a4dd02e744e0 *** empty log message ***
nipkow
parents: 11494
diff changeset
    34
with @{prop"f(0::nat) \<in> Avoid s A"} there is an infinite @{term A}-avoiding path
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    35
starting with @{term s} because (by definition of @{term Avoid}) there is a
12492
a4dd02e744e0 *** empty log message ***
nipkow
parents: 11494
diff changeset
    36
finite @{term A}-avoiding path from @{term s} to @{term"f(0::nat)"}.
a4dd02e744e0 *** empty log message ***
nipkow
parents: 11494
diff changeset
    37
The proof is by induction on @{prop"f(0::nat) \<in> Avoid s A"}. However,
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    38
this requires the following
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    39
reformulation, as explained in \S\ref{sec:ind-var-in-prems} above;
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    40
the @{text rule_format} directive undoes the reformulation after the proof.
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    41
*}
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    42
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    43
lemma ex_infinite_path[rule_format]:
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    44
  "t \<in> Avoid s A  \<Longrightarrow>
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    45
   \<forall>f\<in>Paths t. (\<forall>i. f i \<notin> A) \<longrightarrow> (\<exists>p\<in>Paths s. \<forall>i. p i \<notin> A)";
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    46
apply(erule Avoid.induct);
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    47
 apply(blast);
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    48
apply(clarify);
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    49
apply(drule_tac x = "\<lambda>i. case i of 0 \<Rightarrow> t | Suc i \<Rightarrow> f i" in bspec);
12815
wenzelm
parents: 12492
diff changeset
    50
apply(simp_all add: Paths_def split: nat.split);
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    51
done
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    52
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    53
text{*\noindent
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
    54
The base case (@{prop"t = s"}) is trivial and proved by @{text blast}.
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    55
In the induction step, we have an infinite @{term A}-avoiding path @{term f}
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    56
starting from @{term u}, a successor of @{term t}. Now we simply instantiate
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    57
the @{text"\<forall>f\<in>Paths t"} in the induction hypothesis by the path starting with
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    58
@{term t} and continuing with @{term f}. That is what the above $\lambda$-term
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10855
diff changeset
    59
expresses.  Simplification shows that this is a path starting with @{term t} 
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10855
diff changeset
    60
and that the instantiated induction hypothesis implies the conclusion.
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    61
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    62
Now we come to the key lemma. Assuming that no infinite @{term A}-avoiding
11277
a2bff98d6e5d *** empty log message ***
nipkow
parents: 11196
diff changeset
    63
path starts from @{term s}, we want to show @{prop"s \<in> lfp(af A)"}. For the
a2bff98d6e5d *** empty log message ***
nipkow
parents: 11196
diff changeset
    64
inductive proof this must be generalized to the statement that every point @{term t}
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
    65
``between'' @{term s} and @{term A}, in other words all of @{term"Avoid s A"},
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    66
is contained in @{term"lfp(af A)"}:
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    67
*}
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    68
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    69
lemma Avoid_in_lfp[rule_format(no_asm)]:
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    70
  "\<forall>p\<in>Paths s. \<exists>i. p i \<in> A \<Longrightarrow> t \<in> Avoid s A \<longrightarrow> t \<in> lfp(af A)";
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    71
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    72
txt{*\noindent
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    73
The proof is by induction on the ``distance'' between @{term t} and @{term
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    74
A}. Remember that @{prop"lfp(af A) = A \<union> M\<inverse> `` lfp(af A)"}.
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    75
If @{term t} is already in @{term A}, then @{prop"t \<in> lfp(af A)"} is
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    76
trivial. If @{term t} is not in @{term A} but all successors are in
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    77
@{term"lfp(af A)"} (induction hypothesis), then @{prop"t \<in> lfp(af A)"} is
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    78
again trivial.
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    79
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    80
The formal counterpart of this proof sketch is a well-founded induction
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
    81
on~@{term M} restricted to @{term"Avoid s A - A"}, roughly speaking:
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    82
@{term[display]"{(y,x). (x,y) \<in> M \<and> x \<in> Avoid s A \<and> x \<notin> A}"}
11277
a2bff98d6e5d *** empty log message ***
nipkow
parents: 11196
diff changeset
    83
As we shall see presently, the absence of infinite @{term A}-avoiding paths
10241
e0428c2778f1 wellfounded -> well-founded
paulson
parents: 10235
diff changeset
    84
starting from @{term s} implies well-foundedness of this relation. For the
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    85
moment we assume this and proceed with the induction:
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    86
*}
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    87
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    88
apply(subgoal_tac "wf{(y,x). (x,y) \<in> M \<and> x \<in> Avoid s A \<and> x \<notin> A}");
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    89
 apply(erule_tac a = t in wf_induct);
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    90
 apply(clarsimp);
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    91
(*<*)apply(rename_tac t)(*>*)
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    92
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    93
txt{*\noindent
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10855
diff changeset
    94
@{subgoals[display,indent=0,margin=65]}
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10855
diff changeset
    95
Now the induction hypothesis states that if @{prop"t \<notin> A"}
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
    96
then all successors of @{term t} that are in @{term"Avoid s A"} are in
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    97
@{term"lfp (af A)"}. Unfolding @{term lfp} in the conclusion of the first
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
    98
subgoal once, we have to prove that @{term t} is in @{term A} or all successors
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
    99
of @{term t} are in @{term"lfp (af A)"}.  But if @{term t} is not in @{term A},
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
   100
the second 
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   101
@{term Avoid}-rule implies that all successors of @{term t} are in
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
   102
@{term"Avoid s A"}, because we also assume @{prop"t \<in> Avoid s A"}.
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
   103
Hence, by the induction hypothesis, all successors of @{term t} are indeed in
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   104
@{term"lfp(af A)"}. Mechanically:
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   105
*}
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   106
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
   107
 apply(subst lfp_unfold[OF mono_af]);
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
   108
 apply(simp (no_asm) add: af_def);
12815
wenzelm
parents: 12492
diff changeset
   109
 apply(blast intro: Avoid.intros);
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   110
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   111
txt{*
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
   112
Having proved the main goal, we return to the proof obligation that the 
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
   113
relation used above is indeed well-founded. This is proved by contradiction: if
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10855
diff changeset
   114
the relation is not well-founded then there exists an infinite @{term
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   115
A}-avoiding path all in @{term"Avoid s A"}, by theorem
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   116
@{thm[source]wf_iff_no_infinite_down_chain}:
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   117
@{thm[display]wf_iff_no_infinite_down_chain[no_vars]}
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   118
From lemma @{thm[source]ex_infinite_path} the existence of an infinite
10885
90695f46440b lcp's pass over the book, chapters 1-8
paulson
parents: 10855
diff changeset
   119
@{term A}-avoiding path starting in @{term s} follows, contradiction.
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   120
*}
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   121
10235
20cf817f3b4a renaming of contrapos rules
paulson
parents: 10218
diff changeset
   122
apply(erule contrapos_pp);
12815
wenzelm
parents: 12492
diff changeset
   123
apply(simp add: wf_iff_no_infinite_down_chain);
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   124
apply(erule exE);
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   125
apply(rule ex_infinite_path);
12815
wenzelm
parents: 12492
diff changeset
   126
apply(auto simp add: Paths_def);
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   127
done
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   128
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   129
text{*
11196
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
   130
The @{text"(no_asm)"} modifier of the @{text"rule_format"} directive in the
bb4ede27fcb7 *** empty log message ***
nipkow
parents: 10971
diff changeset
   131
statement of the lemma means
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
   132
that the assumption is left unchanged; otherwise the @{text"\<forall>p"} 
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
   133
would be turned
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   134
into a @{text"\<And>p"}, which would complicate matters below. As it is,
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   135
@{thm[source]Avoid_in_lfp} is now
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   136
@{thm[display]Avoid_in_lfp[no_vars]}
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   137
The main theorem is simply the corollary where @{prop"t = s"},
11494
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
   138
when the assumption @{prop"t \<in> Avoid s A"} is trivially true
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
   139
by the first @{term Avoid}-rule. Isabelle confirms this:%
23a118849801 revisions and indexing
paulson
parents: 11277
diff changeset
   140
\index{CTL|)}*}
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   141
10855
140a1ed65665 *** empty log message ***
nipkow
parents: 10845
diff changeset
   142
theorem AF_lemma2:  "{s. \<forall>p \<in> Paths s. \<exists> i. p i \<in> A} \<subseteq> lfp(af A)";
12815
wenzelm
parents: 12492
diff changeset
   143
by(auto elim: Avoid_in_lfp intro: Avoid.intros);
10218
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   144
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   145
54411746c549 *** empty log message ***
nipkow
parents:
diff changeset
   146
(*<*)end(*>*)