Skip to content

Commit f3e2ac7

Browse files
some progress with the interval to sinterval proof2
1 parent 960f5ab commit f3e2ac7

File tree

1 file changed

+213
-60
lines changed

1 file changed

+213
-60
lines changed

hol/table_arith_to_intervalScript.sml

Lines changed: 213 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1473,69 +1473,201 @@ Proof
14731473
Induct >> rw[] >>
14741474
Cases_on ‘operate_intersect h (SOME Empty)’ >> gvs[] >>
14751475

1476-
rpt (BasicProvers.FULL_CASE_TAC >> gvs[]) >>
1477-
gvs[starting_from_none_intersection_results_none] >>
1476+
rpt (BasicProvers.FULL_CASE_TAC >> gvs[]) >>
1477+
gvs[starting_from_none_intersection_results_none] >>
14781478

1479-
(
1480-
Cases_on ‘h’ >> rgs[Once intersect_interval_def] >>
1481-
rgs[Once operate_intersect_def, intersect_interval_def]
1482-
)
1479+
(
1480+
Cases_on ‘h’ >> rgs[Once intersect_interval_def] >>
1481+
rgs[Once operate_intersect_def, intersect_interval_def]
1482+
)
14831483

14841484
QED
14851485

14861486

14871487

14881488

1489+
Theorem two_wf_interval_intersection_results_wf_interval:
1490+
∀ interval1 interval2 interval3.
1491+
wf_interval interval1 ∧
1492+
wf_interval interval2 ∧
1493+
operate_intersect interval1 (SOME interval2) = SOME interval3 ⇒
1494+
wf_interval interval3
1495+
Proof
1496+
Cases_on ‘interval1’ >>
1497+
Cases_on ‘interval2’ >>
1498+
rw[wf_interval_def, operate_intersect_def] >>
1499+
rpt (BasicProvers.FULL_CASE_TAC >> gvs[intersect_interval_def]) >>
1500+
1501+
gvs[wf_interval_def, wf_bit_def]
1502+
QED
14891503

14901504

14911505

14921506

1507+
Theorem transitive_binpred2:
1508+
∀ len a b c.
1509+
len > 0
1510+
len < 129
1511+
1512+
bitv_binpred binop_ge (a,len) (b,len) = SOME T ∧
1513+
bitv_binpred binop_le (c,len) (b,len) = SOME T ⇒
1514+
bitv_binpred binop_le (c,len) (a,len) = SOME T
1515+
Proof
1516+
rw[bitv_binpred_def] >>
1517+
RW.ONCE_RW_TAC [bitv_binpred_inner_def, get_word_binpred_def] >>
1518+
rpt strip_tac >>
1519+
1520+
rpt(
1521+
BasicProvers.FULL_CASE_TAC >-
1522+
(fs[get_word_binpred_def] >>
1523+
gvs[bitv_binpred_inner_def, get_word_binpred_def] >>
1524+
blastLib.FULL_BBLAST_TAC
1525+
)
1526+
) >> intLib.COOPER_TAC
1527+
QED
14931528

14941529

14951530

14961531

1532+
Theorem transitive_binpred3:
1533+
∀ len a b c.
1534+
len > 0
1535+
len < 129
1536+
bitv_binpred binop_ge (a,len) (b,len) = SOME T ∧
1537+
bitv_binpred binop_ge (c,len) (a,len) = SOME T ⇒
1538+
bitv_binpred binop_ge (c,len) (b,len) = SOME T
1539+
Proof
1540+
rw[bitv_binpred_def] >>
1541+
RW.ONCE_RW_TAC [bitv_binpred_inner_def, get_word_binpred_def] >>
1542+
rpt strip_tac >>
1543+
1544+
rpt(
1545+
BasicProvers.FULL_CASE_TAC >-
1546+
(fs[get_word_binpred_def] >>
1547+
gvs[bitv_binpred_inner_def, get_word_binpred_def] >>
1548+
blastLib.FULL_BBLAST_TAC
1549+
)
1550+
) >> intLib.COOPER_TAC
1551+
QED
14971552

