doc-src/TutorialI/Inductive/Acc.thy
author nipkow
Thu, 02 Nov 2000 15:44:13 +0100
changeset 10366 dd74d0a56df9
parent 10315 ec30a7d15f76
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10315
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
     1
(*  Title:      HOL/ex/Acc.thy
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
     2
    ID:         $Id$
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
     4
    Copyright   1994  University of Cambridge
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
     5
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
     6
Inductive definition of acc(r)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
     7
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
     8
See Ch. Paulin-Mohring, Inductive Definitions in the System Coq.
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
     9
Research Report 92-49, LIP, ENS Lyon.  Dec 1992.
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    10
*)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    11
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    12
header {* The accessible part of a relation *}
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    13
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    14
theory Acc = Main:
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    15
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    16
consts
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    17
  acc  :: "('a \<times> 'a) set => 'a set"  -- {* accessible part *}
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    18
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    19
inductive "acc r"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    20
  intros
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    21
    accI [rule_format]:
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    22
      "\<forall>y. (y, x) \<in> r --> y \<in> acc r ==> x \<in> acc r"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    23
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    24
syntax
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    25
  termi :: "('a \<times> 'a) set => 'a set"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    26
translations
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    27
  "termi r" == "acc (r^-1)"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    28
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    29
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    30
theorem acc_induct:
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    31
  "[| a \<in> acc r;
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    32
      !!x. [| x \<in> acc r;  \<forall>y. (y, x) \<in> r --> P y |] ==> P x
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    33
  |] ==> P a"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    34
proof -
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    35
  assume major: "a \<in> acc r"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    36
  assume hyp: "!!x. [| x \<in> acc r;  \<forall>y. (y, x) \<in> r --> P y |] ==> P x"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    37
  show ?thesis
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    38
    apply (rule major [THEN acc.induct])
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    39
    apply (rule hyp)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    40
     apply (rule accI)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    41
     apply fast
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    42
    apply fast
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    43
    done
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    44
qed
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    45
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    46
theorem acc_downward: "[| b \<in> acc r; (a, b) \<in> r |] ==> a \<in> acc r"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    47
  apply (erule acc.elims)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    48
  apply fast
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    49
  done
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    50
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    51
lemma acc_downwards_aux: "(b, a) \<in> r^* ==> a \<in> acc r --> b \<in> acc r"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    52
  apply (erule rtrancl_induct)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    53
   apply blast
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    54
  apply (blast dest: acc_downward)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    55
  done
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    56
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    57
theorem acc_downwards: "[| a \<in> acc r; (b, a) \<in> r^* |] ==> b \<in> acc r"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    58
  apply (blast dest: acc_downwards_aux)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    59
  done
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    60
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    61
theorem acc_wfI: "\<forall>x. x \<in> acc r ==> wf r"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    62
  apply (rule wfUNIVI)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    63
  apply (induct_tac P x rule: acc_induct)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    64
   apply blast
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    65
  apply blast
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    66
  done
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    67
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    68
theorem acc_wfD: "wf r ==> x \<in> acc r"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    69
  apply (erule wf_induct)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    70
  apply (rule accI)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    71
  apply blast
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    72
  done
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    73
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    74
theorem wf_acc_iff: "wf r = (\<forall>x. x \<in> acc r)"
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    75
  apply (blast intro: acc_wfI dest: acc_wfD)
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    76
  done
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    77
ec30a7d15f76 Acc example
paulson
parents:
diff changeset
    78
end