尝试像集合和子集一样对待类型类和子类型

2023-12-14

这个问题与我之前的SO问题有关类型类。我问这个问题是为了设置一个有关语言环境的未来问题。我不认为类型类适合我想要做的事情,但是类型类的工作方式让我了解了我想要从语言环境中得到什么。

下面,当我使用大括号表示法时{0,0},它不代表普通的 HOL 大括号,并且0代表空集。

一些文件,如果你想要的话

  • A_i130424a.thy- ASCII 友好的 THY。
  • i130424a.thy- 非 ASCII 友好的 THY。
  • i130424a_DOC.pdf- PDF 显示行号。
  • MFZ_DOC.pdf- 与此相关的主要项目。
  • 此问题的 GitHub 文件夹 and MFZ GitHub folder.

提问前谈话

我在 THY 中描述了我正在做的事情(我将其包含在底部),然后我基本上会问:“我可以在这里做些什么来解决这个问题,以便我可以使用类型类吗?”

正如上面链接的SO问题一样,我试图结合团体.thy semigroup_add。我所做的是创建我的类型的子类型sT using typedef,然后我尝试将一些基本的函数常量和运算符提升为新类型,例如我的联合运算符geU,我的空集emS,我的无序配对集paS,以及我的隶属谓词inP.

这不起作用,因为我试图将新类型视为子集。特别是,我的新类型应该代表集合{ {0,0} },它是平凡半群的一部分,即只有一个元素的半群。

问题是无序对公理指出如果设置x存在,则设置(paS x x)存在,并且联合公理指出,如果设置x存在,则设置(geU x)存在。因此,当我尝试将联合运算符提升为新类型时,证明者神奇地知道我需要证明(geU{0,0} = {0,0}),这不是真的,但只有一个元素{0,0}在我的新类型中,所以它必须是这样的。

Question

我可以解决这个问题吗?在我看来,我将集合和子集与类型和子类型进行比较,我知道它们并不相同。调用我的主要类型sT和我的亚型subT。我需要的是所有已用类型定义的运算符sT,类型如sT => sT, 为类型工作subT when subT被视为类型sT。使用类型定义的新运算符和常量subT,例如类型的函数subT => subT,这会以某种方式解决,就像事情神奇地应该与这些东西一起工作一样。

发表问题谈话

在这里,我通过 THY 中的行号指出发生了什么。行号将显示在 PDF 和 GitHub 网站上。

在第 21 行到第 71 行中,我在四个部分中组合了相关常数、符号和公理。

  1. Type sT, 隶属谓词inP/PIn,以及等式公理(21 至 33)。
  2. 空集emS/SEm和空集公理(37 到 45)。
  3. 无序对常数paS/SPa和无序对公理(49 到 58)。
  4. 联合常数geU/UGe和联合公理(62 至 71)。

从第 75 行开始,我创建了一个新类型typedef然后将其实例化为类型类semigroup_add.

在我尝试提升无序对函数之前没有任何问题{.x,y.},第 108 行,以及我的 union 函数(geU x),第 114 行。

在 Isar 命令下方,我显示了输出,告诉我需要证明某些集合等于{0,0},一个无法证明的事实。

这是 ASCII 友好的源代码,我从上面链接的 THY 中删除了一些注释和行:

theory A_i130424a
imports Complex_Main 
begin  

--"AXIOM (sT type, inP predicate, and the equality axiom)"
typedecl sT ("sT")

consts PIn :: "sT => sT => bool"

notation
  PIn  ("in'_P") and
  PIn  (infix "inP" 51) and
  PIn  (infix "inP" 51)

axiomatization where
  Ax_x: "(! x. x inP r <-> x inP s) <-> (r = s)"
--"[END]"



--"AXIOM (emS and the empty set axiom)"
consts SEm :: "sT" ("emS")

notation (input)
  SEm ("emS")

axiomatization where
  Ax_em [simp]: "(x niP emS)"
--"[END]"



--"AXIOM (paS and the axiom of unordered pairs)"
consts SPa :: "sT => sT => sT"

notation
  SPa ("paS") and
  SPa ("({.(_),(_).})")

axiomatization  where
  Ax_pa [simp]: "(x inP {.r,s.}) <-> (x = r | x = s)"
--"[END]"



