Theory HOL.Ctr_Sugar
section ‹Wrapping Existing Freely Generated Type's Constructors›
theory Ctr_Sugar
imports HOL
keywords
"print_case_translations" :: diag and
"free_constructors" :: thy_goal
begin
consts
case_guard :: "bool ⇒ 'a ⇒ ('a ⇒ 'b) ⇒ 'b"
case_nil :: "'a ⇒ 'b"
case_cons :: "('a ⇒ 'b) ⇒ ('a ⇒ 'b) ⇒ 'a ⇒ 'b"
case_elem :: "'a ⇒ 'b ⇒ 'a ⇒ 'b"
case_abs :: "('c ⇒ 'b) ⇒ 'b"
declare [[coercion_args case_guard - + -]]
declare [[coercion_args case_cons - -]]
declare [[coercion_args case_abs -]]
declare [[coercion_args case_elem - +]]
ML_file ‹Tools/Ctr_Sugar/case_translation.ML›
lemma iffI_np: "⟦x ⟹ ¬ y; ¬ x ⟹ y⟧ ⟹ ¬ x ⟷ y"
by (erule iffI) (erule contrapos_pn)
lemma iff_contradict:
"¬ P ⟹ P ⟷ Q ⟹ Q ⟹ R"
"¬ Q ⟹ P ⟷ Q ⟹ P ⟹ R"
by blast+
ML_file ‹Tools/Ctr_Sugar/ctr_sugar_util.ML›
ML_file ‹Tools/Ctr_Sugar/ctr_sugar_tactics.ML›
ML_file ‹Tools/Ctr_Sugar/ctr_sugar_code.ML›
ML_file ‹Tools/Ctr_Sugar/ctr_sugar.ML›
text ‹Coinduction method that avoids some boilerplate compared with coinduct.›
ML_file ‹Tools/coinduction.ML›
end