src/HOL/Lambda/ListOrder.thy
changeset 9811 39ffdb8cab03
parent 9771 54c6a2c6e569
child 9906 5c027cca6262
equal deleted inserted replaced
9810:7e785df2b76a 9811:39ffdb8cab03
     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