--"AXIOM (geU and the axiom of unions)"
consts UGe :: "sT => sT"

notation
  UGe ("geU") and
  UGe ("geU")

axiomatization where
  Ax_un: "x inP geU r = (? u. x inP u & u inP r)"
--"[END]"



--"EXAMPLE (A typedef type cannot be treated as a set of type sT)"
typedef tdLift = "{x::sT. x = {.emS,emS.}}"
  by(simp)

setup_lifting type_definition_tdLift

instantiation tdLift :: semigroup_add
begin
  lift_definition plus_tdLift:: "tdLift => tdLift => tdLift"
    is "% x y. {.emS,emS.}" by(simp)
  instance
  proof
    fix n m q :: tdLift
    show "(n + m) + q = n + (m + q)"
    by(transfer,simp)
  qed
end

theorem
  "((n::tdLift) + m) + q = n + (m + q)"
  by(transfer,simp)

class tdClass =
  fixes emSc :: "'a"                 ("emSk")
  fixes inPc :: "'a => 'a => bool"   (infix "∈k" 51)
  fixes paSc :: "'a => 'a => 'a"     ("({.(_),(_).}k)")
  fixes geUc :: "'a => 'a"           ("⋃k")

instantiation tdLift :: tdClass
begin
  lift_definition inPc_tdLift:: "tdLift => tdLift => bool"
    is "% x y. x inP y" 
    by(simp)
  lift_definition paSc_tdLift:: "tdLift => tdLift => tdLift"
    is "% x y. {.x,y.}"
    --"OUTPUT: 1. (!! (sT1 sT2). ([|(sT1 = emS); (sT2 = emS)|] ==> ({.sT1,sT2.} = emS)))"
    apply(auto)
    --"OUTPUT: 1. ({.emS.} = emS)"
    oops
  lift_definition geUc_tdLift:: "tdLift => tdLift"
    is "% x. geU x"
    --"OUTPUT: 1. (!! sT. ((sT = {.emS,emS.}) ==> ((geU  sT) = {.emS,emS.})))"
    apply(auto)
    --"OUTPUT: 1. ((geU  {.emS,emS.}) = {.emS,emS.})"
    oops  
  lift_definition emSc_tdLift:: "tdLift"
    is "emS" 
    --"OUTPUT: 
       exception THM 1 raised (line 333 of drule.ML):
       RSN: no unifiers
       (?t = ?t) [name HOL.refl]
       ((emS = {.emS,emS.}) ==> (Lifting.invariant (% x. (x = {.emS,emS.})) emS emS))"
    oops
  instance ..
end
--"[END]"


end

我部分回答了我的问题,部分原因是当我问有关 Isar 亚型的问题时参考这个。从表面上看,我在这里的问题和答案与子类型有关。

至于我是否可以解决我描述的类型类的问题,我不知道。

(更新:我使用类型类的可能解决方案将是想法的组合,解决方案的一部分是类型强制,正如我的 SO 问题的答案中所解释的:什么是 Isabelle/HOL 亚型?哪些 Isar 命令会产生子类型?

如果使用 Groups.thy 中的区域设置适合我,那么这些区域设置的相应类型类可能也可以工作。我可以实例化一个类,例如semigroup_add, use lift_definition定义plus运算符,甚至提升我返回的运算符bool进入类型。无论如何,无法提升到新类型的运算符在新类型的上下文中有些无意义,其中类型强制可以发挥作用,使它们对于集合并集之类的事物有意义。细节决定成败.)

根据我所说的我想要的类型和子类型,我发现我确实得到了一种形式typedef,形式即函数Rep and Abs,我一直在研究它。

如中所述isar-ref.pdf 页码。第242章,

对于 typedef t = A,新引入的类型 t 伴随着一对态射,以将其与旧类型上的表示集相关联。默认情况下,从类型到集合的注入称为 Rep t 及其逆 Abs t...

下面,我用Rep and Abs在一个小例子中证明我可以关联我的主要类型,sT,用我定义的新类型typedef,这是类型tsA.

我不认为类型类是最重要的。我正在探索的主要有两件事,

  1. 我是否可以绑定 Groups.thy 的区域设置,
  2. 更一般地说,这是关于使用类型来限制我的半群、群等的二元运算符的域和共域。

例如,在 Groups.thy 中,有

