| 12610 |      1 | (*  Title:      ZF/Induct/ListN.thy
 | 
| 12088 |      2 |     ID:         $Id$
 | 
|  |      3 |     Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
 | 
|  |      4 |     Copyright   1994  University of Cambridge
 | 
| 12610 |      5 | *)
 | 
| 12088 |      6 | 
 | 
| 12610 |      7 | header {* Lists of n elements *}
 | 
| 12088 |      8 | 
 | 
| 16417 |      9 | theory ListN imports Main begin
 | 
| 12088 |     10 | 
 | 
| 12610 |     11 | text {*
 | 
|  |     12 |   Inductive definition of lists of @{text n} elements; see
 | 
|  |     13 |   \cite{paulin-tlca}.
 | 
|  |     14 | *}
 | 
|  |     15 | 
 | 
|  |     16 | consts listn :: "i=>i"
 | 
| 12088 |     17 | inductive
 | 
| 12610 |     18 |   domains "listn(A)" \<subseteq> "nat \<times> list(A)"
 | 
| 12560 |     19 |   intros
 | 
| 12610 |     20 |     NilI: "<0,Nil> \<in> listn(A)"
 | 
| 12560 |     21 |     ConsI: "[| a \<in> A; <n,l> \<in> listn(A) |] ==> <succ(n), Cons(a,l)> \<in> listn(A)"
 | 
| 12610 |     22 |   type_intros nat_typechecks list.intros
 | 
| 12560 |     23 | 
 | 
|  |     24 | 
 | 
|  |     25 | lemma list_into_listn: "l \<in> list(A) ==> <length(l),l> \<in> listn(A)"
 | 
| 18415 |     26 |   by (induct set: list) (simp_all add: listn.intros)
 | 
| 12560 |     27 | 
 | 
|  |     28 | lemma listn_iff: "<n,l> \<in> listn(A) <-> l \<in> list(A) & length(l)=n"
 | 
| 12610 |     29 |   apply (rule iffI)
 | 
|  |     30 |    apply (erule listn.induct)
 | 
|  |     31 |     apply auto
 | 
|  |     32 |   apply (blast intro: list_into_listn)
 | 
|  |     33 |   done
 | 
| 12560 |     34 | 
 | 
|  |     35 | lemma listn_image_eq: "listn(A)``{n} = {l \<in> list(A). length(l)=n}"
 | 
| 12610 |     36 |   apply (rule equality_iffI)
 | 
|  |     37 |   apply (simp add: listn_iff separation image_singleton_iff)
 | 
|  |     38 |   done
 | 
| 12560 |     39 | 
 | 
|  |     40 | lemma listn_mono: "A \<subseteq> B ==> listn(A) \<subseteq> listn(B)"
 | 
| 12610 |     41 |   apply (unfold listn.defs)
 | 
|  |     42 |   apply (rule lfp_mono)
 | 
|  |     43 |     apply (rule listn.bnd_mono)+
 | 
|  |     44 |   apply (assumption | rule univ_mono Sigma_mono list_mono basic_monos)+
 | 
|  |     45 |   done
 | 
| 12560 |     46 | 
 | 
|  |     47 | lemma listn_append:
 | 
| 12610 |     48 |     "[| <n,l> \<in> listn(A); <n',l'> \<in> listn(A) |] ==> <n#+n', l@l'> \<in> listn(A)"
 | 
|  |     49 |   apply (erule listn.induct)
 | 
|  |     50 |    apply (frule listn.dom_subset [THEN subsetD])
 | 
|  |     51 |    apply (simp_all add: listn.intros)
 | 
|  |     52 |   done
 | 
| 12560 |     53 | 
 | 
| 12610 |     54 | inductive_cases
 | 
|  |     55 |       Nil_listn_case: "<i,Nil> \<in> listn(A)"
 | 
|  |     56 |   and Cons_listn_case: "<i,Cons(x,l)> \<in> listn(A)"
 | 
| 12560 |     57 | 
 | 
| 12610 |     58 | inductive_cases
 | 
|  |     59 |       zero_listn_case: "<0,l> \<in> listn(A)"
 | 
|  |     60 |   and succ_listn_case: "<succ(i),l> \<in> listn(A)"
 | 
| 12088 |     61 | 
 | 
|  |     62 | end
 |