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