@@ -388,7 +388,7 @@ Definition bigstep_arch_exec_def:
388388 | (stmt::t') =>
389389 let func_maps_opt = (case ctx_b_func_map_opt of
390390 | NONE => NONE
391- | SOME (((ab_list, pblock_map, ffblock_map, input_f, output_f, copyin_pbl, copyout_pbl, apply_table_f, ext_map, func_map):'a actx), b_func_map) => SOME (func_map, b_func_map, ext_map)) in
391+ | SOME (((ab_list, pblock_map, ffblock_map, input_f, output_f, copyin_pbl, copyout_pbl, apply_table_f, ext_map, func_map, get_oracle_index, set_oracle_index, random_oracle ):'a actx), b_func_map) => SOME (func_map, b_func_map, ext_map)) in
392392 (case bigstep_exec func_maps_opt ([g_scope1; g_scope2], scope_list) stmt of
393393 | SOME (stmt', g_scope_list', scope_list', n) =>
394394 SOME (g_scope_list', arch_frame_list_regular ((funn, (stmt'::t'), scope_list')::t), n)
@@ -1178,18 +1178,18 @@ gs[listTheory.INDEX_FIND_add]
11781178QED
11791179
11801180Theorem bigstep_e_exec_sound:
1181- !t scope_list g_scope_list' t' e e_l apply_table_f (ext_map:'a ext_map) func_map b_func_map pars_map tbl_map.
1181+ !t scope_list g_scope_list' t' e e_l apply_table_f (ext_map:'a ext_map) func_map b_func_map pars_map tbl_map oracle_index random_oracle .
11821182bigstep_e_exec (scope_list ++ g_scope_list') t 0 = SOME (t', 1 ) ==>
11831183(t = (INL e) ==>
1184- (?e'. (t' = (INL e')) /\
1185- e_exec (apply_table_f,ext_map,func_map,b_func_map,pars_map,tbl_map)
1186- g_scope_list' scope_list e = SOME (e', [] ))) /\
1184+ (?e' oracle_index' . (t' = (INL e')) /\
1185+ e_exec (apply_table_f,ext_map,func_map,b_func_map,pars_map,tbl_map,oracle_index,random_oracle )
1186+ g_scope_list' scope_list e = SOME (e', ([], oracle_index') ))) /\
11871187(t = INR e_l ==>
11881188((e_l = []) \/
11891189 ?i. unred_mem_index e_l = SOME i /\
1190- (?e'.
1191- e_exec (apply_table_f,ext_map,func_map,b_func_map,pars_map,tbl_map)
1192- g_scope_list' scope_list (EL i e_l) = SOME (e', [] ) /\
1190+ (?e' oracle_index' .
1191+ e_exec (apply_table_f,ext_map,func_map,b_func_map,pars_map,tbl_map,oracle_index,random_oracle )
1192+ g_scope_list' scope_list (EL i e_l) = SOME (e', ([], oracle_index') ) /\
11931193 t' = INR (LUPDATE e' i e_l))))
11941194Proof
11951195measureInduct_on ‘( \ t. case t of
@@ -1249,7 +1249,8 @@ Induct_on ‘t’ >- (
12491249 ) >- (
12501250 Cases_on ‘x’ >> (
12511251 fs[is_v_def, bigstep_e_exec_def, AllCaseEqs()]
1252- )
1252+ ) >>
1253+ gvs[AllCaseEqs()]
12531254 ) >>
12541255 imp_res_tac bigstep_e_exec_unchanged >>
12551256 gs[]
@@ -1261,10 +1262,12 @@ Induct_on ‘t’ >- (
12611262 fs[] >>
12621263 Cases_on ‘is_v x’ >> (
12631264 gs[]
1265+ ) >- (
1266+ Cases_on ‘x’ >> (
1267+ gs[is_v_def, bigstep_e_exec_def]
1268+ )
12641269 ) >>
1265- Cases_on ‘x’ >> (
1266- gs[is_v_def, bigstep_e_exec_def]
1267- ),
1270+ gvs[AllCaseEqs()],
12681271
12691272 (* cast *)
12701273 gvs[bigstep_e_exec_cast_REWR] >> (
@@ -1287,10 +1290,12 @@ Induct_on ‘t’ >- (
12871290 fs[] >>
12881291 Cases_on ‘is_v x’ >> (
12891292 gs[]
1293+ ) >- (
1294+ Cases_on ‘x’ >> (
1295+ gs[is_v_def, bigstep_e_exec_def]
1296+ )
12901297 ) >>
1291- Cases_on ‘x’ >> (
1292- gs[is_v_def, bigstep_e_exec_def]
1293- ),
1298+ gvs[AllCaseEqs()],
12941299
12951300 (* binop *)
12961301 gvs[bigstep_e_exec_binop_REWR] >> (
@@ -1314,22 +1319,21 @@ Induct_on ‘t’ >- (
13141319 ) >- (
13151320 Cases_on ‘x’ >> (
13161321 gvs[is_v_def]
1322+ ) >>
1323+ Cases_on ‘is_v x'’ >> (
1324+ gs[]
13171325 ) >- (
1318- Cases_on ‘is_v x'’ >> (
1319- gs[]
1320- ) >- (
1321- Cases_on ‘x'’ >> (
1322- gvs[is_v_def]
1323- ) >>
1324- gs[bigstep_e_exec_def]
1326+ Cases_on ‘x'’ >> (
1327+ gvs[is_v_def]
13251328 ) >>
1326- gs[bigstep_e_exec_def] >>
1327- gvs[] >>
1328- PAT_X_ASSUM “!y. _” (fn thm => assume_tac (Q.SPECL [‘(INL x')’] thm)) >>
1329- gs[e_size_def] >>
1330- res_tac >>
1331- fs[]
1332- )
1329+ gs[bigstep_e_exec_def]
1330+ ) >>
1331+ gs[bigstep_e_exec_def] >>
1332+ gvs[AllCaseEqs()] >>
1333+ PAT_X_ASSUM “!y. _” (fn thm => assume_tac (Q.SPECL [‘(INL x')’] thm)) >>
1334+ gs[e_size_def] >>
1335+ res_tac >>
1336+ fs[]
13331337 ) >>
13341338 imp_res_tac bigstep_e_exec_incr >>
13351339 subgoal ‘n' = 1 ’ >- (
@@ -1350,7 +1354,7 @@ Induct_on ‘t’ >- (
13501354 res_tac >>
13511355 fs[] >>
13521356 imp_res_tac bigstep_e_exec_unchanged >>
1353- gs[ ]
1357+ gvs[AllCaseEqs() ]
13541358 )
13551359 ) >- (
13561360 gs[] >>
@@ -1359,7 +1363,7 @@ Induct_on ‘t’ >- (
13591363 res_tac >>
13601364 fs[] >>
13611365 Cases_on ‘x’ >> (
1362- gs [bigstep_e_exec_def]
1366+ gvs [bigstep_e_exec_def, AllCaseEqs() ]
13631367 )
13641368 ),
13651369
@@ -1399,7 +1403,7 @@ Induct_on ‘t’ >- (
13991403 res_tac >>
14001404 fs[] >>
14011405 imp_res_tac bigstep_e_exec_unchanged >>
1402- gs[ ]
1406+ gvs[AllCaseEqs() ]
14031407 ) >>
14041408 imp_res_tac bigstep_e_exec_incr >>
14051409 subgoal ‘n' = 1 ’ >- (
@@ -1417,7 +1421,7 @@ Induct_on ‘t’ >- (
14171421 res_tac >>
14181422 fs[] >>
14191423 imp_res_tac bigstep_e_exec_unchanged >>
1420- gs[ ]
1424+ gvs[AllCaseEqs() ]
14211425 ) >- (
14221426 gs[] >>
14231427 PAT_X_ASSUM “!y. _” (fn thm => assume_tac (Q.SPECL [‘(INL x)’] thm)) >>
@@ -1428,7 +1432,7 @@ Induct_on ‘t’ >- (
14281432 gs[]
14291433 ) >>
14301434 Cases_on ‘x’ >> (
1431- gvs[is_v_bit_def]
1435+ gvs[is_v_bit_def, AllCaseEqs() ]
14321436 ) >>
14331437 gs[bigstep_e_exec_def]
14341438 ),
@@ -1456,7 +1460,7 @@ Induct_on ‘t’ >- (
14561460 gs[]
14571461 ) >>
14581462 Cases_on ‘x’ >> (
1459- gs[is_v_bit_def, bigstep_e_exec_def]
1463+ gs[is_v_bit_def, bigstep_e_exec_def, AllCaseEqs() ]
14601464 ),
14611465
14621466 (* call *)
@@ -1476,7 +1480,8 @@ Induct_on ‘t’ >- (
14761480 PAT_X_ASSUM “!y. _” (fn thm => assume_tac (Q.SPECL [‘(INL x)’] thm)) >>
14771481 gs[e_size_def] >>
14781482 res_tac >>
1479- fs[],
1483+ fs[] >>
1484+ gvs[AllCaseEqs()],
14801485
14811486 (* struct *)
14821487 rw[] >>
@@ -1498,7 +1503,7 @@ Induct_on ‘t’ >- (
14981503 PAT_X_ASSUM “!y. _” (fn thm => ASSUME_TAC (Q.SPECL [‘(INR (MAP SND (l:(string # e) list)))’] thm)) >>
14991504 gs[e_size_def, e3_e1_size, e3_size_list] >>
15001505 res_tac >>
1501- PAT_X_ASSUM “!tbl_map pars_map func_map ext_map b_func_map apply_table_f. _” (fn thm => ASSUME_TAC (Q.SPECL [‘tbl_map’, ‘pars_map’, ‘func_map’, ‘ext_map’, ‘b_func_map’, ‘apply_table_f’] thm)) >>
1506+ PAT_X_ASSUM “!tbl_map random_oracle pars_map oracle_index func_map ext_map b_func_map apply_table_f. _” (fn thm => ASSUME_TAC (Q.SPECL [‘tbl_map’, ‘random_oracle’, ‘ pars_map’, ‘oracle_index ’, ‘func_map’, ‘ext_map’, ‘b_func_map’, ‘apply_table_f’] thm)) >>
15021507 Cases_on ‘l’ >- (
15031508 gs[bigstep_e_exec_def, e_exec_def]
15041509 ) >>
@@ -1528,7 +1533,7 @@ Induct_on ‘y’ >> (
15281533 ) >>
15291534 fs[] >>
15301535 res_tac >>
1531- PAT_X_ASSUM “!tbl_map pars_map func_map ext_map b_func_map apply_table_f. _” (fn thm => ASSUME_TAC (Q.SPECL [‘tbl_map’, ‘pars_map’, ‘func_map’, ‘ext_map’, ‘b_func_map’, ‘apply_table_f’] thm)) >>
1536+ PAT_X_ASSUM “!tbl_map random_oracle pars_map oracle_index func_map ext_map b_func_map apply_table_f. _” (fn thm => ASSUME_TAC (Q.SPECL [‘tbl_map’, ‘random_oracle’, ‘ pars_map’, ‘oracle_index ’, ‘func_map’, ‘ext_map’, ‘b_func_map’, ‘apply_table_f’] thm)) >>
15321537 fs[] >>
15331538 gvs[] >- (
15341539 gs[bigstep_e_exec_def]
@@ -1592,83 +1597,99 @@ QED
15921597(* TODO: rename "fuel" to "nsteps" or something else, since it has to do with a
15931598 * compelled number of reductions *)
15941599
1600+ (* New type for mutli-step expression exec sem *)
1601+ Type emctx = “:('a apply_table_f # 'a ext_map # func_map # b_func_map # pars_map # tbl_map # random_oracle)”;
1602+
1603+ Definition add_oracle_index_def:
1604+ add_oracle_index ((apply_table_f,ext_map,func_map,b_func_map,pars_map,tbl_map,random_oracle):'a emctx) i =
1605+ ((apply_table_f,ext_map,func_map,b_func_map,pars_map,tbl_map,i,random_oracle):'a ectx)
1606+ End
1607+
15951608(* This will just yield NONE for new frames *)
1609+ (* Ugh, this looks ugly with random oracle index... *)
15961610Definition e_multi_exec_def:
1597- (e_multi_exec _ _ _ e 0 = SOME e )
1611+ (e_multi_exec ((apply_table_f,ext_map,func_map,b_func_map,pars_map,tbl_map,random_oracle):'a emctx) _ _ (e,i) 0 = SOME (e, i) )
15981612 /\
1599- (e_multi_exec (ctx:'a ctx) g_scope_list scope_list e (SUC fuel) =
1600- case e_exec ctx g_scope_list scope_list e of
1601- | SOME (e', []) => e_multi_exec ctx g_scope_list scope_list e' fuel
1613+ (e_multi_exec (apply_table_f,ext_map,func_map,b_func_map,pars_map,tbl_map,random_oracle) g_scope_list scope_list (e,i) (SUC fuel) =
1614+ case e_exec (apply_table_f,ext_map,func_map,b_func_map,pars_map,tbl_map,i,random_oracle) g_scope_list scope_list e of
1615+ | SOME (e', ([], SOME i')) => e_multi_exec (apply_table_f,ext_map,func_map,b_func_map,pars_map,tbl_map,random_oracle) g_scope_list scope_list (e',i') fuel
1616+ | SOME (e', ([], NONE )) => e_multi_exec (apply_table_f,ext_map,func_map,b_func_map,pars_map,tbl_map,random_oracle) g_scope_list scope_list (e',i) fuel
16021617 | _ => NONE )
16031618End
16041619
16051620Definition e_multi_exec'_def:
1606- (e_multi_exec' _ _ _ e 0 = SOME e )
1621+ (e_multi_exec' _ _ _ (e,i) 0 = SOME (e,i) )
16071622 /\
1608- (e_multi_exec' (ctx:'a ctx) g_scope_list scope_list e (SUC fuel) =
1609- case e_multi_exec' ctx g_scope_list scope_list e fuel of
1610- | SOME e' =>
1611- (case e_exec ctx g_scope_list scope_list e' of
1612- | SOME (e'', []) => SOME e''
1623+ (e_multi_exec' (emctx:'a emctx) g_scope_list scope_list (e,i) (SUC fuel) =
1624+ case e_multi_exec' emctx g_scope_list scope_list (e,i) fuel of
1625+ | SOME (e',i') =>
1626+ (case e_exec (add_oracle_index emctx i') g_scope_list scope_list e' of
1627+ | SOME (e'', ([], NONE )) => SOME (e'',i')
1628+ | SOME (e'', ([], SOME i'')) => SOME (e'',i'')
16131629 | _ => NONE )
16141630 | _ => NONE )
16151631End
16161632
16171633(* Version for use with e_multi_exec'_list *)
16181634Definition e_multi_exec'_count_def:
1619- (e_multi_exec'_count _ _ _ e 0 = SOME (e , 0 :num))
1635+ (e_multi_exec'_count _ _ _ (e,i) 0 = SOME ((e,i) , 0 :num))
16201636 /\
1621- (e_multi_exec'_count (ctx:'a ctx) g_scope_list scope_list e (SUC fuel) =
1622- case e_multi_exec'_count ctx g_scope_list scope_list e fuel of
1623- | SOME (e', n) =>
1624- (case e_exec ctx g_scope_list scope_list e' of
1625- | SOME (e'', []) => SOME (e'', n+1 )
1637+ (e_multi_exec'_count (emctx:'a emctx) g_scope_list scope_list (e,i) (SUC fuel) =
1638+ case e_multi_exec'_count emctx g_scope_list scope_list (e,i) fuel of
1639+ | SOME ((e',i'), n) =>
1640+ (case e_exec (add_oracle_index emctx i') g_scope_list scope_list e' of
1641+ | SOME (e'', ([], NONE )) => SOME ((e'',i'), n+1 )
1642+ | SOME (e'', ([], SOME i'')) => SOME ((e'',i''), n+1 )
16261643 | _ => NONE )
16271644 | _ => NONE )
16281645End
16291646
16301647Definition e_multi_exec'_list_def:
1631- (e_multi_exec'_list _ _ _ e_l (0 :num) = SOME e_l)
1648+ (e_multi_exec'_list _ _ _ ( e_l, i) (0 :num) = SOME ( e_l,i) )
16321649 /\
1633- (e_multi_exec'_list _ _ _ [] _ = SOME [] )
1650+ (e_multi_exec'_list _ _ _ ([],i) _ = SOME ([],i) )
16341651 /\
1635- (e_multi_exec'_list (ctx :'a ctx ) g_scope_list scope_list (h::t) (SUC fuel) =
1652+ (e_multi_exec'_list (emctx :'a emctx ) g_scope_list scope_list (( h::t),i ) (SUC fuel) =
16361653 if is_v h
16371654 then
1638- (case e_multi_exec'_list ctx g_scope_list scope_list t (SUC fuel) of
1639- | SOME t' => SOME (h::t')
1655+ (case e_multi_exec'_list emctx g_scope_list scope_list (t,i) (SUC fuel) of
1656+ | SOME (t',i') => SOME (( h::t'), i ')
16401657 | NONE => NONE )
16411658 else
1642- (case e_multi_exec'_count ctx g_scope_list scope_list h (SUC fuel) of
1643- | SOME (h' , fuel_spent) =>
1644- (case e_multi_exec'_list ctx g_scope_list scope_list t ((SUC fuel)-fuel_spent) of
1645- | SOME t' => SOME (h'::t')
1659+ (case e_multi_exec'_count emctx g_scope_list scope_list (h,i) (SUC fuel) of
1660+ | SOME ((h', i') , fuel_spent) =>
1661+ (case e_multi_exec'_list emctx g_scope_list scope_list (t,i') ((SUC fuel)-fuel_spent) of
1662+ | SOME (t',i'') => SOME (( h'::t'), i' ')
16461663 | NONE => NONE )
16471664 | _ => NONE ))
1665+ Termination
1666+ cheat
16481667End
16491668(* For the purposes of bigstep_stmt_app_exec_sound_n, it would be useful if
16501669 * e_multi_exec'_list would find the first instance of a non-v expression in the expression
16511670 * list and start reducing it stepwise using e_exec *)
16521671Definition e_multi_exec'_list'_def:
1653- (e_multi_exec'_list' _ _ _ e_l 0 = SOME e_l)
1672+ (e_multi_exec'_list' _ _ _ ( e_l,i) 0 = SOME ( e_l,i) )
16541673 /\
1655- (e_multi_exec'_list' (ctx :'a ctx ) g_scope_list scope_list e_l (SUC fuel) =
1656- case e_multi_exec'_list' ctx g_scope_list scope_list e_l fuel of
1657- | SOME e_l' =>
1674+ (e_multi_exec'_list' (emctx :'a emctx ) g_scope_list scope_list ( e_l,i) (SUC fuel) =
1675+ case e_multi_exec'_list' emctx g_scope_list scope_list ( e_l,i) fuel of
1676+ | SOME ( e_l',i') =>
16581677 (case unred_mem_index e_l' of
1659- | SOME i =>
1660- (case e_exec ctx g_scope_list scope_list (EL i e_l') of
1661- | SOME (e', []) =>
1662- SOME (LUPDATE e' i e_l')
1678+ | SOME j =>
1679+ (case e_exec (add_oracle_index emctx i') g_scope_list scope_list (EL j e_l') of
1680+ | SOME (e', ([],NONE )) =>
1681+ SOME ((LUPDATE e' j e_l'), i')
1682+ | SOME (e', ([],SOME i'')) =>
1683+ SOME ((LUPDATE e' j e_l'), i'')
16631684 | _ => NONE )
16641685 | NONE => NONE )
16651686 | NONE => NONE )
16661687End
16671688
16681689(* TODO: Move *)
16691690Theorem e_exec_not_v:
1670- !ctx g_scope_list scope_list e e'.
1671- e_exec ctx g_scope_list scope_list e = SOME (e',[] ) ==>
1691+ !ctx g_scope_list scope_list e i e'.
1692+ e_exec ctx g_scope_list scope_list e = SOME (e',([],i) ) ==>
16721693~is_v e
16731694Proof
16741695rpt strip_tac >>
@@ -1682,21 +1703,22 @@ Cases_on ‘e'’ >> (
16821703QED
16831704
16841705Theorem bigstep_e_acc_exec_sound_n_not_v:
1685- !ctx g_scope_list' scope_list e e ' n f.
1706+ !emctx g_scope_list' scope_list e i e' i ' n f.
16861707~is_v e' ==>
1687- e_multi_exec' (ctx :'a ctx ) g_scope_list' scope_list e n = SOME e' ==>
1688- e_multi_exec' ctx g_scope_list' scope_list (e_acc e f) n = SOME (e_acc e' f)
1708+ e_multi_exec' (emctx :'a emctx ) g_scope_list' scope_list (e,i) n = SOME (e',i') ==>
1709+ e_multi_exec' emctx g_scope_list' scope_list (( e_acc e f),i) n = SOME (( e_acc e' f),i' )
16891710Proof
16901711Induct_on ‘n’ >- (
16911712 gs[e_multi_exec'_def]
16921713) >>
16931714rpt strip_tac >>
1694- gs[e_multi_exec'_def, AllCaseEqs()] >>
1695- subgoal ‘~is_v e''’ >- (
1696- metis_tac[e_exec_not_v]
1697- ) >>
1698- res_tac >>
1699- fs[e_exec_def]
1715+ gvs[e_multi_exec'_def, AllCaseEqs()] >> (
1716+ subgoal ‘~is_v e''’ >- (
1717+ metis_tac[e_exec_not_v]
1718+ ) >>
1719+ res_tac >>
1720+ fs[e_exec_def]
1721+ )
17001722QED
17011723
17021724Theorem bigstep_e_acc_exec_sound_n_v:
0 commit comments