14981553

1554+
Theorem transitive_binpred4:
1555+
∀ len a b c.
1556+
len > 0
1557+
len < 129
1558+
bitv_binpred binop_ge (a,len) (b,len) = SOME F ∧
1559+
bitv_binpred binop_ge (c,len) (a,len) = SOME F ⇒
1560+
bitv_binpred binop_ge (c,len) (b,len) = SOME F
1561+
Proof
1562+
rw[bitv_binpred_def] >>
1563+
RW.ONCE_RW_TAC [bitv_binpred_inner_def, get_word_binpred_def] >>
1564+
rpt strip_tac >>
1565+
1566+
rpt(
1567+
BasicProvers.FULL_CASE_TAC >-
1568+
(fs[get_word_binpred_def] >>
1569+
gvs[bitv_binpred_inner_def, get_word_binpred_def] >>
1570+
blastLib.FULL_BBLAST_TAC
1571+
)
1572+
) >> intLib.COOPER_TAC
1573+
QED
14991574

15001575

1576+
Theorem transitive_binpred5:
1577+
∀ len a b c.
1578+
len > 0
1579+
len < 129
1580+
bitv_binpred binop_ge (a,len) (b,len) = SOME F ∧
1581+
bitv_binpred binop_le (c,len) (a,len) = SOME T ⇒
1582+
bitv_binpred binop_le (c,len) (b,len) = SOME T
1583+
Proof
15011584

1585+
rw[bitv_binpred_def] >>
1586+
RW.ONCE_RW_TAC [bitv_binpred_inner_def, get_word_binpred_def] >>
1587+
rpt strip_tac >>
1588+
1589+
rpt(
1590+
BasicProvers.FULL_CASE_TAC >-
1591+
(fs[get_word_binpred_def] >>
1592+
gvs[bitv_binpred_inner_def, get_word_binpred_def] >>
1593+
blastLib.FULL_BBLAST_TAC
1594+
)
1595+
) >> intLib.COOPER_TAC
15021596

1597+
QED
15031598

