@@ -1630,6 +1630,197 @@ Proof.
1630
1630
1631
1631
Qed .
1632
1632
1633
+ Example paper_list:
1634
+ has_type
1635
+ []
1636
+ (tobj 0
1637
+ [(2, dfun 1 (tlet 2 (tobj 2 [(2, dfun 3 (tapp (tvar 2) 2 (tvar 3)));
1638
+ (1, dfun 3 (tapp (tvar 2) 1 (tvar 3)));
1639
+ (0, dmem TBot)])
1640
+ (tvar 2)));
1641
+ (1, dfun 1(*type T *) (tlet 2 (tobj 2
1642
+ [(0, dfun 3(*hd *) (tlet 4 (tobj 4 [(0, dfun 5(*tl *) (tlet 6 (tobj 6
1643
+ [(2, dfun 7 (tvar 5)); (1, dfun 7 (tvar 3));
1644
+ (0, dmem (TSel (varF 1) 0))]) (tvar 6)))]) (tvar 4)))]) (tvar 2)));
1645
+ (0, dmem (TBind (TAnd
1646
+ (TAll 2 TTop (TAnd (TSel (varB 2) 0) (TBind (TMem 0 TBot (TSel (varB 2) 0)))))
1647
+ (TAnd
1648
+ (TAll 1 TTop (TSel (varB 1) 0))
1649
+ (TMem 0 TBot TTop)))))
1650
+ ])
1651
+ (TBind (TAnd
1652
+ (TAll 2 TTop (TAnd (TSel (varB 1) 0) (TBind (TMem 0 TBot TBot))))
1653
+ (TAnd
1654
+ (TAll 1 (TMem 0 TBot TTop)
1655
+ (TAll 0 (TSel (varB 0) 0)
1656
+ (TAll 0 (TAnd (TSel (varB 2) 0) (TBind (TMem 0 TBot (TSel (varB 2) 0))))
1657
+ (TAnd (TSel (varB 3) 0) (TBind (TMem 0 TBot (TSel (varB 3) 0)))))))
1658
+ (TMem 0
1659
+ TBot
1660
+ (TBind (TAnd
1661
+ (TAll 2 TTop (TAnd (TSel (varB 2) 0) (TBind (TMem 0 TBot (TSel (varB 2) 0)))))
1662
+ (TAnd
1663
+ (TAll 1 TTop (TSel (varB 1) 0))
1664
+ (TMem 0 TBot TTop)))))))).
1665
+ Proof .
1666
+ apply t_sub with (T1:=
1667
+ (TBind (TAnd
1668
+ (TAll 2 TTop (TAnd (TSel (varB 1) 0) (TBind (TMem 0 TBot TBot))))
1669
+ (TAnd
1670
+ (TAll 1 (TMem 0 TBot TTop)
1671
+ (TAll 0 (TSel (varB 0) 0)
1672
+ (TAll 0 (TAnd (TSel (varB 2) 0) (TBind (TMem 0 TBot (TSel (varB 2) 0))))
1673
+ (TAnd (TSel (varB 3) 0) (TBind (TMem 0 TBot (TSel (varB 3) 0)))))))
1674
+ (TMem 0
1675
+ (TBind (TAnd
1676
+ (TAll 2 TTop (TAnd (TSel (varB 2) 0) (TBind (TMem 0 TBot (TSel (varB 2) 0)))))
1677
+ (TAnd
1678
+ (TAll 1 TTop (TSel (varB 1) 0))
1679
+ (TMem 0 TBot TTop))))
1680
+ (TBind (TAnd
1681
+ (TAll 2 TTop (TAnd (TSel (varB 2) 0) (TBind (TMem 0 TBot (TSel (varB 2) 0)))))
1682
+ (TAnd
1683
+ (TAll 1 TTop (TSel (varB 1) 0))
1684
+ (TMem 0 TBot TTop))))))))).
1685
+ eapply t_obj.
1686
+ eauto. compute. reflexivity.
1687
+
1688
+ eapply dt_fun with (T1:=TTop) (T2:=(TAnd (TSel (varB 1) 0) (TBind (TMem 0 TBot TBot)))).
1689
+ apply t_let with (Tx:=(TBind (TAnd (TAll 2 TTop TBot) (TAnd (TAll 1 TTop TBot) (TMem 0 TBot TBot))))).
1690
+ eapply t_obj.
1691
+ eauto. compute. reflexivity.
1692
+ eapply dt_fun with (T1:=TTop) (T2:=TBot).
1693
+ simpl. unfold open at 3. simpl. eapply t_app.
1694
+ eapply t_sub. eapply t_var. compute. reflexivity. crush_wf.
1695
+ apply stp_and11. crush_wf. crush_wf. crush2. crush2.
1696
+ eapply dt_fun with (T1:=TTop) (T2:=TBot).
1697
+ simpl. unfold open at 3. simpl. eapply t_app.
1698
+ eapply t_sub. eapply t_var. compute. reflexivity. crush_wf.
1699
+ apply stp_and12. apply stp_and11. crush_wf. crush_wf. crush2. crush2. crush2.
1700
+ eapply dt_mem. eapply dt_nil. eauto. simpl. reflexivity. eauto. eauto.
1701
+ simpl. reflexivity. eauto. eauto. simpl. reflexivity.
1702
+ crush_wf. crush_wf. eauto.
1703
+ simpl. unfold open at 2. simpl.
1704
+ eapply t_sub. eapply t_var. compute. eauto. crush_wf.
1705
+ eapply stp_and2. eapply stp_sel2. compute. reflexivity. crush2.
1706
+ eapply stp_and12. eapply stp_and12.
1707
+ eapply stp_mem. eapply stp_bindx. eauto. crush_cl. crush_cl.
1708
+ unfold open. simpl. crush_wf. unfold open. simpl.
1709
+
1710
+ apply stp_and2. eapply stp_and11. eapply stp_all. crush_wf. eauto. crush_cl. crush_cl.
1711
+ unfold open. simpl. crush_wf. unfold open. simpl. eapply stp_bot. crush_wf. crush_wf.
1712
+ eapply stp_and12. eapply stp_and2. eapply stp_and11. eapply stp_all. crush_wf. eauto.
1713
+ crush_cl. crush_cl. unfold open. simpl. crush_wf. unfold open. simpl. eapply stp_bot.
1714
+ crush_wf. crush_wf. eapply stp_and12. eapply stp_mem. crush_wf. crush2. crush_wf.
1715
+ crush_wf. eapply stp_top. crush_wf. crush_wf. crush_wf.
1716
+
1717
+ crush_wf.
1718
+
1719
+ eapply stp_bindx. eauto. crush2. crush2. crush_wf.
1720
+ unfold open. simpl. eapply stp_and12. eapply stp_and12. crush_wf. crush_wf. crush_wf.
1721
+ unfold open. simpl. crush_wf.
1722
+
1723
+ eapply dt_fun with (T1:=(TMem 0 TBot TTop))
1724
+ (T2:=(TAll 0 (TSel (varB 0) 0)
1725
+ (TAll 0 (TAnd (TSel (varB 2) 0) (TBind (TMem 0 TBot (TSel (varB 2) 0))))
1726
+ (TAnd (TSel (varB 3) 0) (TBind (TMem 0 TBot (TSel (varB 3) 0))))))).
1727
+ apply t_let with (Tx:=(TBind
1728
+ (TAll 0 (TSel (varF 1) 0)
1729
+ (TAll 0 (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0))))
1730
+ (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0)))))))).
1731
+ eapply t_obj.
1732
+ eauto. compute. reflexivity.
1733
+ eapply dt_fun with (T1:=(TSel (varF 1) 0))
1734
+ (T2:=(TAll 0 (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0))))
1735
+ (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0)))))).
1736
+ apply t_let with (Tx:=(TBind (TAll 0 (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0))))
1737
+ (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0))))))).
1738
+ eapply t_obj.
1739
+ eauto. compute. reflexivity.
1740
+ eapply dt_fun with (T1:=(TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0)))))
1741
+ (T2:=(TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0))))).
1742
+ apply t_let with (Tx:=(TBind (TAnd
1743
+ (TAll 2 TTop (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0)))))
1744
+ (TAnd (TAll 1 TTop (TSel (varF 1) 0)) (TMem 0 (TSel (varF 1) 0) (TSel (varF 1) 0)))))).
1745
+ eapply t_obj.
1746
+ eauto. compute. reflexivity.
1747
+ eapply dt_fun with (T1:=TTop) (T2:=(TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0))))).
1748
+ simpl. unfold open. simpl. crush2.
1749
+ eapply dt_fun with (T1:=TTop) (T2:=(TSel (varF 1) 0)).
1750
+ simpl. unfold open. simpl. crush2.
1751
+ eapply dt_mem. eapply dt_nil. eauto. simpl. reflexivity. eauto. eauto.
1752
+ simpl. reflexivity. eauto. eauto. simpl. reflexivity. crush_wf. crush_wf. eauto.
1753
+ simpl. unfold open. simpl.
1754
+ eapply t_sub.
1755
+ eapply t_var. compute. eauto. crush_wf.
1756
+
1757
+ eapply stp_and2. eapply stp_sel2. compute. reflexivity. crush_cl.
1758
+ eapply stp_and12. eapply stp_and12. eapply stp_mem. eapply stp_bindx.
1759
+ eauto. crush2. crush2.
1760
+ unfold open. simpl. crush_wf.
1761
+ unfold open. simpl.
1762
+ eapply stp_and2. eapply stp_and11.
1763
+ eapply stp_all. crush_wf. eauto. crush2. crush2.
1764
+ unfold open. simpl. crush_wf. unfold open. simpl.
1765
+ eapply stp_and2. eapply stp_and11. crush_wf. crush_wf. eapply stp_and12.
1766
+ eapply stp_bindx. eauto. crush_cl. crush_cl. crush_wf. unfold open. simpl.
1767
+ eapply stp_mem. crush_wf. unfold open. simpl.
1768
+ eapply stp_sela2. compute. reflexivity. crush_cl.
1769
+ eapply stp_and12. eapply stp_and12. crush2. crush_wf. crush_wf. crush_wf. crush_wf.
1770
+ crush_wf.
1771
+ eapply stp_and12. eapply stp_and2. eapply stp_and11. eapply stp_all. crush_wf. eauto.
1772
+ crush_cl. crush_cl. unfold open. simpl. crush_wf. unfold open. simpl.
1773
+ eapply stp_sela2. compute. reflexivity. crush_cl.
1774
+ eapply stp_and12. eapply stp_and12. crush2. crush_wf. crush_wf. crush_wf. crush_wf.
1775
+ eapply stp_and12. crush2. crush_wf. crush_wf. eapply stp_top. crush_wf. crush_wf.
1776
+ crush_wf. eapply stp_bindx. eauto. crush_cl. crush_cl. crush_wf. unfold open. simpl.
1777
+ crush_wf. eapply stp_bindx. eauto. crush_cl. crush_cl. unfold open. simpl. crush_wf.
1778
+ unfold open. simpl.
1779
+ eapply stp_and12. eapply stp_and12. crush2. crush_wf. crush_wf. crush_wf.
1780
+
1781
+ eapply dt_nil. eauto. eauto. simpl. reflexivity. crush_wf. crush_wf.
1782
+ eauto.
1783
+ unfold open. simpl.
1784
+ assert (open (varF 4)
1785
+ (TAll 0 (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0))))
1786
+ (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0))))) =
1787
+ (TAll 0 (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0))))
1788
+ (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0)))))) as A. {
1789
+ compute. reflexivity.
1790
+ }
1791
+ rewrite <- A at 3. apply t_var_unpack. apply t_var. compute. reflexivity. crush_wf.
1792
+ crush_wf. unfold open. simpl. crush_wf.
1793
+ eapply dt_nil. eauto. eauto. simpl. reflexivity. crush_wf. crush_wf. crush2.
1794
+
1795
+ unfold open. simpl.
1796
+ assert (open (varF 2) (TAll 0 (TSel (varF 1) 0)
1797
+ (TAll 0
1798
+ (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0))))
1799
+ (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0)))))) =
1800
+ (TAll 0 (TSel (varF 1) 0)
1801
+ (TAll 0
1802
+ (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0))))
1803
+ (TAnd (TSel (varF 0) 0) (TBind (TMem 0 TBot (TSel (varF 1) 0))))))) as B. {
1804
+ compute. reflexivity.
1805
+ }
1806
+ rewrite <- B at 2. apply t_var_unpack. apply t_var. compute. reflexivity. crush_wf.
1807
+ unfold open. simpl. crush_wf. unfold open. simpl. crush_wf.
1808
+
1809
+ eapply dt_mem. eapply dt_nil. eauto. simpl. reflexivity. eauto. eauto. simpl. reflexivity.
1810
+
1811
+ eauto. eauto. simpl. reflexivity.
1812
+ crush_wf. crush_wf.
1813
+
1814
+ eapply stp_bindx. eauto. crush_cl. crush_cl. crush_wf.
1815
+ unfold open. simpl. eapply stp_and2.
1816
+ eapply stp_and11; crush_wf.
1817
+ eapply stp_and12. eapply stp_and2.
1818
+ eapply stp_and11; crush_wf. eapply stp_and12.
1819
+ eapply stp_mem. eapply stp_bot. crush_wf. crush_wf. crush_wf.
1820
+ crush_wf.
1821
+
1822
+ Qed .
1823
+
1633
1824
1634
1825
(* ############################################################ *)
1635
1826
(* Proofs *)
0 commit comments