src/HOL/Induct/Acc.thy
author wenzelm
Thu, 07 Sep 2000 21:10:11 +0200
changeset 9906 5c027cca6262
parent 9802 adda1dc18bb8
child 9941 fe05af7ec816
permissions -rw-r--r--
updated attribute names;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3120
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
     1
(*  Title:      HOL/ex/Acc.thy
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
     2
    ID:         $Id$
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
     3
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
     4
    Copyright   1994  University of Cambridge
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
     5
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
     6
Inductive definition of acc(r)
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
     7
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
     8
See Ch. Paulin-Mohring, Inductive Definitions in the System Coq.
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
     9
Research Report 92-49, LIP, ENS Lyon.  Dec 1992.
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
    10
*)
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
    11
9101
b643f4d7b9e9 fixed deps;
wenzelm
parents: 7867
diff changeset
    12
header {* The accessible part of a relation *}
7759
44dd5dc8e90f tuned presentation;
wenzelm
parents: 7721
diff changeset
    13
9101
b643f4d7b9e9 fixed deps;
wenzelm
parents: 7867
diff changeset
    14
theory Acc = Main:
3120
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
    15
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
    16
consts
9802
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    17
  acc  :: "('a \<times> 'a) set => 'a set"  -- {* accessible part *}
3120
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
    18
7721
cb353d802ade Tuned inductive definition.
berghofe
parents: 5717
diff changeset
    19
inductive "acc r"
9596
6d6bf351b2cc intros;
wenzelm
parents: 9101
diff changeset
    20
  intros
9906
5c027cca6262 updated attribute names;
wenzelm
parents: 9802
diff changeset
    21
    accI [rulified]:
9802
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    22
      "\<forall>y. (y, x) \<in> r --> y \<in> acc r ==> x \<in> acc r"
3120
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
    23
7800
8ee919e42174 improved presentation;
wenzelm
parents: 7759
diff changeset
    24
syntax
9802
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    25
  termi :: "('a \<times> 'a) set => 'a set"
7800
8ee919e42174 improved presentation;
wenzelm
parents: 7759
diff changeset
    26
translations
9802
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    27
  "termi r" == "acc (r^-1)"
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    28
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    29
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    30
theorem acc_induct:
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    31
  "[| a \<in> acc r;
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    32
      !!x. [| x \<in> acc r;  \<forall>y. (y, x) \<in> r --> P y |] ==> P x
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    33
  |] ==> P a"
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    34
proof -
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    35
  assume major: "a \<in> acc r"
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    36
  assume hyp: "!!x. [| x \<in> acc r;  \<forall>y. (y, x) \<in> r --> P y |] ==> P x"
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    37
  show ?thesis
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    38
    apply (rule major [THEN acc.induct])
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    39
    apply (rule hyp)
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    40
     apply (rule accI)
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    41
     apply fast
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    42
    apply fast
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    43
    done
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    44
qed
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    45
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    46
theorem acc_downward: "[| b \<in> acc r; (a, b) \<in> r |] ==> a \<in> acc r"
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    47
  apply (erule acc.elims)
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    48
  apply fast
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    49
  done
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    50
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    51
lemma acc_downwards_aux: "(b, a) \<in> r^* ==> a \<in> acc r --> b \<in> acc r"
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    52
  apply (erule rtrancl_induct)
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    53
   apply blast
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    54
  apply (blast dest: acc_downward)
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    55
  done
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    56
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    57
theorem acc_downwards: "[| a \<in> acc r; (b, a) \<in> r^* |] ==> b \<in> acc r"
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    58
  apply (blast dest: acc_downwards_aux)
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    59
  done
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    60
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    61
theorem acc_wfI: "\<forall>x. x \<in> acc r ==> wf r"
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    62
  apply (rule wfUNIVI)
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    63
  apply (induct_tac P x rule: acc_induct)
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    64
   apply blast
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    65
  apply blast
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    66
  done
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    67
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    68
theorem acc_wfD: "wf r ==> x \<in> acc r"
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    69
  apply (erule wf_induct)
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    70
  apply (rule accI)
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    71
  apply blast
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    72
  done
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    73
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    74
theorem wf_acc_iff: "wf r = (\<forall>x. x \<in> acc r)"
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    75
  apply (blast intro: acc_wfI dest: acc_wfD)
adda1dc18bb8 converted;
wenzelm
parents: 9596
diff changeset
    76
  done
5273
70f478d55606 Added macro `termi'
nipkow
parents: 5102
diff changeset
    77
3120
c58423c20740 New directory to contain examples of (co)inductive definitions
paulson
parents:
diff changeset
    78
end