1504-
(*
1505-
1506-
1507-
1508-
1509-
1599+
15101600

15111601

15121602

15131603

1604+
Theorem intersection_preserves_evaluation_thm:
1605+
∀ interval1 interval2 interval3 bs len packet_input.
1606+
len >0 ∧ len <129
1607+
operate_intersect interval1 (SOME interval2) = SOME interval3 ⇒
1608+
(
1609+
eval_interval_atom (bs,len) packet_input interval1 = SOME T ∧
1610+
eval_interval_atom (bs,len) packet_input interval2 = SOME T
1611+
1612+
eval_interval_atom (bs,len) packet_input interval3 = SOME T )
1613+
Proof
15141614

15151615

1616+
Cases_on ‘interval1’ >>
1617+
Cases_on ‘interval2’ >>
1618+
rw[operate_intersect_def] >>
1619+
rpt (BasicProvers.FULL_CASE_TAC >> gvs[intersect_interval_def]) >>
1620+
(* all cases *)
1621+
(
1622+
PairCases_on ‘p’ >>
1623+
PairCases_on ‘p'’ >>
1624+
PairCases_on ‘p0’ >>
1625+
PairCases_on ‘p0'’ >>
1626+
1627+
1628+
gvs[eval_interval_atom_def] >>
1629+
rpt (BasicProvers.FULL_CASE_TAC >> gvs[intersect_interval_def]) >>
15161630

1631+
1632+
1633+
gvs[bv_le_than_def, bv_ge_than_def, bv_gt_than_def] >>
1634+
1635+
1636+
1637+
imp_res_tac bitv_binpred_same_length >> gvs[] >>
1638+
imp_res_tac last_edge_of_binpred_neg >> gvs[] >>
1639+
imp_res_tac transitive_binpred1 >> gvs[] >>
1640+
imp_res_tac transitive_binpred2 >> gvs[] >>
1641+
imp_res_tac transitive_binpred3 >> gvs[] >>
1642+
imp_res_tac transitive_binpred4 >> gvs[] >>
1643+
imp_res_tac transitive_binpred5 >> gvs[]
1644+
)
1645+
QED
15171646

1518-
∀ interval_list len a b c d bs bs0 packet_input.
1519-
len > 0 ∧
1520-
len < 129 ∧
1521-
wf_bit (bs0,len) ∧
1522-
wf_interval (Single (c,len) (d,len)) ∧
1523-
EVERY (λinterval. wf_interval interval) interval_list ∧
1524-
FOLDL (λacc interval_g. operate_intersect interval_g acc)
1525-
(SOME (Single (c,len) (d,len))) interval_list = SOME (Single a b)
1526-
(*operate_intersect (Single (c,len) (d,len)) (SOME (mk_full_interval len)) = SOME (Single (c,len) (d,len))*)
1527-
(eval_interval_atom (bs0,len) packet_input (Single a b) = SOME T ⇔
1528-
is_interval_guards_true (Single (c,len) (d,len)::interval_list) (bs0,len) packet_input)
15291647

15301648

15311649

15321650

1651+
Theorem intersection_eval_row_interval_sinterval_correct:
1652+
∀ interval_list len a b c d bs bs0 packet_input.
1653+
len > 0
1654+
len < 129
1655+
wf_bit (bs0,len) ∧
1656+
wf_interval (Single (c,len) (d,len)) ∧
1657+
EVERY (λinterval. wf_interval interval) interval_list ∧
1658+
FOLDL (λacc interval_g. operate_intersect interval_g acc)
1659+
(SOME (Single (c,len) (d,len))) interval_list = SOME (Single a b) ⇒
1660+
(eval_interval_atom (bs0,len) packet_input (Single a b) = SOME T ⇔
1661+
is_interval_guards_true (Single (c,len) (d,len)::interval_list) (bs0,len) packet_input)
1662+
Proof
15331663
gvs[intersect_list_def] >>
15341664
Induct >> gvs[] >>
15351665
rw[FOLDL] >>
1536-
rpt strip_tac >|[
1537-
cheat
1666+
rpt strip_tac >|[
1667+
1668+
gvs[is_interval_guards_true_def]
15381669
,
1670+
15391671
Cases_on ‘operate_intersect h (SOME (Single (c,len) (d,len)))’ >|[
15401672
assume_tac starting_from_none_intersection_results_none >>
15411673
gvs[]
@@ -1546,35 +1678,32 @@ rpt strip_tac >|[
15461678
first_x_assum (strip_assume_tac o (Q.SPECL [‘interval_list’])) >>
15471679
gvs[]
15481680
,
1549-
first_x_assum (strip_assume_tac o (Q.SPECL [‘len’, ‘a’, ‘b’, ‘c’, ‘d’, ‘bs0’, ‘packet_input’])) >>
1550-
gvs[]
1681+
1682+
PairCases_on ‘p’ >>
1683+
PairCases_on ‘p0’ >>
1684+
imp_res_tac operate_intersect_two_intervals_len >> gvs[] >>
15511685

1686+
first_x_assum (strip_assume_tac o (Q.SPECL [‘len’, ‘a’, ‘b’, ‘p0'’, ‘p00’, ‘bs0’, ‘packet_input’])) >>
1687+
gvs[] >>
15521688

1689+
1690+
‘wf_interval (Single (p0',len) (p00,len))’ by metis_tac[two_wf_interval_intersection_results_wf_interval] >>
1691+
gvs[] >>
15531692

1693+
simp[is_interval_guards_true_def] >>
1694+
metis_tac[intersection_preserves_evaluation_thm]
15541695
]
1696+
]
15551697
]
1698+
QED
15561699

15571700

15581701

15591702

15601703

1704+
15611705

1562-
1563-
1564-
1565-
1566-
1567-
1568-
1569-
1570-
1571-
1572-
1573-
1574-
1575-
1576-
1577-
Theorem blah:
1706+
Theorem intersection_eval_row_interval_sinterval_correct_full:
15781707
∀ interval_list len bs lval packet_type packet_input a b.
15791708
wf_packet packet_type packet_input ∧
15801709
resolve_lval_type packet_type lval = SOME (type_length len) ∧
@@ -1624,13 +1753,7 @@ Proof
16241753

16251754
rename1 ‘operate_intersect (Single (c,len) (d,len)) (SOME (mk_full_interval len)) =
16261755
SOME (Single (c,bs1) (d,len))’ >>
1627-
1628-
1629-
1630-
1631-
1632-
cheat
1633-
1756+
metis_tac [intersection_eval_row_interval_sinterval_correct]
16341757
]
16351758
]
16361759

@@ -1639,15 +1762,11 @@ QED
16391762

16401763

16411764

1765+
16421766

16431767

16441768

1645-
1646-
1647-
1648-
1649-
1650-
1769+
(*
16511770
(**********************)
16521771
16531772
wf_packet packet_type packet_input ∧
@@ -1719,12 +1838,45 @@ rpt (BasicProvers.FULL_CASE_TAC >> gvs[]) >|[
17191838
rpt (BasicProvers.FULL_CASE_TAC >> gvs[]) >>
17201839
17211840
gvs [is_sinterval_match_row_def, is_interval_match_row_def] >>
1722-
metis_tac[blah] >> cheat
1841+
metis_tac[intersection_eval_row_interval_sinterval_correct_full]
17231842
]
17241843
,
17251844
(* key const *)
1726-
cheat
1727-
(*might be complex?*)
1845+
gvs[check_sinterval_table_sem_def, check_interval_table_sem_def] >>
1846+
Cases_on ‘extract_bv_from_key (key_const (q,r)) packet_input’ >> gvs[] >>
1847+
1848+
gvs[extract_bv_from_key_def] >>
1849+
simp[LIST_EQ_REWRITE] >>
1850+
1851+
‘LENGTH (convert_interval_to_sinterval_rows r tbl_intvl) =
1852+
LENGTH tbl_intvl’ by cheat >>
1853+
gvs[] >>
1854+
1855+
rpt strip_tac >>
1856+
gvs[EL_MAP] >>
1857+
1858+
Cases_on ‘EL x (convert_interval_to_sinterval_rows r tbl_intvl)’ >> Cases_on ‘r'’ >>
1859+
Cases_on ‘EL x tbl_intvl’ >> Cases_on ‘r'’ >>
1860+
1861+
rename1 ‘EL x (convert_interval_to_sinterval_rows r tbl_intvl) = (sinterval,s_in_sintvl,res_sintvl)’ >>
1862+
rename1 ‘EL x tbl_intvl = (interval_list,s_in_intvl,res_intvl)’ >>
1863+
gvs[] >>
1864+
1865+
1866+
gvs[convert_interval_to_sinterval_rows_def] >>
1867+
Cases_on ‘tbl_intvl = []’ >> gvs[] >>
1868+
gvs[EL_MAP] >>
1869+
1870+
Cases_on ‘interval_list = []’ >> gvs[] >-
1871+
gvs[check_sinterval_rows_sem_def, is_interval_match_row_def] >>
1872+
1873+
gvs[check_sinterval_rows_sem_def] >>
1874+
rpt (BasicProvers.FULL_CASE_TAC >> gvs[]) >>
1875+
1876+
1877+
1878+
1879+
17281880
17291881
]
17301882
@@ -1753,9 +1905,10 @@ rw[match_sinterval_table_def, match_interval_table_def] >>
17531905
check_interval_table_sem st_in interval_table packet_input’ by cheat >>
17541906
gvs[]
17551907
1908+
*)
17561909

1757-
*)
17581910

1911+
17591912
val _ = export_theory ();
17601913

17611914

0 commit comments

Comments
 (0)