author | wenzelm |
Sun, 23 Jul 2000 12:02:22 +0200 | |
changeset 9410 | 612ee826a409 |
parent 6153 | bff90585cce5 |
child 9491 | 1a36151ee2fc |
permissions | -rw-r--r-- |
6153 | 1 |
(* Title: ZF/ex/ListN |
0 | 2 |
ID: $Id$ |
1461 | 3 |
Author: Lawrence C Paulson, Cambridge University Computer Laboratory |
0 | 4 |
Copyright 1993 University of Cambridge |
5 |
||
6 |
Inductive definition of lists of n elements |
|
7 |
||
8 |
See Ch. Paulin-Mohring, Inductive Definitions in the System Coq. |
|
9 |
Research Report 92-49, LIP, ENS Lyon. Dec 1992. |
|
10 |
*) |
|
11 |
||
5137 | 12 |
Goal "l:list(A) ==> <length(l),l> : listn(A)"; |
515 | 13 |
by (etac list.induct 1); |
2469 | 14 |
by (ALLGOALS Asm_simp_tac); |
515 | 15 |
by (REPEAT (ares_tac listn.intrs 1)); |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
515
diff
changeset
|
16 |
qed "list_into_listn"; |
0 | 17 |
|
5068 | 18 |
Goal "<n,l> : listn(A) <-> l:list(A) & length(l)=n"; |
0 | 19 |
by (rtac iffI 1); |
6046 | 20 |
by (blast_tac (claset() addIs [list_into_listn]) 2); |
1732 | 21 |
by (etac listn.induct 1); |
6153 | 22 |
by Auto_tac; |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
515
diff
changeset
|
23 |
qed "listn_iff"; |
0 | 24 |
|
5068 | 25 |
Goal "listn(A)``{n} = {l:list(A). length(l)=n}"; |
0 | 26 |
by (rtac equality_iffI 1); |
4091 | 27 |
by (simp_tac (simpset() addsimps [listn_iff,separation,image_singleton_iff]) 1); |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
515
diff
changeset
|
28 |
qed "listn_image_eq"; |
0 | 29 |
|
5137 | 30 |
Goalw listn.defs "A<=B ==> listn(A) <= listn(B)"; |
16
0b033d50ca1c
ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
lcp
parents:
7
diff
changeset
|
31 |
by (rtac lfp_mono 1); |
515 | 32 |
by (REPEAT (rtac listn.bnd_mono 1)); |
16
0b033d50ca1c
ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
lcp
parents:
7
diff
changeset
|
33 |
by (REPEAT (ares_tac ([univ_mono,Sigma_mono,list_mono] @ basic_monos) 1)); |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
515
diff
changeset
|
34 |
qed "listn_mono"; |
16
0b033d50ca1c
ex/{bin.ML,comb.ML,prop.ML}: replaced NewSext by Syntax.simple_sext
lcp
parents:
7
diff
changeset
|
35 |
|
5268 | 36 |
Goal "[| <n,l> : listn(A); <n',l'> : listn(A) |] ==> <n#+n', l@l'> : listn(A)"; |
1732 | 37 |
by (etac listn.induct 1); |
4091 | 38 |
by (ALLGOALS (asm_simp_tac (simpset() addsimps listn.intrs))); |
782
200a16083201
added bind_thm for theorems defined by "standard ..."
clasohm
parents:
515
diff
changeset
|
39 |
qed "listn_append"; |
71
729fe026c5f3
sample datatype defs now use datatype_intrs, datatype_elims
lcp
parents:
56
diff
changeset
|
40 |
|
6141 | 41 |
val Nil_listn_case = listn.mk_cases "<i,Nil> : listn(A)" |
42 |
and Cons_listn_case = listn.mk_cases "<i,Cons(x,l)> : listn(A)"; |
|
85 | 43 |
|
6141 | 44 |
val zero_listn_case = listn.mk_cases "<0,l> : listn(A)" |
45 |
and succ_listn_case = listn.mk_cases "<succ(i),l> : listn(A)"; |