117706Sjulianopen HolKernel Parse boolLib;
217706Sjulianinfix THEN THENL THENC ORELSE ORELSEC THEN_TCL ORELSE_TCL ## |->;
317706Sjulianinfixr -->;
417706Sjulian
517706Sjulian
617706Sjulianval _ = new_theory "more_list";
717706Sjulian
817706Sjulian
917706Sjulian(*
1017706Sjulianapp load [
1117706Sjulian          "numTheory", "listTheory", "rich_listTheory", "listLib", "pred_setLib",
1217706Sjulian          "more_setTheory",
1317706Sjulian          "arithLib", "Psyntax" ];
1417706Sjulian*)
1517706Sjulian
1617706Sjulianopen combinTheory numTheory arithmeticTheory
1717706Sjulian     listTheory rich_listTheory listLib more_setTheory
1817706Sjulian     numLib Psyntax ;
1917706Sjulian
2017706Sjulian
2117706Sjulianopen tactics;
2217706Sjulian
2317706Sjulian
2417706Sjulian
2517706Sjulianval MAP2_APPEND = store_thm
2617706Sjulian   ("MAP2_APPEND",
2717706Sjulian    ���!s1 s2 t1 t2 (f:'a->'b->'c).
2817706Sjulian          (LENGTH s1 = LENGTH s2) ==>
2917706Sjulian          (MAP2 f (APPEND s1 t1) (APPEND s2 t2) =
3017706Sjulian          APPEND (MAP2 f s1 s2) (MAP2 f t1 t2))���,
3150476Speter    LIST_INDUCT_TAC
3248794Snik    THENL
3317706Sjulian       [ LIST_INDUCT_TAC
3417706Sjulian         THEN REWRITE_TAC[LENGTH,APPEND,MAP2,SUC_NOT],
3579531Sru
3617706Sjulian         GEN_TAC
3717706Sjulian         THEN LIST_INDUCT_TAC
3817706Sjulian         THEN REWRITE_TAC[LENGTH,NOT_SUC]
3959501Sphantom         THEN REWRITE_TAC[ADD1,EQ_MONO_ADD_EQ]
40124535Sru         THEN REWRITE_TAC[APPEND,MAP2]
4117706Sjulian         THEN REPEAT GEN_TAC
4284306Sru         THEN DISCH_TAC
4317706Sjulian         THEN RES_TAC
4417706Sjulian         THEN ASM_REWRITE_TAC[]
4517706Sjulian      ]
4617706Sjulian   );
4717706Sjulian
4817706Sjulianval AND_EL = store_thm
4917706Sjulian   ("AND_EL",
5017706Sjulian    ���(AND_EL [] = T) /\
5117706Sjulian        (!x l. AND_EL (CONS x l) = (x /\ AND_EL l))���,
5217706Sjulian    REWRITE_TAC[AND_EL_DEF]
5317706Sjulian    THEN REWRITE_TAC[ALL_EL]
5417706Sjulian    THEN REWRITE_TAC[combinTheory.I_THM]
5577742Sdd   );
5617706Sjulian
5717706Sjulianval AND_EL_APPEND = store_thm
5817706Sjulian   ("AND_EL_APPEND",
5917706Sjulian    ���!s t. AND_EL (APPEND s t) = (AND_EL s /\ AND_EL t)���,
6017706Sjulian    REWRITE_TAC[AND_EL_DEF]
6117706Sjulian    THEN LIST_INDUCT_TAC
6217706Sjulian    THEN REWRITE_TAC[APPEND,ALL_EL]
6317706Sjulian    THEN ASM_REWRITE_TAC[CONJ_ASSOC]
6417706Sjulian   );
6517706Sjulian
66112542Scharnier(* =============================================================== *)
6717706Sjulian(* LENGTH_FILTER says that if we filter a list into two using P    *)
68112542Scharnier(* as a predicate, then the sum of the lengths of the two parts    *)
6973093Sru(* must equal the length of the whole.                             *)
70(* =============================================================== *)
71
72val LENGTH_FILTER = store_thm
73   ("LENGTH_FILTER",
74    ���!(l:'a list) P.
75          LENGTH (FILTER P l) + LENGTH (FILTER ($~ o P) l) = LENGTH l���,
76    LIST_INDUCT_TAC
77    THEN REWRITE_TAC[FILTER]
78    THENL
79       [ REWRITE_TAC[LENGTH,ADD_0],
80
81         REWRITE_TAC[o_THM]
82         THEN REPEAT GEN_TAC
83         THEN COND_CASES_TAC
84         THEN ASM_REWRITE_TAC[LENGTH,ADD_CLAUSES]
85      ]
86   );
87
88(* =============================================================== *)
89(* Applying LENGTH_FILTER to a specific filter, we can calculate   *)
90(* the length of the partitions of num lists where the partition   *)
91(* separates the bottom of a range from the larger members.        *)
92(* For all lists of numbers l, the number of elements of value n   *)
93(* or more equals the number of elements of value n plus the       *)
94(* number of elements of value more than n.                        *)
95(* =============================================================== *)
96
97val LENGTH_FILTER_LESS_EQ = store_thm
98   ("LENGTH_FILTER_LESS_EQ",
99    ���!l n.  LENGTH (FILTER (\y. n = y) l) +
100               LENGTH (FILTER (\y. n < y) l) =
101               LENGTH (FILTER (\y. n <= y) l)���,
102    REWRITE_TAC
103    [(GENL [���l:num list���,���n:num���]
104      o REWRITE_RULE[ARITH_PROVE ��� (n=y) /\ (n <= y) = (n = y)���,
105                     ARITH_PROVE ���~(n=y) /\ (n <= y) = (n < y)���]
106      o CONV_RULE (DEPTH_CONV BETA_CONV)
107      o REWRITE_RULE[FILTER_FILTER,o_THM]
108      o ISPECL[���FILTER (\y. n <= y) l���,���\y:num. n = y���])
109     LENGTH_FILTER]
110   );
111
112
113(*
114FILTER_MAP;
115    |- !f1 f2 l. FILTER f1 (MAP f2 l) = MAP f2 (FILTER (f1 o f2) l)
116*)
117
118
119val SL =
120    new_recursive_definition
121      {rec_axiom = listTheory.list_Axiom,
122       name      = "SL",
123       def       = ���(SL NIL = {}) /\
124                       (SL (CONS (y:'a) l) = y INSERT (SL l))���};
125
126
127val SL_APPEND = store_thm
128  ("SL_APPEND",
129 ���!(l1: 'a list) l2. SL (APPEND l1 l2) = (SL l1 UNION SL l2)���,
130    LIST_INDUCT_TAC
131    THEN ASM_REWRITE_TAC[APPEND,SL,UNION]
132   );
133
134
135val SL_FLAT = store_thm
136  ("SL_FLAT",
137 ���!(l: 'a list list). SL (FLAT l) = UNION_SET (SL (MAP SL l))���,
138    LIST_INDUCT_TAC
139    THEN REWRITE_TAC[FLAT,MAP,SL,UNION_SET]
140    THEN ASM_REWRITE_TAC[SL_APPEND]
141   );
142
143val SL_MAP = store_thm
144  ("SL_MAP",
145 ���!l (f: 'a->'b). SL (MAP f l) = IMAGE f (SL l)���,
146    LIST_INDUCT_TAC
147    THEN ASM_REWRITE_TAC[MAP,SL,IMAGE]
148   );
149
150val DELETE_DIFF_SL =
151 store_thm
152  ("DELETE_DIFF_SL",
153   ���!xs s (e:'a).
154        s DELETE e DIFF SL xs = s DIFF SL (e::xs)���,
155   LIST_INDUCT_TAC
156   THEN REWRITE_TAC[SL,DIFFF]
157  );
158
159
160val DL =
161    new_recursive_definition
162      {rec_axiom = listTheory.list_Axiom,
163       name      = "DL",
164       def       = ���(DL NIL = T) /\
165                       (DL (CONS (y:'a) l) = (~(y IN SL l) /\ DL l))���};
166
167
168
169val _ = export_theory();
170
171val _ = print_theory_to_file "-" "more_list.lst";
172
173val _ = html_theory "more_list";
174