Isabelle 如何找到数据类型的构造函数?

Isabelle 如何找到数据类型的构造函数?,isabelle,Isabelle,我试图通过类比定义以下函数: 但是这些类型没有int或实构造函数。int和real类型被定义为商_类型。我在他们的理论中找不到像构造器的东西 以下定义不起作用: definition int0 :: "int" where "int0 = Abs_Integ (0,0)" fun int_divide :: "int option ⇒ int option ⇒ real option" where "int_divide _ (Some int0) = None" | "int_div

我试图通过类比定义以下函数:

但是这些类型没有int或实构造函数。int和real类型被定义为商_类型。我在他们的理论中找不到像构造器的东西

以下定义不起作用:

definition int0 :: "int" where
  "int0 = Abs_Integ (0,0)"

fun int_divide :: "int option ⇒ int option ⇒ real option" where
  "int_divide _ (Some int0) = None"
| "int_divide (Some a) (Some b) = Some (a / b)"
| "int_divide _ _ = None"

如何找到类型的所有构造函数?或者至少对于商_类型?或者如何定义所需的构造函数?

并非每种类型都是由免费构造函数生成的。集合的集合和实数不是实数。当然,可以显示同构并将其声明为构造函数,比如在集合“a集合和谓词”a=>bool之间,但这对于定义函数和证明没有用处

可以使用ML块查找已注册构造函数中的类型。例如,下面显示了nat的构造函数

用户定义的构造函数可以使用free_构造函数注册,这在“文档”面板提供的关于codatatype定义的教程中有说明

话虽如此,我认为尝试为各种数字类型定义自由构造函数没有多大意义,因为您还必须证明引理,关于数字上的所有操作对这些新构造函数的行为w.r.t。这是一个很大的工作。比如说,仅仅使用条件句而不是模式匹配可能更容易

fun int_divide :: "int option ⇒ int option ⇒ real option" where
  "int_divide (Some a) (Some b) = (if b = 0 then None else Some (a / b))"
| "int_divide _ _ = None"

另一个建议是通过使用选项monad和函数option.bind进行排序来避免参数中的所有选项。

并非所有类型都是由自由构造函数生成的。集合的集合和实数不是实数。当然,可以显示同构并将其声明为构造函数,比如在集合“a集合和谓词”a=>bool之间,但这对于定义函数和证明没有用处

可以使用ML块查找已注册构造函数中的类型。例如,下面显示了nat的构造函数

用户定义的构造函数可以使用free_构造函数注册,这在“文档”面板提供的关于codatatype定义的教程中有说明

话虽如此,我认为尝试为各种数字类型定义自由构造函数没有多大意义,因为您还必须证明引理,关于数字上的所有操作对这些新构造函数的行为w.r.t。这是一个很大的工作。比如说,仅仅使用条件句而不是模式匹配可能更容易

fun int_divide :: "int option ⇒ int option ⇒ real option" where
  "int_divide (Some a) (Some b) = (if b = 0 then None else Some (a / b))"
| "int_divide _ _ = None"

另一个建议是通过使用选项monad和函数option.bind进行排序来避免参数中的所有选项。

除了Andreas的答案之外,Isabelle/HOL中的类型定义总是模化一些基础基类型。例如,整数被定义为自然数对的商

最初,在此类类型上定义函数的典型方法是直接通过类型定义中获得的态射,它在基础基类型和新类型之间转换,通常类似于Abs_mytype和Rep_mytype,或者通过lift_定义,它允许您直接将功能从基本类型提升到新类型


但是,对于int和real等库类型,这是不可取的。你不应该窥视这些类型的内部表示,而应该抽象地使用它们,就像你在“普通”笔和纸数学中一样。

除了Andreas的答案之外,Isabelle/HOL中的类型定义总是模化一些基本类型。例如,整数被定义为自然数对的商

最初,在此类类型上定义函数的典型方法是直接通过类型定义中获得的态射,它在基础基类型和新类型之间转换,通常类似于Abs_mytype和Rep_mytype,或者通过lift_定义,它允许您直接将功能从基本类型提升到新类型

但是,对于int和real等库类型,这是不可取的。你不应该窥视这些类型的内部表示,而应该抽象地使用它们,就像你在“普通”纸笔数学中一样

fun int_divide :: "int option ⇒ int option ⇒ real option" where
  "int_divide (Some a) (Some b) = (if b = 0 then None else Some (a / b))"
| "int_divide _ _ = None"