src/Doc/Datatypes/Datatypes.thy
changeset 57701 13b446b62825
parent 57575 b0d31645f47a
child 57892 3d61d6a61cfc
equal deleted inserted replaced
57700:a2c4adb839a9 57701:13b446b62825
   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