@@ -393,33 +393,36 @@ Triviality json_parse_obj_size:
393393Proof
394394Induct_on ‘json_list’ >- (
395395 rpt strip_tac >>
396- fs [json_parse_obj_def, json_dest_obj_def, app_opt_def ] >>
396+ gs [json_parse_obj_def, json_dest_obj_def] >>
397397 Cases_on ‘json’ >> (fs[json_size_def])
398398) >>
399399rpt strip_tac >>
400- fs[json_parse_obj_def, app_opt_def] >>
401- Cases_on ‘json’ >> (fs[json_dest_obj_def]) >>
402- rw[] >>
403- Cases_on ‘str_list’ >> (fs[json_parse_obj'_def, json_size_def]) >>
404- (Cases_on ‘l’ >> (fs[json_parse_obj'_def, json_size_def])) >>
405-
406- Cases_on ‘h''’ >> (fs[json_parse_obj'_def, json_size_def, app_opt_def]) >>
407- Cases_on ‘json_parse_obj' t t'’ >> (fs[json_parse_obj'_def, json_size_def]) >>
408- rw[] >>
409- subgoal ‘(case (Object t') of
400+ gs[json_parse_obj_def] >>
401+ Cases_on ‘str_list’ >> (Cases_on ‘x’ >> (gs[json_parse_obj'_def, json_size_def])) >>
402+ PairCases_on ‘h''’ >>
403+ gvs[json_parse_obj'_def, json_size_def] >>
404+ Cases_on ‘json’ >> (gvs[json_dest_obj_def]) >>
405+ subgoal ‘?x. (case (Object t') of
410406 Object obj => SOME obj
411407 | Array v8 => NONE
412408 | String v9 => NONE
413409 | Number v10 v11 v12 => NONE
414410 | Bool v13 => NONE
415411 | Null => NONE ) =
416412 SOME t'’ >- (
417- fs []
413+ gs []
418414) >>
419- subgoal ‘json3_size json_list < json_size (Object t')’ >- (
420- metis_tac[]
421- ) >>
422- fs[json_size_def]
415+ res_tac >>
416+ gs[]
417+ QED
418+
419+ Theorem list_size_json3:
420+ !json_list.
421+ list_size json_size json_list = json3_size json_list
422+ Proof
423+ Induct >> (
424+ gs[list_size_def, json_size_def]
425+ )
423426QED
424427
425428(* Parses compile-time known constants, e.g. in bitstring widths *)
@@ -1227,24 +1230,24 @@ Definition petr4_parse_expression_gen_def:
12271230 | SOME_msg (SetExp e) => get_error_msg " set expression in unsupported location: " h1
12281231 | NONE_msg exp_msg => NONE_msg (" could not parse expression: " ++exp_msg))
12291232Termination
1230- WF_REL_TAC ` measure ( \ t. case t of
1233+ WF_REL_TAC ‘ measure ( \ t. case t of
12311234 | (INL (maps, json, p_tau_opt)) => json_size json
12321235 | (INR $ INL (maps, json_list)) => json_p_tau_opt_list_size json_list
1233- | (INR $ INR (maps, json_list)) => json_p_tau_opt_list_size json_list)` >>
1234- fs[json_p_tau_opt_list_size_def] >>
1235- rpt strip_tac >> (fs[json_size_def]) >- (
1236- subgoal ‘?l1 l2. UNZIP t = (l1, l2)’ >- (fs[UNZIP_MAP]) >>
1237- fs []
1236+ | (INR $ INR (maps, json_list)) => json_p_tau_opt_list_size json_list)’ >>
1237+ gs[json_p_tau_opt_list_size_def] >>
1238+ rpt strip_tac >> (gs[json_size_def]) >- (
1239+ gs[UNZIP_MAP]
12381240) >- (
1239- subgoal ‘?l1 l2. UNZIP t = (l1, l2)’ >- (fs[UNZIP_MAP]) >>
1240- fs []
1241+ gs[UNZIP_MAP]
12411242) >- (
1242- subgoal ‘?l1 l2. UNZIP t = (l1, l2)’ >- (fs[UNZIP_MAP]) >>
1243- fs []
1243+ gs[UNZIP_MAP]
12441244) >- (
1245- subgoal ‘LENGTH args = LENGTH p_1'5 '’ >- (imp_res_tac find_fty_match_args_LENGTH >> fs[]) >>
1246- fs[listTheory.UNZIP_ZIP]
1247- )
1245+ gs[list_size_json3]
1246+ ) >- (
1247+ gs[list_size_json3]
1248+ ) >>
1249+ ‘LENGTH args = LENGTH p_1'5 '’ by (imp_res_tac find_fty_match_args_LENGTH >> gs[]) >>
1250+ gs[UNZIP_MAP, listTheory.MAP_ZIP, list_size_json3]
12481251End
12491252
12501253(* TODO: Baking this into the above messes up the termination proof... *)
@@ -2282,25 +2285,48 @@ Definition petr4_parse_stmts_def:
22822285 | NONE_msg msg' => NONE_msg msg')
22832286 | NONE_msg msg => NONE_msg msg)
22842287Termination
2285- WF_REL_TAC ` measure ( \ t. case t of | (INL (maps, json_list)) => json3_size json_list | (INR (maps, json_list_list)) => SUM (MAP (\ el . json3_size el + 1 ) json_list_list))` >>
2288+ WF_REL_TAC ‘ measure ( \ t. case t of | (INL (maps, json_list)) => json3_size json_list | (INR (maps, json_list_list)) => SUM (MAP (\ el . json3_size el + 1 ) json_list_list))’ >>
22862289rpt strip_tac >> (fs[json_size_def]) >- (
2287- fs[json_parse_obj_def, json_dest_obj_def, app_opt_def ] >>
2290+ fs[json_parse_obj_def, json_dest_obj_def] >>
22882291 Cases_on ‘p_2'’ >> (fs[]) >>
22892292 rw[] >>
2290- Cases_on ‘l’ >> (fs[json_parse_obj'_def, app_opt_def ]) >>
2291- Cases_on ‘h’ >> (fs[json_parse_obj'_def, app_opt_def ]) >>
2292- Cases_on ‘t'’ >> (fs[json_parse_obj'_def, app_opt_def ]) >>
2293- Cases_on ‘h’ >> (fs[json_parse_obj'_def, app_opt_def ]) >>
2293+ Cases_on ‘l’ >> (fs[json_parse_obj'_def]) >>
2294+ Cases_on ‘h’ >> (fs[json_parse_obj'_def]) >>
2295+ Cases_on ‘t'’ >> (fs[json_parse_obj'_def]) >>
2296+ Cases_on ‘h’ >> (fs[json_parse_obj'_def]) >>
22942297 Cases_on ‘q' = " annotations" ’ >> (fs[]) >>
2295- Cases_on ‘t''’ >> (fs[json_parse_obj'_def, app_opt_def ]) >>
2296- Cases_on ‘h’ >> (fs[json_parse_obj'_def, app_opt_def ]) >>
2298+ Cases_on ‘t''’ >> (fs[json_parse_obj'_def]) >>
2299+ Cases_on ‘h’ >> (fs[json_parse_obj'_def]) >>
22972300 Cases_on ‘q'' = " statements" ’ >> (fs[]) >>
2298- Cases_on ‘json_parse_obj' [] t'’ >> (fs[json_size_def, app_opt_def])
2301+ Cases_on ‘json_parse_obj' [] t'’ >> (fs[json_size_def]) >>
2302+
2303+ gvs[char_size_def] >>
2304+ ‘json3_size t +
2305+ (json_size annotations +
2306+ (json_size p_2 +
2307+ (json_size r +
2308+ (list_size json_size stmts +
2309+ (list_size (pair_size (list_size char_size) json_size) t' + 57 ))))) =
2310+ json3_size stmts + 1 +
2311+ json3_size t +
2312+ (json_size annotations +
2313+ (json_size p_2 +
2314+ (json_size r +
2315+ (list_size (pair_size (list_size char_size) json_size) t' + 56 ))))’ suffices_by (
2316+ gs[]
2317+ ) >>
2318+ gvs[] >>
2319+ ‘list_size json_size stmts = json3_size stmts’ by (
2320+ Induct_on ‘stmts’ >> (
2321+ fs[json_size_def, list_size_def]
2322+ )
2323+ ) >>
2324+ gs[]
22992325) >- (
23002326 (* Switch case *)
23012327 IMP_RES_TAC petr4_parse_switch_cases_size >>
23022328 res_tac >>
2303- fs[json_size_def, app_opt_def ]
2329+ fs[json_size_def]
23042330)
23052331End
23062332
0 commit comments