src/HOL/Lambda/ListApplication.ML
author paulson
Tue, 23 May 2000 18:06:22 +0200
changeset 8935 548901d05a0e
parent 6301 08245f5a436d
child 9747 043098ba5098
permissions -rw-r--r--
added type constraint ::nat because 0 is now overloaded
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.ML
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
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
     7
Goal "(r$$ts = s$$ts) = (r = s)";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
     8
by (rev_induct_tac "ts" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
     9
by (Auto_tac);
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    10
qed "apps_eq_tail_conv";
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    11
AddIffs [apps_eq_tail_conv];
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    12
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    13
Goal "!s. (Var m = s$$ss) = (Var m = s & ss = [])";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    14
by (induct_tac "ss" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    15
by (Auto_tac);
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    16
qed_spec_mp "Var_eq_apps_conv";
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    17
AddIffs [Var_eq_apps_conv];
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    18
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    19
Goal "!ss. ((Var m)$$rs = (Var n)$$ss) = (m=n & rs=ss)";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    20
by (rev_induct_tac "rs" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    21
 by (Simp_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    22
 by (Blast_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    23
by (rtac allI 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    24
by (rev_induct_tac "ss" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    25
by (Auto_tac);
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    26
qed_spec_mp "Var_apps_eq_Var_apps_conv";
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    27
AddIffs [Var_apps_eq_Var_apps_conv];
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    28
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    29
Goal "(r$s = t$$ts) = \
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    30
\     (if ts = [] then r$s = t \
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    31
\      else (? ss. ts = ss@[s] & r = t$$ss))";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    32
by (res_inst_tac [("xs","ts")] rev_exhaust 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    33
by (Auto_tac);
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    34
qed "App_eq_foldl_conv";
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    35
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    36
Goal "(Abs r = s$$ss) = (Abs r = s & ss=[])";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    37
by (rev_induct_tac "ss" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    38
by (Auto_tac);
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    39
qed "Abs_eq_apps_conv";
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    40
AddIffs [Abs_eq_apps_conv];
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    41
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    42
Goal "(s$$ss = Abs r) = (s = Abs r & ss=[])";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    43
by (rev_induct_tac "ss" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    44
by (Auto_tac);
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    45
qed "apps_eq_Abs_conv";
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    46
AddIffs [apps_eq_Abs_conv];
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    47
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    48
Goal "!ss. ((Abs r)$$rs = (Abs s)$$ss) = (r=s & rs=ss)";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    49
by (rev_induct_tac "rs" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    50
 by (Simp_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    51
 by (Blast_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    52
by (rtac allI 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    53
by (rev_induct_tac "ss" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    54
by (Auto_tac);
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    55
qed_spec_mp "Abs_apps_eq_Abs_apps_conv";
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    56
AddIffs [Abs_apps_eq_Abs_apps_conv];
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    57
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    58
Goal "!s t. Abs s $ t ~= (Var n)$$ss";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    59
by (rev_induct_tac "ss" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    60
by (Auto_tac);
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    61
qed_spec_mp "Abs_App_neq_Var_apps";
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    62
AddIffs [Abs_App_neq_Var_apps];
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    63
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    64
Goal "!ts. Var n $$ ts ~= (Abs r)$$ss";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    65
by (rev_induct_tac "ss" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    66
 by (Simp_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    67
by (rtac allI 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    68
by (rev_induct_tac "ts" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    69
by (Auto_tac);
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    70
qed_spec_mp "Var_apps_neq_Abs_apps";
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    71
AddIffs [Var_apps_neq_Abs_apps];
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    72
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    73
Goal "? ts h. t = h$$ts & ((? n. h = Var n) | (? u. h = Abs u))";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    74
by (induct_tac "t" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    75
  by (res_inst_tac[("x","[]")] exI 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    76
  by (Simp_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    77
 by (Clarify_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    78
 by (rename_tac "ts1 ts2 h1 h2" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    79
 by (res_inst_tac[("x","ts1@[h2$$ts2]")] exI 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    80
 by (Simp_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    81
by (Simp_tac 1);
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    82
qed "ex_head_tail";
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    83
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    84
Goal "size(r$$rs) = size r + foldl (op +) 0 (map size rs) + length rs";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    85
by (rev_induct_tac "rs" 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
    86
by (Auto_tac);
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    87
qed "size_apps";
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    88
Addsimps [size_apps];
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    89
8935
548901d05a0e added type constraint ::nat because 0 is now overloaded
paulson
parents: 6301
diff changeset
    90
Goal "[| (0::nat) < k; m <= n |] ==> m < n+k";
6301
08245f5a436d expandshort
paulson
parents: 6128
diff changeset
    91
by (fast_arith_tac 1);
8935
548901d05a0e added type constraint ::nat because 0 is now overloaded
paulson
parents: 6301
diff changeset
    92
val lemma0 = result();
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    93
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    94
(* a customized induction schema for $$ *)
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    95
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    96
val prems = Goal
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    97
"[| !!n ts. !t : set ts. P t ==> P((Var n)$$ts); \
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    98
\   !!u ts. [| P u; !t : set ts. P t |] ==> P((Abs u)$$ts) \
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
    99
\|] ==> !t. size t = n --> P t";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   100
by (res_inst_tac [("n","n")] less_induct 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   101
by (rtac allI 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   102
by (cut_inst_tac [("t","t")] ex_head_tail 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   103
by (Clarify_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   104
by (etac disjE 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   105
 by (Clarify_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   106
 by (resolve_tac prems 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   107
 by (Clarify_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   108
 by (EVERY[etac allE 1, etac impE 1, etac allE 2, etac mp 2, rtac refl 2]);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   109
 by (Simp_tac 1);
8935
548901d05a0e added type constraint ::nat because 0 is now overloaded
paulson
parents: 6301
diff changeset
   110
 by (rtac lemma0 1);
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   111
  by (Force_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   112
 by (rtac elem_le_sum 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   113
 by (Force_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   114
by (Clarify_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   115
by (resolve_tac prems 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   116
by (EVERY[etac allE 1, etac impE 1, etac allE 2, etac mp 2, rtac refl 2]);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   117
by (Simp_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   118
by (Clarify_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   119
by (EVERY[etac allE 1, etac impE 1, etac allE 2, etac mp 2, rtac refl 2]);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   120
by (Simp_tac 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   121
by (rtac le_imp_less_Suc 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   122
by (rtac trans_le_add1 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   123
by (rtac trans_le_add2 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   124
by (rtac elem_le_sum 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   125
by (Force_tac 1);
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
   126
val lemma = result() RS spec RS mp;
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
   127
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
   128
val prems = Goal
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
   129
"[| !!n ts. !t : set ts. P t ==> P((Var n)$$ts); \
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
   130
\   !!u ts. [| P u; !t : set ts. P t |] ==> P((Abs u)$$ts) \
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
   131
\|] ==> P t";
5318
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   132
by (res_inst_tac [("x1","t")] lemma 1);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   133
by (rtac refl 3);
72bf8039b53f expandshort
paulson
parents: 5261
diff changeset
   134
by (REPEAT(ares_tac prems 1));
5261
ce3c25c8a694 First steps towards termination of simply typed terms.
nipkow
parents:
diff changeset
   135
qed "Apps_dB_induct";