doc-src/TutorialI/Inductive/Star.thy
author nipkow
Mon, 16 Oct 2000 13:21:01 +0200
changeset 10225 b9fd52525b69
child 10237 875bf54b5d74
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
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
     3
section{*The transitive and reflexive closure*}
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
     4
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
     5
text{*
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
     6
A perfect example of an inductive definition is the transitive, reflexive
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
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    14
consts trc :: "('a \<times> 'a)set \<Rightarrow> ('a \<times> 'a)set"  ("_*" [1000] 999)
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    15
inductive "r*"
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    16
intros
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    17
trc_refl[intro!]:                        "(x,x) \<in> r*"
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    18
trc_step: "\<lbrakk> (x,y) \<in> r*; (y,z) \<in> r \<rbrakk> \<Longrightarrow> (x,z) \<in> r*"
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*"
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    21
by(blast intro: trc_step);
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*"
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    25
apply(erule trc.induct)
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    26
 apply(blast);
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    27
apply(blast intro: trc_step);
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    28
done
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    29
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    30
lemma trc_trans[rule_format]:
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*"
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    32
apply(erule trc.induct)
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
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    37
consts trc2 :: "('a \<times> 'a)set \<Rightarrow> ('a \<times> 'a)set"
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    38
inductive "trc2 r"
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    39
intros
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    40
"(x,y) \<in> r \<Longrightarrow> (x,y) \<in> trc2 r"
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    41
"(x,x) \<in> trc2 r"
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    42
"\<lbrakk> (x,y) \<in> trc2 r; (y,z) \<in> trc2 r \<rbrakk> \<Longrightarrow> (x,z) \<in> trc2 r"
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    43
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    44
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    45
lemma "((x,y) \<in> trc2 r) = ((x,y) \<in> r*)"
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    46
apply(rule iffI);
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    47
 apply(erule trc2.induct);
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    48
   apply(blast);
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    49
  apply(blast);
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    50
 apply(blast intro: trc_trans);
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    51
apply(erule trc.induct);
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    52
 apply(blast intro: trc2.intros);
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    53
apply(blast intro: trc2.intros);
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    54
done
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    55
b9fd52525b69 *** empty log message ***
nipkow
parents:
diff changeset
    56
(*<*)end(*>*)