equal
deleted
inserted
replaced
1 (* Title: HOL/Lambda/ListOrder.thy |
1 (* Title: HOL/Lambda/ListOrder.thy |
2 ID: $Id$ |
2 ID: $Id$ |
3 Author: Tobias Nipkow |
3 Author: Tobias Nipkow |
4 Copyright 1998 TU Muenchen |
4 Copyright 1998 TU Muenchen |
5 |
|
6 Lifting an order to lists of elements, relating exactly one element |
|
7 *) |
5 *) |
8 |
6 |
|
7 header {* Lifting an order to lists of elements *} |
|
8 |
9 theory ListOrder = Acc: |
9 theory ListOrder = Acc: |
|
10 |
|
11 text {* |
|
12 Lifting an order to lists of elements, relating exactly one |
|
13 element. |
|
14 *} |
10 |
15 |
11 constdefs |
16 constdefs |
12 step1 :: "('a \<times> 'a) set => ('a list \<times> 'a list) set" |
17 step1 :: "('a \<times> 'a) set => ('a list \<times> 'a list) set" |
13 "step1 r == |
18 "step1 r == |
14 {(ys, xs). \<exists>us z z' vs. xs = us @ z # vs \<and> (z', z) \<in> r \<and> ys = us @ z' # vs}" |
19 {(ys, xs). \<exists>us z z' vs. xs = us @ z # vs \<and> (z', z) \<in> r \<and> ys = |
|
20 us @ z' # vs}" |
15 |
21 |
16 |
22 |
17 lemma step1_converse [simp]: "step1 (r^-1) = (step1 r)^-1" |
23 lemma step1_converse [simp]: "step1 (r^-1) = (step1 r)^-1" |
18 apply (unfold step1_def) |
24 apply (unfold step1_def) |
19 apply blast |
25 apply blast |
32 apply (unfold step1_def) |
38 apply (unfold step1_def) |
33 apply blast |
39 apply blast |
34 done |
40 done |
35 |
41 |
36 lemma Cons_step1_Cons [iff]: |
42 lemma Cons_step1_Cons [iff]: |
37 "((y # ys, x # xs) \<in> step1 r) = ((y, x) \<in> r \<and> xs = ys \<or> x = y \<and> (ys, xs) \<in> step1 r)" |
43 "((y # ys, x # xs) \<in> step1 r) = |
|
44 ((y, x) \<in> r \<and> xs = ys \<or> x = y \<and> (ys, xs) \<in> step1 r)" |
38 apply (unfold step1_def) |
45 apply (unfold step1_def) |
39 apply simp |
46 apply simp |
40 apply (rule iffI) |
47 apply (rule iffI) |
41 apply (erule exE) |
48 apply (erule exE) |
42 apply (rename_tac ts) |
49 apply (rename_tac ts) |
57 apply (blast intro: append_eq_appendI) |
64 apply (blast intro: append_eq_appendI) |
58 done |
65 done |
59 |
66 |
60 lemma Cons_step1E [rulify_prems, elim!]: |
67 lemma Cons_step1E [rulify_prems, elim!]: |
61 "[| (ys, x # xs) \<in> step1 r; |
68 "[| (ys, x # xs) \<in> step1 r; |
62 \<forall>y. ys = y # xs --> (y, x) \<in> r --> R; |
69 \<forall>y. ys = y # xs --> (y, x) \<in> r --> R; |
63 \<forall>zs. ys = x # zs --> (zs, xs) : step1 r --> R |
70 \<forall>zs. ys = x # zs --> (zs, xs) \<in> step1 r --> R |
64 |] ==> R" |
71 |] ==> R" |
65 apply (case_tac ys) |
72 apply (case_tac ys) |
66 apply (simp add: step1_def) |
73 apply (simp add: step1_def) |
67 apply blast |
74 apply blast |
68 done |
75 done |
96 apply simp |
103 apply simp |
97 apply (rule accI) |
104 apply (rule accI) |
98 apply (fast dest: acc_downward) |
105 apply (fast dest: acc_downward) |
99 done |
106 done |
100 |
107 |
101 lemma ex_step1I: "[| x \<in> set xs; (y, x) \<in> r |] |
108 lemma ex_step1I: |
|
109 "[| x \<in> set xs; (y, x) \<in> r |] |
102 ==> \<exists>ys. (ys, xs) \<in> step1 r \<and> y \<in> set ys" |
110 ==> \<exists>ys. (ys, xs) \<in> step1 r \<and> y \<in> set ys" |
103 apply (unfold step1_def) |
111 apply (unfold step1_def) |
104 apply (drule in_set_conv_decomp [THEN iffD1]) |
112 apply (drule in_set_conv_decomp [THEN iffD1]) |
105 apply force |
113 apply force |
106 done |
114 done |