locale semigroup =
  fixes f :: "'a => 'a => 'a" (infixl "*" 70)
  assumes assoc [ac_simps]: "a * b * c = a * (b * c)"

如果我不使用子类型,我想我必须做这样的事情,其中inP is my \<in>(我只是从语言环境开始):

locale sgA =
  fixes G :: sT
  fixes f :: "sT => sT => sT" (infixl "*" 70)
  assumes closed:
    "(a inP G) & (b inP G) --> (a * b) inP G"
  assumes assoc:
    "(a inP G) & (b inP G) & (c inP G) --> (a * b) * c = a * (b * c)"

部分答案在于能够使用Groups.semigroup可能是使用Rep and Abs;我使用类型运算符tsA => tsA => tsA按类型tsA,但是当元素类型tsA需要被视为类型元素sT,然后我用Rep将它们映射到类型上sT.

我还没有想清楚这一切,也没有进行足够的实验来知道什么最有效,但我给出了这个部分答案,以尝试解释更多我的想法。可能还有其他人可以添加一些好的信息。

子类型方法可能并不都是有利的,如下最后两个所示theorem示例代码中的命令。含义的左侧是必要的,因为我没有利用类型的力量,类似于closed and assoc上面在locale sgA。然而,尽管如此,这对我来说没有问题simp规则,而使用的定理Rep and Abs正在要求metis为了证明,它可能需要大量丑陋的开销才能让事情工作得更顺利。

下面我包含该文件A_iSemigroup_xp.thy。这是 ASCII 版本iSemigroup_xp.thy。这些都需要进口MFZ.thy,这 3 个文件位于此GitHub 文件夹.

theory A_iSemigroup_xp
imports MFZ
begin
--"[END]"

--"EXAMPLE (Possible subtype for a trivial semigroup)"
typedef tsA = "{x::sT. x = emS}"
  by(simp)

theorem "(Rep_tsA x) inP {.Rep_tsA x.}"
  by(metis 
    SSi_exists)

theorem "! x::tsA. x = (Abs_tsA emS)"
  by(metis (lifting, full_types) 
    Abs_tsA_cases 
    mem_Collect_eq)

theorem "! x. x inP {.emS.} --> x = emS"
  by(simp)

theorem "! x. x inP {.z inP {.emS.} ¦ z = emS.} --> x = emS"
  by(simp)
--"[END]"

