src/HOL/Lambda/ListOrder.thy
author wenzelm
Fri, 01 Sep 2000 00:30:25 +0200
changeset 9771 54c6a2c6e569
parent 9102 c7ba07e3bbe8
child 9811 39ffdb8cab03
permissions -rw-r--r--
converted Lambda scripts;
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
Lifting an order to lists of elements, relating exactly one element
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
     7
*)
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
     8
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
     9
theory ListOrder = Acc:
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    10
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    11
constdefs
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    12
  step1 :: "('a \<times> 'a) set => ('a list \<times> 'a list) set"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    13
  "step1 r ==
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    14
    {(ys, xs). \<exists>us z z' vs. xs = us @ z # vs \<and> (z', z) \<in> r \<and> ys = us @ z' # vs}"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    15
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    16
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    17
lemma step1_converse [simp]: "step1 (r^-1) = (step1 r)^-1"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    18
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    19
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    20
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    21
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    22
lemma in_step1_converse [iff]: "(p \<in> step1 (r^-1)) = (p \<in> (step1 r)^-1)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    23
  apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    24
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    25
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    26
lemma not_Nil_step1 [iff]: "([], xs) \<notin> step1 r"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    27
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    28
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    29
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    30
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    31
lemma not_step1_Nil [iff]: "(xs, []) \<notin> step1 r"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    32
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    33
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    34
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    35
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    36
lemma Cons_step1_Cons [iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    37
  "((y # ys, x # xs) \<in> step1 r) = ((y, x) \<in> r \<and> xs = ys \<or> x = y \<and> (ys, xs) \<in> 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 simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    40
  apply (rule iffI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    41
   apply (erule exE)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    42
   apply (rename_tac ts)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    43
   apply (case_tac ts)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    44
    apply force
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    45
   apply force
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    46
  apply (erule disjE)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    47
   apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    48
  apply (blast intro: Cons_eq_appendI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    49
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    50
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    51
lemma append_step1I:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    52
  "(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
    53
    ==> (ys @ vs, xs @ us) : step1 r"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    54
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    55
  apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    56
   apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    57
  apply (blast intro: append_eq_appendI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    58
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    59
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    60
lemma Cons_step1E [rulify_prems, elim!]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    61
  "[| (ys, x # xs) \<in> step1 r;
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    62
      \<forall>y. ys = y # xs --> (y, x) \<in> r --> R;
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    63
      \<forall>zs. ys = x # zs --> (zs, xs) : step1 r --> R
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    64
   |] ==> R"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    65
  apply (case_tac ys)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    66
   apply (simp add: step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    67
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    68
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    69
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    70
lemma Snoc_step1_SnocD:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    71
  "(ys @ [y], xs @ [x]) \<in> step1 r
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    72
    ==> ((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
    73
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    74
  apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    75
  apply (clarify del: disjCI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    76
  apply (rename_tac vs)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    77
  apply (rule_tac xs = vs in rev_exhaust)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    78
   apply force
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    79
  apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    80
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    81
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    82
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    83
lemma Cons_acc_step1I [rulify, intro!]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    84
    "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
    85
  apply (erule acc_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    86
  apply (erule thin_rl)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    87
  apply clarify
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    88
  apply (erule acc_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    89
  apply (rule accI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    90
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    91
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    92
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    93
lemma lists_accD: "xs \<in> lists (acc r) ==> xs \<in> acc (step1 r)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    94
  apply (erule lists.induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    95
   apply (rule accI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    96
   apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    97
  apply (rule accI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    98
  apply (fast dest: acc_downward)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    99
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   100
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   101
lemma ex_step1I: "[| x \<in> set xs; (y, x) \<in> r |]
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   102
    ==> \<exists>ys. (ys, xs) \<in> step1 r \<and> y \<in> set ys"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   103
  apply (unfold step1_def)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   104
  apply (drule in_set_conv_decomp [THEN iffD1])
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   105
  apply force
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   106
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   107
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   108
lemma lists_accI: "xs \<in> acc (step1 r) ==> xs \<in> lists (acc r)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   109
  apply (erule acc_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   110
  apply clarify
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   111
  apply (rule accI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   112
  apply (drule ex_step1I, assumption)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   113
  apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   114
  done
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
   115
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
   116
end