src/ZF/list.ML
author lcp
Fri, 17 Sep 1993 16:16:38 +0200
changeset 6 8ce8c4d13d4d
parent 0 a5a9c433f639
child 14 1c0926788772
permissions -rw-r--r--
Installation of new simplifier for ZF. Deleted all congruence rules not involving local assumptions. NB the congruence rules for Sigma and Pi (dependent type constructions) cause difficulties and are not used by default.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	ZF/list.ML
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author: 	Lawrence C Paulson, Cambridge University Computer Laboratory
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1993  University of Cambridge
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
Datatype definition of Lists
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
structure List = Datatype_Fun
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
 (val thy = Univ.thy;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
  val rec_specs = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
      [("list", "univ(A)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
	  [(["Nil"],	"i"), 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
	   (["Cons"],	"[i,i]=>i")])];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
  val rec_styp = "i=>i";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
  val ext = None
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
  val sintrs = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
      ["Nil : list(A)",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
       "[| a: A;  l: list(A) |] ==> Cons(a,l) : list(A)"];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
  val monos = [];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
  val type_intrs = data_typechecks
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
  val type_elims = []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
val [NilI, ConsI] = List.intrs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
(*An elimination rule, for type-checking*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
val ConsE = List.mk_cases List.con_defs "Cons(a,l) : list(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
(*Proving freeness results*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
val Cons_iff     = List.mk_free "Cons(a,l)=Cons(a',l') <-> a=a' & l=l'";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
val Nil_Cons_iff = List.mk_free "~ Nil=Cons(a,l)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
(*Perform induction on l, then prove the major premise using prems. *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
fun list_ind_tac a prems i = 
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
    EVERY [res_inst_tac [("x",a)] List.induct i,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
	   rename_last_tac a ["1"] (i+2),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
	   ares_tac prems i];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
(**  Lemmas to justify using "list" in other recursive type definitions **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
goalw List.thy List.defs "!!A B. A<=B ==> list(A) <= list(B)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
by (rtac lfp_mono 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
by (REPEAT (rtac List.bnd_mono 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
by (REPEAT (ares_tac (univ_mono::basic_monos) 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
val list_mono = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
(*There is a similar proof by list induction.*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
goalw List.thy (List.defs@List.con_defs) "list(univ(A)) <= univ(A)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
by (rtac lfp_lowerbound 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
by (rtac (A_subset_univ RS univ_mono) 2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
by (fast_tac (ZF_cs addSIs [zero_in_univ, Inl_in_univ, Inr_in_univ,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
			    Pair_in_univ]) 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
val list_univ = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
val list_subset_univ = standard
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
    (list_mono RS (list_univ RSN (2,subset_trans)));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
(*****
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
val major::prems = goal List.thy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
    "[| l: list(A);    \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
\       c: C(0);       \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
\       !!x y. [| x: A;  y: list(A) |] ==> h(x,y): C(<x,y>)  \
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
\    |] ==> list_case(l,c,h) : C(l)";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
by (rtac (major RS list_induct) 1);
6
8ce8c4d13d4d Installation of new simplifier for ZF. Deleted all congruence rules not
lcp
parents: 0
diff changeset
    65
by (ALLGOALS (asm_simp_tac (ZF_ss addsimps
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
			    ([list_case_0,list_case_Pair]@prems))));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
val list_case_type = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
****)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
(** For recursion **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
goalw List.thy List.con_defs "rank(a) : rank(Cons(a,l))";
6
8ce8c4d13d4d Installation of new simplifier for ZF. Deleted all congruence rules not
lcp
parents: 0
diff changeset
    74
by (simp_tac rank_ss 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
val rank_Cons1 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
goalw List.thy List.con_defs "rank(l) : rank(Cons(a,l))";
6
8ce8c4d13d4d Installation of new simplifier for ZF. Deleted all congruence rules not
lcp
parents: 0
diff changeset
    78
by (simp_tac rank_ss 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
val rank_Cons2 = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80