1653 \lefteqn{@{text "supp (Abs_lst (bv pat) trm) \<sharp>* \<pi> \<Longrightarrow>"}} \nonumber \\ |
1653 \lefteqn{@{text "supp (Abs_lst (bv pat) trm) \<sharp>* \<pi> \<Longrightarrow>"}} \nonumber \\ |
1654 & & @{text "ACons pat trm al = ACons (\<pi> \<bullet>bv pat) (\<pi> \<bullet> trm) al"} \nonumber |
1654 & & @{text "ACons pat trm al = ACons (\<pi> \<bullet>bv pat) (\<pi> \<bullet> trm) al"} \nonumber |
1655 \end{eqnarray} |
1655 \end{eqnarray} |
1656 |
1656 |
1657 With the Property~\ref{avoiding} we can prove a strong induction principle |
1657 With the Property~\ref{avoiding} we can prove a strong induction principle |
1658 which we show again only for the Core Haskell example: |
1658 which we show again only for the interesting constructors in the Core Haskell |
1659 |
1659 example. We first show the weak induction principle for comparison: |
1660 |
1660 |
|
1661 \begin{equation}\nonumber |
|
1662 \infer |
|
1663 { |
|
1664 @{text "P1 tkind \<and> P2 ckind \<and> \<dots> \<and> P12 cvars"} |
|
1665 }{ |
|
1666 \begin{tabular}{cp{7cm}} |
|
1667 @{text "P1 KStar"}\\ |
|
1668 @{text "\<And>tk1 tk2. \<lbrakk>P1 tk1; P1 tk2\<rbrakk> \<Longrightarrow> P1 (KFun tk1 tk2)"}\\ |
|
1669 @{text "\<dots>"}\\ |
|
1670 @{text "\<And>v ty t1 t2. \<lbrakk>P3 ty; P7 t1; P7 t2\<rbrakk> \<Longrightarrow> P7 (Let v ty t1 t2)"}\\ |
|
1671 @{text "\<And>p t al. \<lbrakk>P9 p; P7 t; P8 al\<rbrakk> \<Longrightarrow> P8 (ACons p t al)"}\\ |
|
1672 @{text "\<dots>"} |
|
1673 \end{tabular} |
|
1674 } |
|
1675 \end{equation} |
|
1676 |
|
1677 |
|
1678 In comparison, the cases for the same constructors in the derived strong |
|
1679 induction principle are: |
|
1680 |
|
1681 \begin{equation}\nonumber |
|
1682 \infer |
|
1683 { |
|
1684 @{text "P1 a tkind \<and> P2 a ckind \<and> \<dots> \<and> P12 a cvars"} |
|
1685 }{ |
|
1686 \begin{tabular}{cp{7cm}} |
|
1687 @{text "\<And>b. P1 b KStar"}\\ |
|
1688 @{text "\<And>tk1 tk2 b. \<lbrakk>\<And>c. P1 c tk1; \<And>c. P1 c tk2\<rbrakk> \<Longrightarrow> P1 b (KFun tk1 tk2)"}\\ |
|
1689 @{text "\<dots>"}\\ |
|
1690 @{text "\<And>v ty t1 t2 b. \<lbrakk>\<And>c. P3 c ty; \<And>c. P7 c t1; \<And>c. P7 c t2; atom var \<sharp> b\<rbrakk> \<Longrightarrow> P7 b (Let v ty t1 t2)"}\\ |
|
1691 @{text "\<And>p t al b. \<lbrakk>\<And>c. P9 c p; \<And>c. P7 c t; \<And>c. P8 c al; set (bv p) \<sharp>* b\<rbrakk> \<Longrightarrow> P8 b (ACons p t al)"}\\ |
|
1692 @{text "\<dots>"} |
|
1693 \end{tabular} |
|
1694 } |
|
1695 \end{equation} |
|
1696 |
1661 |
1697 |
1662 *} |
1698 *} |
1663 |
1699 |
1664 text {* |
1700 text {* |
1665 |
1701 |