954 \begin{description} |
954 \begin{description} |
955 |
955 |
956 \item[@{text "t."}\hthm{induct} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n, induct t]"}\rm:] ~ \\ |
956 \item[@{text "t."}\hthm{induct} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n, induct t]"}\rm:] ~ \\ |
957 @{thm list.induct[no_vars]} |
957 @{thm list.induct[no_vars]} |
958 |
958 |
959 \item[@{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{induct} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n]"}\rm:] ~ \\ |
|
960 Given $m > 1$ mutually recursive datatypes, this induction rule can be used to |
|
961 prove $m$ properties simultaneously. |
|
962 |
|
963 \item[@{text "t."}\hthm{rel_induct} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n, induct pred]"}\rm:] ~ \\ |
959 \item[@{text "t."}\hthm{rel_induct} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n, induct pred]"}\rm:] ~ \\ |
964 @{thm list.rel_induct[no_vars]} |
960 @{thm list.rel_induct[no_vars]} |
965 |
961 |
966 \item[@{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{rel_induct} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n]"}\rm:] ~ \\ |
962 \item[\begin{tabular}{@ {}l@ {}} |
|
963 @{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{induct} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n]"}\rm: \\ |
|
964 @{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{rel_induct} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n]"}\rm: \\ |
|
965 \end{tabular}] ~ \\ |
967 Given $m > 1$ mutually recursive datatypes, this induction rule can be used to |
966 Given $m > 1$ mutually recursive datatypes, this induction rule can be used to |
968 prove $m$ properties simultaneously. |
967 prove $m$ properties simultaneously. |
969 |
968 |
970 \item[@{text "t."}\hthm{rec} @{text "[simp, code]"}\rm:] ~ \\ |
969 \item[@{text "t."}\hthm{rec} @{text "[simp, code]"}\rm:] ~ \\ |
971 @{thm list.rec(1)[no_vars]} \\ |
970 @{thm list.rec(1)[no_vars]} \\ |
1772 @{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{rel_coinduct} @{text "[case_names t\<^sub>1 \<dots> t\<^sub>m,"} \\ |
1771 @{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{rel_coinduct} @{text "[case_names t\<^sub>1 \<dots> t\<^sub>m,"} \\ |
1773 \phantom{@{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{rel_coinduct} @{text "["}}@{text "case_conclusion D\<^sub>1 \<dots> D\<^sub>n]"}\rm: \\ |
1772 \phantom{@{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{rel_coinduct} @{text "["}}@{text "case_conclusion D\<^sub>1 \<dots> D\<^sub>n]"}\rm: \\ |
1774 \end{tabular}] ~ \\ |
1773 \end{tabular}] ~ \\ |
1775 Given $m > 1$ mutually corecursive codatatypes, these coinduction rules can be |
1774 Given $m > 1$ mutually corecursive codatatypes, these coinduction rules can be |
1776 used to prove $m$ properties simultaneously. |
1775 used to prove $m$ properties simultaneously. |
|
1776 |
|
1777 \item[\begin{tabular}{@ {}l@ {}} |
|
1778 @{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{set_induct} @{text "[case_names C\<^sub>1 \<dots> C\<^sub>n,"} \\ |
|
1779 \phantom{@{text "t\<^sub>1_\<dots>_t\<^sub>m."}\hthm{set_induct} @{text "["}}@{text "induct set: set\<^sub>j_t\<^sub>1, \<dots>, induct set: set\<^sub>j_t\<^sub>m]"}\rm: \\ |
|
1780 \end{tabular}] ~ \\ |
|
1781 @{thm llist.set_induct[no_vars]} \\ |
|
1782 If $m = 1$, the attribute @{text "[consumes 1]"} is generated as well. |
1777 |
1783 |
1778 \item[@{text "t."}\hthm{corec}\rm:] ~ \\ |
1784 \item[@{text "t."}\hthm{corec}\rm:] ~ \\ |
1779 @{thm llist.corec(1)[no_vars]} \\ |
1785 @{thm llist.corec(1)[no_vars]} \\ |
1780 @{thm llist.corec(2)[no_vars]} |
1786 @{thm llist.corec(2)[no_vars]} |
1781 |
1787 |