src/HOL/Lambda/ListApplication.thy
author wenzelm
Sat, 02 Sep 2000 21:49:51 +0200
changeset 9803 bc883b390d91
parent 9771 54c6a2c6e569
child 9811 39ffdb8cab03
permissions -rw-r--r--
use Args.mode;
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
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
Application of a term to a list of terms
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 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
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    17
lemma apps_eq_tail_conv [iff]: "(r $$ ts = s $$ ts) = (r = s)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    18
  apply (induct_tac ts rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    19
   apply auto
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 Var_eq_apps_conv [rulify, iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    23
    "\<forall>s. (Var m = s $$ ss) = (Var m = s \<and> ss = [])"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    24
  apply (induct_tac ss)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    25
   apply auto
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 Var_apps_eq_Var_apps_conv [rulify, iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    29
    "\<forall>ss. (Var m $$ rs = Var n $$ ss) = (m = n \<and> rs = ss)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    30
  apply (induct_tac rs rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    31
   apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    32
   apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    33
  apply (rule allI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    34
  apply (induct_tac ss rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    35
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    36
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    37
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    38
lemma App_eq_foldl_conv:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    39
  "(r $ s = t $$ ts) =
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    40
    (if ts = [] then r $ s = t
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    41
    else (\<exists>ss. ts = ss @ [s] \<and> r = t $$ ss))"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    42
  apply (rule_tac xs = ts in rev_exhaust)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    43
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    44
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    45
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    46
lemma Abs_eq_apps_conv [iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    47
    "(Abs r = s $$ ss) = (Abs r = s \<and> ss = [])"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    48
  apply (induct_tac ss rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    49
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    50
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    51
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    52
lemma apps_eq_Abs_conv [iff]: "(s $$ ss = Abs r) = (s = Abs r \<and> ss = [])"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    53
  apply (induct_tac ss rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    54
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    55
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    56
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    57
lemma Abs_apps_eq_Abs_apps_conv [iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    58
    "\<forall>ss. (Abs r $$ rs = Abs s $$ ss) = (r = s \<and> rs = ss)"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    59
  apply (induct_tac rs rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    60
   apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    61
   apply blast
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    62
  apply (rule allI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    63
  apply (induct_tac ss rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    64
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    65
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    66
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    67
lemma Abs_App_neq_Var_apps [iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    68
    "\<forall>s t. Abs s $ t ~= Var n $$ ss"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    69
  apply (induct_tac ss rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    70
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    71
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    72
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    73
lemma Var_apps_neq_Abs_apps [rulify, iff]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    74
    "\<forall>ts. Var n $$ ts ~= Abs r $$ ss"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    75
  apply (induct_tac ss rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    76
   apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    77
  apply (rule allI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    78
  apply (induct_tac ts rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    79
   apply auto
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    80
  done
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    81
9771
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    82
lemma ex_head_tail:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    83
  "\<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
    84
  apply (induct_tac t)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    85
    apply (rule_tac x = "[]" in exI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    86
    apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    87
   apply clarify
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    88
   apply (rename_tac ts1 ts2 h1 h2)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    89
   apply (rule_tac x = "ts1 @ [h2 $$ ts2]" in exI)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    90
   apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    91
  apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    92
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    93
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    94
lemma size_apps [simp]:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    95
  "size (r $$ rs) = size r + foldl (op +) 0 (map size rs) + length rs"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    96
  apply (induct_tac rs rule: rev_induct)
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
    97
   apply auto
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 lem0: "[| (0::nat) < k; m <= n |] ==> m < n + k"
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   101
  apply simp
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   102
  done
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   103
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   104
text {* A customized induction schema for @{text "$$"} *}
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);
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   108
      !!u ts. [| P u; \<forall>t \<in> set ts. P t |] ==> P (Abs u $$ ts)
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
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   148
lemma Apps_dB_induct:
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   149
  "[| !!n ts. \<forall>t \<in> set ts. P t ==> P (Var n $$ ts);
54c6a2c6e569 converted Lambda scripts;
wenzelm
parents: 9102
diff changeset
   150
      !!u ts. [| P u; \<forall>t \<in> set ts. P t |] ==> P (Abs u $$ ts)
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
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
   162
end