src/HOL/Lambda/ListApplication.thy
author wenzelm
Sat, 02 Sep 2000 21:56:24 +0200
changeset 9811 39ffdb8cab03
parent 9771 54c6a2c6e569
child 9870 2374ba026fc6
permissions -rw-r--r--
HOL/Lambda: converted into new-style theory and document;
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/ListApplication.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
9811
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
     5
*)
5261
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 {* Application of a term to a list of terms *}
5261
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 ListApplication = Lambda:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    10
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    11
syntax
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    12
  "_list_application" :: "dB => dB list => dB"   (infixl "$$" 150)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    13
translations
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    14
  "t $$ ts" == "foldl (op $) t ts"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    15
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    16
lemma apps_eq_tail_conv [iff]: "(r $$ ts = s $$ ts) = (r = s)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    17
  apply (induct_tac ts rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    18
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    19
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    20
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    21
lemma Var_eq_apps_conv [rulify, iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    22
    "\<forall>s. (Var m = s $$ ss) = (Var m = s \<and> ss = [])"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    23
  apply (induct_tac ss)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    24
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    25
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    26
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    27
lemma Var_apps_eq_Var_apps_conv [rulify, iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    28
    "\<forall>ss. (Var m $$ rs = Var n $$ ss) = (m = n \<and> rs = ss)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    29
  apply (induct_tac rs rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    30
   apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    31
   apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    32
  apply (rule allI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    33
  apply (induct_tac ss rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    34
   apply auto
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 App_eq_foldl_conv:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    38
  "(r $ s = t $$ ts) =
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    39
    (if ts = [] then r $ s = t
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    40
    else (\<exists>ss. ts = ss @ [s] \<and> r = t $$ ss))"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    41
  apply (rule_tac xs = ts in rev_exhaust)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    42
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    43
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    44
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    45
lemma Abs_eq_apps_conv [iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    46
    "(Abs r = s $$ ss) = (Abs r = s \<and> ss = [])"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    47
  apply (induct_tac ss rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    48
   apply auto
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 apps_eq_Abs_conv [iff]: "(s $$ ss = Abs r) = (s = Abs r \<and> ss = [])"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    52
  apply (induct_tac ss rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    53
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    54
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    55
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    56
lemma Abs_apps_eq_Abs_apps_conv [iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    57
    "\<forall>ss. (Abs r $$ rs = Abs s $$ ss) = (r = s \<and> rs = ss)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    58
  apply (induct_tac rs rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    59
   apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    60
   apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    61
  apply (rule allI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    62
  apply (induct_tac ss rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    63
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    64
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    65
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    66
lemma Abs_App_neq_Var_apps [iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    67
    "\<forall>s t. Abs s $ t ~= Var n $$ ss"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    68
  apply (induct_tac ss rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    69
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    70
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    71
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    72
lemma Var_apps_neq_Abs_apps [rulify, iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    73
    "\<forall>ts. Var n $$ ts ~= Abs r $$ ss"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    74
  apply (induct_tac ss rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    75
   apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    76
  apply (rule allI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    77
  apply (induct_tac ts rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    78
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    79
  done
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    80
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    81
lemma ex_head_tail:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    82
  "\<exists>ts h. t = h $$ ts \<and> ((\<exists>n. h = Var n) \<or> (\<exists>u. h = Abs u))"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    83
  apply (induct_tac t)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    84
    apply (rule_tac x = "[]" in exI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    85
    apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    86
   apply clarify
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    87
   apply (rename_tac ts1 ts2 h1 h2)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    88
   apply (rule_tac x = "ts1 @ [h2 $$ ts2]" in exI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    89
   apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    90
  apply simp
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 size_apps [simp]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    94
  "size (r $$ rs) = size r + foldl (op +) 0 (map size rs) + length rs"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    95
  apply (induct_tac rs rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    96
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    97
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    98
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    99
lemma lem0: "[| (0::nat) < k; m <= n |] ==> m < n + k"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   100
  apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   101
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   102
9811
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
   103
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
   104
text {* \medskip A customized induction schema for @{text "$$"}. *}
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   105
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   106
lemma lem [rulify]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   107
  "[| !!n ts. \<forall>t \<in> set ts. P t ==> P (Var n $$ ts);
9811
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
   108
    !!u ts. [| P u; \<forall>t \<in> set ts. P t |] ==> P (Abs u $$ ts)
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   109
  |] ==> \<forall>t. size t = n --> P t"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   110
proof -
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   111
  case antecedent
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   112
  show ?thesis
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   113
   apply (induct_tac n rule: less_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   114
   apply (rule allI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   115
   apply (cut_tac t = t in ex_head_tail)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   116
   apply clarify
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   117
   apply (erule disjE)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   118
    apply clarify
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   119
    apply (rule prems)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   120
    apply clarify
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   121
    apply (erule allE, erule impE)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   122
      prefer 2
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   123
      apply (erule allE, erule mp, rule refl)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   124
     apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   125
     apply (rule lem0)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   126
      apply force
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   127
     apply (rule elem_le_sum)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   128
     apply force
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   129
    apply clarify
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   130
    apply (rule prems)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   131
     apply (erule allE, erule impE)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   132
      prefer 2
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   133
      apply (erule allE, erule mp, rule refl)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   134
     apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   135
    apply clarify
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   136
    apply (erule allE, erule impE)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   137
     prefer 2
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   138
     apply (erule allE, erule mp, rule refl)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   139
    apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   140
    apply (rule le_imp_less_Suc)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   141
    apply (rule trans_le_add1)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   142
    apply (rule trans_le_add2)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   143
    apply (rule elem_le_sum)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   144
    apply force
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   145
    done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   146
qed
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   147
9811
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
   148
theorem Apps_dB_induct:
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   149
  "[| !!n ts. \<forall>t \<in> set ts. P t ==> P (Var n $$ ts);
9811
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
   150
    !!u ts. [| P u; \<forall>t \<in> set ts. P t |] ==> P (Abs u $$ ts)
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   151
  |] ==> P t"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   152
proof -
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   153
  case antecedent
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   154
  show ?thesis
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   155
    apply (rule_tac t = t in lem)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   156
      prefer 3
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   157
      apply (rule refl)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   158
     apply (assumption | rule prems)+
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   159
    done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   160
qed
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
   161
9811
39ffdb8cab03 HOL/Lambda: converted into new-style theory and document;
wenzelm
parents: 9771
diff changeset
   162
end