doc-src/TutorialI/Inductive/Star.thy
author nipkow
Tue, 17 Oct 2000 16:59:02 +0200
changeset 10237 875bf54b5d74
parent 10225 b9fd52525b69
child 10242 028f54cd2cc9
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
     1
(*<*)theory Star = Main:(*>*)
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
     2
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
     3
section{*The reflexive transitive closure*}
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
     4
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
     5
text{*
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
     6
A perfect example of an inductive definition is the reflexive transitive
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
     7
closure of a relation. This concept was already introduced in
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
     8
\S\ref{sec:rtrancl}, but it was not shown how it is defined. In fact,
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
     9
the operator @{text"^*"} is not defined inductively but via a least
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    10
fixpoint because at that point in the theory hierarchy
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    11
inductive definitions are not yet available. But now they are:
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    12
*}
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    13
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    14
consts rtc :: "('a \<times> 'a)set \<Rightarrow> ('a \<times> 'a)set"  ("_*" [1000] 999)
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    15
inductive "r*"
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    16
intros
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    17
rtc_refl[intro!]:                        "(x,x) \<in> r*"
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    18
rtc_step: "\<lbrakk> (x,y) \<in> r*; (y,z) \<in> r \<rbrakk> \<Longrightarrow> (x,z) \<in> r*"
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    19
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    20
lemma [intro]: "(x,y) : r \<Longrightarrow> (x,y) \<in> r*"
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    21
by(blast intro: rtc_step);
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    22
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    23
lemma step2[rule_format]:
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    24
  "(y,z) \<in> r*  \<Longrightarrow> (x,y) \<in> r \<longrightarrow> (x,z) \<in> r*"
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    25
apply(erule rtc.induct)
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    26
 apply(blast);
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    27
apply(blast intro: rtc_step);
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    28
done
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    29
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    30
lemma rtc_trans[rule_format]:
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    31
  "(x,y) \<in> r*  \<Longrightarrow> \<forall>z. (y,z) \<in> r* \<longrightarrow> (x,z) \<in> r*"
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    32
apply(erule rtc.induct)
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    33
 apply blast;
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    34
apply(blast intro: step2);
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    35
done
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    36
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    37
consts rtc2 :: "('a \<times> 'a)set \<Rightarrow> ('a \<times> 'a)set"
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    38
inductive "rtc2 r"
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    39
intros
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    40
"(x,y) \<in> r \<Longrightarrow> (x,y) \<in> rtc2 r"
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    41
"(x,x) \<in> rtc2 r"
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    42
"\<lbrakk> (x,y) \<in> rtc2 r; (y,z) \<in> rtc2 r \<rbrakk> \<Longrightarrow> (x,z) \<in> rtc2 r"
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    43
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    44
text{*
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    45
The equivalence of the two definitions is easily shown by the obvious rule
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    46
inductions:
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    47
*}
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    48
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    49
lemma "(x,y) \<in> rtc2 r \<Longrightarrow> (x,y) \<in> r*"
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    50
apply(erule rtc2.induct);
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    51
  apply(blast);
10237
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    52
 apply(blast);
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    53
apply(blast intro: rtc_trans);
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    54
done
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    55
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    56
lemma "(x,y) \<in> r* \<Longrightarrow> (x,y) \<in> rtc2 r"
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    57
apply(erule rtc.induct);
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    58
 apply(blast intro: rtc2.intros);
875bf54b5d74 *** empty log message ***
nipkow
parents: 10225
diff changeset
    59
apply(blast intro: rtc2.intros);
10225
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    60
done
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    61
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    62
(*<*)end(*>*)