--"ISAR (Theory end)"
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试像集合和子集一样对待类型类和子类型 的相关文章

  • 模板类中的模板函数 is_same

    为什么这段代码会产生错误的输出 this type cpp include
  • 使用 std::set 时重载运算符<

    这是我第一次使用 std set 容器 并且我对操作符 std less 遇到了问题 我声明该集合 std set
  • 在运行时检查对象类型兼容性

    这是一个非常普遍的问题 但我正在做的具体事情很简单 所以我包含了代码 当我在编译时不知道两个对象的类型时 如何检查两个对象之间的类型兼容性 也就是说 我可以做if object is SomeType when SomeType是编译时已知
  • 防止被 0 除的 Typescript 类型

    我正在使用打字稿创建一个用于培训目的的计算系统 但在除法过程中出现打字错误 您知道如何解决吗 type Variable value number resolve gt number type NoZeroVariable value Om
  • set() 可以在 Python 进程之间共享吗?

    我正在 Python 2 7 中使用多重处理来处理非常大的数据集 当每个进程运行时 它会将整数添加到共享的 mp Manager Queue 中 但前提是其他进程尚未添加相同的整数 由于您无法对队列进行 in 式成员资格测试 因此我这样做的
  • 如何判断Python对象是否是字符串?

    如何检查 Python 对象是否是字符串 常规字符串或 Unicode Python 2 Use isinstance obj basestring 对于要测试的对象obj Docs https docs python org 2 7 li
  • Java中如何对整数除法进行四舍五入并得到int结果? [复制]

    这个问题在这里已经有答案了 我刚刚写了一个小方法来计算手机短信的页数 我没有选择使用Math ceil 老实说 它看起来很丑陋 这是我的代码 public class Main param args the command line arg
  • TypeScript:实现具有调用签名和索引签名的接口

    我想创建一个满足此类型的对象 interface I string x string number 并通过 TypeScript 类型检查 理想情况下 我希望不需要诉诸技巧 例如使用any作为中间步骤 我知道可以将其他字段添加到具有调用签名
  • 将两个 Int 值相除以获得 Float 的正确方法是什么?

    我想分两份IntHaskell 中的值并获得结果Float 我尝试这样做 foo Int gt Int gt Float foo a b fromRational a b 但 GHC 版本 6 12 1 告诉我 无法将预期类型 Intege
  • python中的列表列表的集合

    我有一个列表列表 mat 1 2 3 4 5 6 1 2 3 7 8 9 4 5 6 我想转换成set即删除重复列表并从中创建一个新列表 其中仅包含unique lists 在上述情况下 所需的答案将是 1 2 3 4 5 6 7 8 9
  • 为什么这些类型参数不符合类型细化?

    为什么此 Scala 代码无法进行类型检查 trait T type A trait GenFoo A0 S lt T type A A0 trait Foo S lt T extends GenFoo S A S 我不明白为什么 类型参数
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • SQLite支持android的数据类型有哪些

    谁能告诉我 SQLITE 中支持 ANDROID 的数据类型列表 我想确认 TIME 和 DATE 数据类型 这里有一个list http www sqlite org datatype3 htmlSQLite 的数据类型 支持时间和日期间
  • 如何将类型设置为 vue slot props Typescript

    我正在尝试在插槽道具上设置类型以在表格组件中进行处理 如图所示 我也一直在尝试 body item UserItem 但这只是重命名参数 body
  • 过滤器的 Scala 集合类型

    假设您有一个 List 1 1 其类型为 List Any 这当然是正确的且符合预期 现在如果我像这样映射列表 scala gt List 1 1 map case x Int gt x case y String gt y toInt 结
  • python numpy:更改 numpy 矩阵的列类型

    我有一个 numpy 矩阵 X 我尝试使用以下代码更改第 1 列的数据类型 X 1 astype str print type X 0 1 但我得到了以下结果
  • AngularJS - 设置下拉列表的选定值不起作用

    我在这里复制了我的问题 http jsfiddle net U3pVM 2840 http jsfiddle net U3pVM 2840 正如标题所示 我无法设置使用 ng options 填充的选择的选定值 我已经搜索并尝试了我找到的所
  • 将 C# 数据类型参数传递给用 C++ 编写的 dll?

    仍在解决从这里开始的问题从 C 调用 C dll 函数 结构体 字符串和 wchar t 数组 https stackoverflow com questions 680066 calling c dll function from c o
  • 如何使用 python 有效地找到两个大文件的交集?

    我有两个大文件 它们的内容如下所示 134430513125296589151963957125296589 该文件包含未排序的 id 列表 某些 id 可能会在单个文件中出现多次 现在我想找到路口两个文件的一部分 这就是两个文件中都出现的
  • Swift 结构类型集

    说我有一个struct 可以是任何东西 struct Cube var x Int var y Int var z Int var width Int 然后我该如何创建一个Set这些点中 是否存在两个具有相同属性的对象 let points

