类型类实例化中的现有常量(例如,构造函数)

约阿希姆·布雷特纳

考虑这个伊莎贝尔代码

theory Scratch imports Main begin

datatype Expr = Const nat | Plus Expr Expr

实例化plus类型类以获得Plus构造函数的漂亮语法是很合理

instantiation Expr :: plus
begin
  definition "plus_Exp = Plus"
instance..
end

但是现在,+Plus仍然是单独的常量。特别是,我不能(轻松地)+在函数定义中使用,例如

fun swap where
   "swap (Const n) = Const n"
 | "swap (e1 + e2) = e2 + e1"

将打印

Malformed definition:
Non-constructor pattern not allowed in sequential mode.
⋀e1 e2. swap (e1 + e2) = e2 + e1

我如何用一个现有的常量实例化一个类型类,而不是定义一个新的常量?

安德烈亚斯(Andreas Lochbihler)

Isabelle中的类型类实例化总是为类型类的参数引入新的常量。因此,您不能说plus(写为infix +)应与相同Plus但是,您可以采取另一种方法,即首先实例化类型类,然后才将其声明为数据类型的构造函数。

可以在Extended_Nat理论中找到一种这样的情况,其中类型enat是通过a手动构造的typedef,然后实例化了无限类型类,最后enat使用的两个构造函数将其声明为数据类型old_rep_datatype但是,这是没有类型变量的非递归数据类型的非常简单的情况。对于您的表达式示例,我建议您执行以下操作:

  1. 定义一个类expr_auxdatatype expr_aux = Const_aux nat | Plus_aux expr_aux expr_aux

  2. 定义一个expr类型副本expr_auxtypedef expr = "UNIV :: expr_aux set"setup_lifting type_definition_expr

  3. 使用提升包将构造函数提升Const_auxexprlift_definition Const :: "nat => expr" is Const_aux .

  4. 实例化类型类plus

instantiation expr :: plus begin
lift_definition plus_expr :: "expr => expr => expr" is Plus_aux .
instance ..
end
  1. exprold_rep_datatype expr Const "plus :: expr => _"和适当的证明(使用transfer注册为数据类型

  2. 定义一个 abbreviation Plus :: "expr => expr => expr" where "Plus == plus"

显然,这很繁琐。如果你只是想使用的功能模式匹配,可以使用free_constructor命令来注册构造函数Constplus :: expr => expr => expr作为新的构造函数expr实例化后。如果您随后添加“加=加”作为简化规则,则这应几乎与乏味的方法一样好。但是,我不知道各种程序包(特别是语法)在处理构造函数的这种重新注册方面效果如何。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C ++中的模板实例化中将带有构造函数的类用作类型参数

使用构造函数类制作现有类实例的副本

如何通过类类型委托构造函数的实例化?

如何在PHP中实例化具有参数化构造函数的.NET类?

Java:实例化没有默认构造函数的通用类

使用私有构造函数来防止类的实例化?

Android视图模型类没有零参数构造函数,片段中的实例化异常

显式实例化的类模板中的自动构造函数

访问在MainWindow()构造函数中实例化的类

Matlab类在构造函数中具有实例名称的知识

在静态方法中实例化非静态类(上下文),构造函数以对象类型为参数

为什么不能在一个朋友类中实例化其构造函数是私有的类?

JsonMappingException:找不到适合类型[简单类型,类]的构造函数:无法从JSON对象实例化

类中构造函数的类型

C++ - 如何从具有常量大小的算术类型数组创建类构造函数?

复制构造函数的类实例化

从类构造函数实例化对象的集合

在运行时使用默认构造函数实例化类型参数化的类

C ++实例化对象,该对象在另一个没有指针的类构造函数中没有默认构造函数

实现派生类构造函数时出错:“没有重载函数的实例与指定类型匹配

Google Mock:模拟私有变量成员,该成员在目标类的构造函数中实例化

无法从 JSON 字符串实例化 [简单类型,类 org.joda.time.LocalDateTime] 类型的值;没有单字符串构造函数/工厂方法

在字段中实例化与在构造函数中实例化之间有什么区别?

如何指定类构造函数的返回类型(例如使用代理)?

如何使用不同的构造函数Haskell实例化类型的Eq(或任何类)

您可以使用无类型对象实例化Java类构造函数吗?

为什么在实例化类时使用不同的类型和构造函数?

C#根据参数类型实例化基础构造函数的派生类

类构造函数 - 没有构造函数的实例