@@ -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
14841484QED
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
16531772wf_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] >>
17531905check_interval_table_sem st_in interval_table packet_input’ by cheat >>
17541906gvs[]
17551907
1908+ *)
17561909
1757- *)
17581910
1911+
17591912val _ = export_theory ();
17601913
17611914
0 commit comments