随机推荐

  • 是否可以检索iPhone联系人记录的创建时间?

    我想问一个关于 iPhone 的问题 是否可以从每条记录的iPhone联系人中检索创建时间 谢谢 是的 你想要的kABPersonCreationDateProperty 请参阅参考 NSDateFormatter dateFormatte
  • og:image 和 og:url 应该放在 还是 中?

    For og image and og url 因为它们有 URL 我可以将它们放在link标签而不是meta标签 它是更好的吗 另外 使用这两个标签有什么区别 og image and og url 我不知道 OGP 的其他主要消费者 所
  • @QueryParam 正则表达式

    我正在使用 Jersey for Rest 并有一个接受的方法 QueryParam 但是 用户可以发送 QueryParam 像这样 contractName where 是 0 155 之间的数字 如何在 QueryParam 中定义它
  • WIF 配置:issuerNameRegistry 与证书验证

    在 Windows Identity Foundation WIF 4 5 配置中 以下各项之间的关系是什么issuerNameRegistry and certificateValidation 每个人都验证 SAML 2 0 断言的哪一
  • UIImage 到 UIColor 像素颜色数组

    我很抱歉问这个问题 但我不知道如何将 UIImage 表示为每个像素的 UIColor 数组 我已尽最大努力进行转换UIImagePNG JPEGRepresentation但无法得到想要的结果 这是一个 Swiftier 版本 Swift
  • 登录功能还是使用它的功能?

    Is it best 我知道没有灵丹妙药 但使用其中一种可能比另一种有一些优势 登录调用函数或调用它的函数 例子 方法一 module MongoDb let tryGetServer connectionString try let se
  • 将值从活动传递到广播接收器并从广播接收器启动服务

    我有一个活动 它包含一个按钮 其文本会动态更改 我想将此文本传递给接收短信的广播接收器 现在我的广播接收器应该接收文本 并根据文本启动或停止服务 这个怎么做 如果您的 BroadcastReceiver 是在单独的类文件中定义的 那么您可以
  • OpenAPI 和 spring-doc 未找到控制器类中的所有映射

    这有点奇怪 springdoc openapi ui v1 2 32 生成的文档仅包含控制器内的一些映射 Example Operation summary Foo description Foo PostMapping path v1 f
  • React.js - 兄弟组件之间的通信

    我是 React 新手 我想问一个策略问题 关于如何最好地完成必须在同级组件之间通信数据的任务 首先 我将描述一下任务 说我有多个
  • 如果并行任务抛出异常则取消任务

    我有两个共享相同取消令牌的并行任务 客户端要求两个结果列表 例如 class ResponseDTO public IEnumerable
  • 提高接近于零的值的色阶分辨率

    我想让这个图中的小回报更加明显 最合适的功能似乎是scale colour gradient2 但这会冲掉最常发生的小额回报 使用limits有帮助 但我无法弄清楚如何设置 oob 越界 因此它只会有一个 饱和 值而不是灰色 对数变换只是让
  • unixODBC PHP更新语句错误

    我使用 Ubuntu php unixodbc mdbtools 来处理 mdb 文件 每件事 连接 选择 都工作得很好 但插入或更新语句 我的代码是这样的 mdbConnection new PDO odbc mdbdriver user
  • Kendo Grid:与 Angular 一起使用时如何从组合框单元模板中获取所选项目

    我有一个在 Angular 中使用的 Kendo 网格 并且有一个带有组合框的字段 该字段将编辑器设置为以下功能 function comboCellTemplate container options var input
  • 回显所有回文,C 语言

    我喜欢 Brian Kernighan 和 Rob Pike 的书 UNIX 编程环境 中提出的想法 他们重点关注在可以在命令行上组合许多 小型 精确 易于理解的 程序的环境中工作的点来完成许多编程任务 我正在温习严格的 ANSI C 约定
  • 从文件中提取特定行并在 python 中创建数据部分

    尝试编写一个 python 脚本来从文件中提取行 该文件是一个文本文件 是 python suds 输出的转储 我想要 删除除单词和数字之外的所有字符 我不需要任何 n 等字符 找到以 ArrayOf xsd string 开头的部分 从结
  • Windows 服务与简单程序

    在讨论我的问题之前 让我先为大家介绍一下背景 我的公司为许多客户托管网站 我的公司也将一些工作外包给另一家公司 因此 当我们第一次建立一个向客户提供所有信息的网站时 我们将该信息传递给我们签约的另一家公司 并且我们三个人拥有相同的数据 问题
  • 您会向新手推荐哪本 ASP.NET 书籍? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想学习 ASP NET 只是想了解一下该读哪本书 我发现 WROX 的书很有用 虽然封面很蹩脚 开始 ASP NET 3 5 使用 C 和 VB
  • PDO连接测试

    我正在为我的一个应用程序编写安装程序 我希望能够测试一些默认数据库设置 是否可以使用 PDO 来测试有效和无效的数据库连接 我有以下代码 try dbh new pdo mysql host 127 0 0 1 3308 dbname ax
  • 使用 Java New I/O 读取行

    使用 New I O 从文件中读取行的最佳方法是什么 我一次只能获取一个字节 任何想法 或者对于小文件 您可以这样做 List
  • 尝试像集合和子集一样对待类型类和子类型

    这个问题与我之前的SO问题有关类型类 我问这个问题是为了设置一个有关语言环境的未来问题 我不认为类型类适合我想要做的事情 但是类型类的工作方式让我了解了我想要从语言环境中得到什么 下面 当我使用大括号表示法时 0 0 它不代表普通的 HOL