src/HOL/Lambda/ListOrder.thy
author haftmann
Fri, 17 Jun 2005 16:12:49 +0200
changeset 16417 9bc16273c2d4
parent 13601 fd3e3d6b37b2
child 18241 afdba6b3e383
permissions -rw-r--r--
migrated theory headers to new format
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
     1
(*  Title:      HOL/Lambda/ListOrder.thy
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
     2
    ID:         $Id$
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
     3
    Author:     Tobias Nipkow
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
     4
    Copyright   1998 TU Muenchen
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
     5
*)
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
     6
9811
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
     7
header {* Lifting an order to lists of elements *}
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
     8
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 13601
diff changeset
     9
theory ListOrder imports Accessible_Part begin
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    10
9811
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
    11
text {*
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
    12
  Lifting an order to lists of elements, relating exactly one
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
    13
  element.
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
    14
*}
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
    15
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    16
constdefs
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    17
  step1 :: "('a \<times> 'a) set => ('a list \<times> 'a list) set"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    18
  "step1 r ==
9811
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
    19
    {(ys, xs). \<exists>us z z' vs. xs = us @ z # vs \<and> (z', z) \<in> r \<and> ys =
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
    20
      us @ z' # vs}"
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    21
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    22
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    23
lemma step1_converse [simp]: "step1 (r^-1) = (step1 r)^-1"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    24
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    25
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    26
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    27
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    28
lemma in_step1_converse [iff]: "(p \<in> step1 (r^-1)) = (p \<in> (step1 r)^-1)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    29
  apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    30
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    31
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    32
lemma not_Nil_step1 [iff]: "([], xs) \<notin> step1 r"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    33
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    34
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    35
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    36
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    37
lemma not_step1_Nil [iff]: "(xs, []) \<notin> step1 r"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    38
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    39
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    40
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    41
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    42
lemma Cons_step1_Cons [iff]:
9811
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
    43
    "((y # ys, x # xs) \<in> step1 r) =
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
    44
      ((y, x) \<in> r \<and> xs = ys \<or> x = y \<and> (ys, xs) \<in> step1 r)"
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    45
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    46
  apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    47
  apply (rule iffI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    48
   apply (erule exE)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    49
   apply (rename_tac ts)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    50
   apply (case_tac ts)
13601
fd3e3d6b37b2 Adapted to new simplifier.
berghofe
parents: 11639
diff changeset
    51
    apply fastsimp
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    52
   apply force
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    53
  apply (erule disjE)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    54
   apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    55
  apply (blast intro: Cons_eq_appendI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    56
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    57
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    58
lemma append_step1I:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    59
  "(ys, xs) \<in> step1 r \<and> vs = us \<or> ys = xs \<and> (vs, us) \<in> step1 r
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    60
    ==> (ys @ vs, xs @ us) : step1 r"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    61
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    62
  apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    63
   apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    64
  apply (blast intro: append_eq_appendI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    65
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    66
9941
fe05af7ec816 renamed atts: rulify to rule_format, elimify to elim_format;
wenzelm
parents: 9906
diff changeset
    67
lemma Cons_step1E [rule_format, elim!]:
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    68
  "[| (ys, x # xs) \<in> step1 r;
9811
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
    69
    \<forall>y. ys = y # xs --> (y, x) \<in> r --> R;
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
    70
    \<forall>zs. ys = x # zs --> (zs, xs) \<in> step1 r --> R
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    71
   |] ==> R"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    72
  apply (case_tac ys)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    73
   apply (simp add: step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    74
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    75
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    76
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    77
lemma Snoc_step1_SnocD:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    78
  "(ys @ [y], xs @ [x]) \<in> step1 r
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    79
    ==> ((ys, xs) \<in> step1 r \<and> y = x \<or> ys = xs \<and> (y, x) \<in> r)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    80
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    81
  apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    82
  apply (clarify del: disjCI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    83
  apply (rename_tac vs)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    84
  apply (rule_tac xs = vs in rev_exhaust)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    85
   apply force
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    86
  apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    87
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    88
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    89
9941
fe05af7ec816 renamed atts: rulify to rule_format, elimify to elim_format;
wenzelm
parents: 9906
diff changeset
    90
lemma Cons_acc_step1I [rule_format, intro!]:
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    91
    "x \<in> acc r ==> \<forall>xs. xs \<in> acc (step1 r) --> x # xs \<in> acc (step1 r)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    92
  apply (erule acc_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    93
  apply (erule thin_rl)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    94
  apply clarify
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    95
  apply (erule acc_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    96
  apply (rule accI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    97
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    98
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    99
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   100
lemma lists_accD: "xs \<in> lists (acc r) ==> xs \<in> acc (step1 r)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   101
  apply (erule lists.induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   102
   apply (rule accI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   103
   apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   104
  apply (rule accI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   105
  apply (fast dest: acc_downward)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   106
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   107
9811
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
   108
lemma ex_step1I:
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
   109
  "[| x \<in> set xs; (y, x) \<in> r |]
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   110
    ==> \<exists>ys. (ys, xs) \<in> step1 r \<and> y \<in> set ys"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   111
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   112
  apply (drule in_set_conv_decomp [THEN iffD1])
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   113
  apply force
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   114
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   115
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   116
lemma lists_accI: "xs \<in> acc (step1 r) ==> xs \<in> lists (acc r)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   117
  apply (erule acc_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   118
  apply clarify
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   119
  apply (rule accI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   120
  apply (drule ex_step1I, assumption)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   121
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   122
  done
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
   123
11639
wenzelm
parents: 10264
diff changeset
   124
end