src/ZF/ex/ListN.ML
author lcp
Fri, 29 Jul 1994 11:09:45 +0200
changeset 496 3fc829fa81d2
parent 477 53fc8ad84b33
child 515 abcc438e7c27
permissions -rw-r--r--
Inductive defs need no longer mention SigmaI/E2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title: 	ZF/ex/listn
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
Inductive definition of lists of n elements
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
See Ch. Paulin-Mohring, Inductive Definitions in the System Coq.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
Research Report 92-49, LIP, ENS Lyon.  Dec 1992.
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
structure ListN = Inductive_Fun
445
7b6d8b8d4580 changed syntax of datatype declaration
clasohm
parents: 279
diff changeset
    13
 (val thy        = ListFn.thy |> add_consts [("listn","i=>i",NoSyn)]
477
53fc8ad84b33 added thy_name to Datatype_Fun's parameter
clasohm
parents: 445
diff changeset
    14
  val thy_name   = "ListN"
279
7738aed3f84d Improved layout for inductive defs
lcp
parents: 85
diff changeset
    15
  val rec_doms   = [("listn", "nat*list(A)")]
7738aed3f84d Improved layout for inductive defs
lcp
parents: 85
diff changeset
    16
  val sintrs     = 
7738aed3f84d Improved layout for inductive defs
lcp
parents: 85
diff changeset
    17
          ["<0,Nil> : listn(A)",
7738aed3f84d Improved layout for inductive defs
lcp
parents: 85
diff changeset
    18
           "[| a: A;  <n,l> : listn(A) |] ==> <succ(n), Cons(a,l)> : listn(A)"]
7738aed3f84d Improved layout for inductive defs
lcp
parents: 85
diff changeset
    19
  val monos      = []
7738aed3f84d Improved layout for inductive defs
lcp
parents: 85
diff changeset
    20
  val con_defs   = []
496
3fc829fa81d2 Inductive defs need no longer mention SigmaI/E2
lcp
parents: 477
diff changeset
    21
  val type_intrs = nat_typechecks @ List.intrs 
3fc829fa81d2 Inductive defs need no longer mention SigmaI/E2
lcp
parents: 477
diff changeset
    22
  val type_elims = []);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
    24
val listn_induct = standard 
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
    25
    (ListN.mutual_induct RS spec RS spec RSN (2,rev_mp));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
71
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    27
goal ListN.thy "!!l. l:list(A) ==> <length(l),l> : listn(A)";
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    28
by (etac List.induct 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
    29
by (ALLGOALS (asm_simp_tac list_ss));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
by (REPEAT (ares_tac ListN.intrs 1));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
val list_into_listn = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
goal ListN.thy "<n,l> : listn(A) <-> l:list(A) & length(l)=n";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
by (rtac iffI 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
by (etac listn_induct 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
    36
by (safe_tac (ZF_cs addSIs (list_typechecks @
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
    37
			    [length_Nil, length_Cons, list_into_listn])));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
val listn_iff = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
goal ListN.thy "listn(A)``{n} = {l:list(A). length(l)=n}";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
by (rtac equality_iffI 1);
7
268f93ab3bc4 Installation of new simplifier for ZF/ex. The hom_ss example in misc.ML is
lcp
parents: 0
diff changeset
    42
by (simp_tac (list_ss addsimps [listn_iff,separation,image_singleton_iff]) 1);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
val listn_image_eq = result();
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
16
0b033d50ca1c ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
lcp
parents: 7
diff changeset
    45
goalw ListN.thy ListN.defs "!!A B. A<=B ==> listn(A) <= listn(B)";
0b033d50ca1c ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
lcp
parents: 7
diff changeset
    46
by (rtac lfp_mono 1);
0b033d50ca1c ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
lcp
parents: 7
diff changeset
    47
by (REPEAT (rtac ListN.bnd_mono 1));
0b033d50ca1c ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
lcp
parents: 7
diff changeset
    48
by (REPEAT (ares_tac ([univ_mono,Sigma_mono,list_mono] @ basic_monos) 1));
0b033d50ca1c ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
lcp
parents: 7
diff changeset
    49
val listn_mono = result();
0b033d50ca1c ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
lcp
parents: 7
diff changeset
    50
71
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    51
goal ListN.thy
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    52
    "!!n l. [| <n,l> : listn(A);  <n',l'> : listn(A) |] ==> \
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    53
\           <n#+n', l@l'> : listn(A)";
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    54
by (etac listn_induct 1);
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    55
by (ALLGOALS (asm_simp_tac (list_ss addsimps ListN.intrs)));
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    56
val listn_append = result();
729fe026c5f3 sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents: 56
diff changeset
    57
56
2caa6f49f06e ZF/ex/tf/tree,forest_unfold: streamlined the proofs
lcp
parents: 16
diff changeset
    58
val Nil_listn_case = ListN.mk_cases List.con_defs "<i,Nil> : listn(A)"
85
914270f33f2d minor changes e.g. datatype_elims
lcp
parents: 71
diff changeset
    59
and Cons_listn_case = ListN.mk_cases List.con_defs "<i,Cons(x,l)> : listn(A)";
914270f33f2d minor changes e.g. datatype_elims
lcp
parents: 71
diff changeset
    60
914270f33f2d minor changes e.g. datatype_elims
lcp
parents: 71
diff changeset
    61
val zero_listn_case = ListN.mk_cases List.con_defs "<0,l> : listn(A)"
914270f33f2d minor changes e.g. datatype_elims
lcp
parents: 71
diff changeset
    62
and succ_listn_case = ListN.mk_cases List.con_defs "<succ(i),l> : listn(A)";