Skip to content

Commit 1c36fa5

Browse files
Some updates to bigstep semantics
1 parent 72b5100 commit 1c36fa5

File tree

1 file changed

+104
-82
lines changed

1 file changed

+104
-82
lines changed

hol/symb_exec/p4_bigstepScript.sml

Lines changed: 104 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -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]
11781178
QED
11791179

11801180
Theorem 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.
11821182
bigstep_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))))
11941194
Proof
11951195
measureInduct_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... *)
15961610
Definition 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)
16031618
End
16041619

16051620
Definition 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)
16151631
End
16161632

16171633
(* Version for use with e_multi_exec'_list *)
16181634
Definition 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)
16281645
End
16291646

16301647
Definition 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
16481667
End
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 *)
16521671
Definition 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)
16661687
End
16671688

16681689
(* TODO: Move *)
16691690
Theorem 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
16731694
Proof
16741695
rpt strip_tac >>
@@ -1682,21 +1703,22 @@ Cases_on ‘e'’ >> (
16821703
QED
16831704

16841705
Theorem 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')
16891710
Proof
16901711
Induct_on ‘n’ >- (
16911712
gs[e_multi_exec'_def]
16921713
) >>
16931714
rpt 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+
)
17001722
QED
17011723

17021724
Theorem bigstep_e_acc_exec_sound_n_v:

0 commit comments

Comments
 (0)