为什么coq互感类型必须具有相同的参数?

2024-04-07

下列的亚瑟的建议 https://stackoverflow.com/a/17304209/403875,我改变了我的Fixpoint相互关系Inductive这种关系“建立”游戏之间的不同比较,而不是“深入研究”。

但现在我收到一条全新的错误消息:

Error: Parameters should be syntactically the same for each inductive type.

我认为错误消息表明我需要为所有这些互感定义提供相同的精确参数。

我意识到有一些简单的技巧可以解决这个问题(未使用的虚拟变量、包含所有内容的长函数类型)forall),但我不明白为什么我必须这么做。

有人可以解释这种对互感类型的限制背后的逻辑吗?有没有更优雅的方式来写这个?此限制是否还意味着彼此之间的归纳调用必须全部使用相同的参数(在这种情况下,我不知道有任何黑客可以节省大量的代码重复)?

(所有类型和术语的定义,例如compare_quest、game、g1side等,与我的定义相同第一个问题 https://stackoverflow.com/q/17297165/403875.

Inductive gameCompare (c : compare_quest) : game -> game -> Prop :=
 | igc : forall g1 g2 : game,
    innerGCompare (nextCompare c) (compareCombiner c) (g1side c) (g2side c) g1 g2 ->
    gameCompare c g1 g2
with innerGCompare (next_c : compare_quest) (cbn : combiner) (g1s g2s : side)
    : game -> game -> Prop :=
 | compBoth : forall g1 g2 : game,
    cbn (listGameCompare next_c cbn (g1s g1) g2)
        (gameListCompare next_c cbn g1 (g2s g2)) ->
    innerGCompare next_c cbn g1s g2s g1 g2
with listGameCompare (c : compare_quest) (cbn : combiner) : gamelist -> game -> Prop :=
 | emptylgCompare : cbn_init cbn -> forall g2 : game, listGameCompare c cbn emptylist g2
 | otlgCompare : forall (g1_cdr : gamelist) (g1_car g2 : game),
    (cbn (listGameCompare c cbn g1_cdr g2) (gameCompare c g1_car g2)) ->
    listGameCompare c cbn (listCons g1_car g1_cdr) g2
with gameListCompare (c : compare_quest) (cbn : combiner) : game -> gamelist -> Prop :=
 | emptyglCompare : cbn_init cbn -> forall g1 : game, gameListCompare c cbn g1 emptylist
 | otglCompare : forall (g1 g2_car : game) (g2_cdr : gamelist),
    (cbn (gameListCompare c cbn g1 g2_cdr) (gameCompare c g1 g2_car)) ->
    gameListCompare c cbn g1 (listCons g2_car g2_cdr).

在 CGT 中,通常有两名玩家(名为Left and Right)轮流玩游戏,最后一步的玩家获胜。每个游戏(意味着游戏中的每个位置)都可以被解读为一组Left的选项和一组Right的选项写为{G_L | G_R}。在比较两个游戏时,他们可以通过四种不同方式中的任何一种进行比较:<, >, =, or ||.

一个游戏是A < B if B严格优于A for Left,无论谁先走。A > B if AB for Left. A = B如果两个游戏是等价的(从某种意义上说,游戏的总和A + -B是零游戏,所以先走的玩家就输了)。和,A || B如果哪个游戏更适合Left取决于谁先走。

检查两个游戏之间的比较的一种方法如下:

  • A <= B如果全部A's Left孩子们是<| B and A <| all of B是对的孩子们。

  • A <| B if A有一个右孩子是<= B or if A <= any of B留下了孩子。

  • 并且,类似地对于>= and >|.

那么,然后看看哪一对这些关系适用于两个游戏A and B,可以判断是否A < B (A<=B and A<|B), A=B (A<=B and A>=B), A > B (A>=B and A>|B), or A || B (A<|B and A>|B).

这是关于 CGT 的维基文章 http://en.wikipedia.org/wiki/Combinatorial_game_theory.


这个限制很有趣,我以前从来没有遇到过。我看不出有任何理由应该拒绝这段代码。我最好的选择是,当人们设计 Coq 的基础时,这种限制使一些证明变得更容易,并且由于没有多少人对此感到恼火,所以它就保持了这种状态。不过,我可能完全错了;我确实知道参数和参数(即指向箭头右侧的参数)在某些方面的处理方式略有不同。例如,与参数相比,定义归纳类型时施加的宇宙约束对参数的限制较少。

也许这应该转发到 Coq Club 邮件列表? :)

您不必将所有内容都放在箭头右侧即可使其正常工作。你可以做的一件事就是把除了compare_quest右边的参数。当您使用与在构造函数中定义的类型相同的归纳参数时,您给出的参数不必与标头中给出的参数相同,因此没问题:

Inductive gameCompare (c : compare_quest) : game -> game -> Prop :=
 | igc : forall g1 g2 : game,
    innerGCompare (nextCompare c) (compareCombiner c) (g1side c) (g2side c) g1 g2 ->
    gameCompare c g1 g2

with innerGCompare (c : compare_quest) : combiner -> side -> side ->
    game -> game -> Prop :=
 | compBoth : forall cbn g1s g2s (g1 g2 : game),
    cbn (listGameCompare c cbn (g1s g1) g2)
        (gameListCompare c cbn g1 (g2s g2)) ->
    innerGCompare c cbn g1s g2s g1 g2

with listGameCompare (c : compare_quest) : combiner -> gamelist -> game -> Prop :=
 | emptylgCompare : forall cbn, cbn_init cbn -> forall g2 : game, listGameCompare c cbn emptylist g2
 | otlgCompare : forall cbn (g1_cdr : gamelist) (g1_car g2 : game),
    (cbn (listGameCompare c cbn g1_cdr g2) (gameCompare c g1_car g2)) ->
    listGameCompare c cbn (listCons g1_car g1_cdr) g2

with gameListCompare (c : compare_quest) : combiner -> game -> gamelist -> Prop :=
 | emptyglCompare : forall cbn, cbn_init cbn -> forall g1 : game, gameListCompare c cbn g1 emptylist
 | otglCompare : forall cbn (g1 g2_car : game) (g2_cdr : gamelist),
    (cbn (gameListCompare c cbn g1 g2_cdr) (gameCompare c g1 g2_car)) ->
    gameListCompare c cbn g1 (listCons g2_car g2_cdr).

不幸的是,尝试评估它会产生一个新错误:(

Error: Non strictly positive occurrence of "listGameCompare" in
 "forall (cbn : Prop -> Prop -> Prop) (g1s g2s : game -> gamelist)
    (g1 g2 : game),
  cbn (listGameCompare c cbn (g1s g1) g2) (gameListCompare c cbn g1 (g2s g2)) ->
  innerGCompare c cbn g1s g2s g1 g2".

这个错误在 Coq 中更为常见。它抱怨您正在将定义的类型传递给cbn因为这可能会导致该类型成为left箭头(负面事件),已知这会导致逻辑不一致。

I think你可以通过内联来摆脱这个问题compareCombiner在最后三种类型的构造函数中,这可能需要对代码进行一些重构。再说一次,我很确定一定有更好的方法来定义它,但我不明白你想做什么,所以我的帮助在某种程度上是有限的。

UPDATE:我已经开始撰写一系列有关在 Coq 中形式化某些 CGT 的文章。你可以找到第一个here http://poleiro.info/posts/2013-09-08-an-introduction-to-combinatorial-game-theory.html.

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

为什么coq互感类型必须具有相同的参数? 的相关文章

  • JavaScript 中仅比较日期部分而不比较时间

    下面的代码有什么问题 也许只比较日期而不是时间会更简单 我也不知道如何做到这一点 我进行了搜索 但找不到我的确切问题 顺便说一句 当我在警报中显示两个日期时 它们显示为完全相同 My code window addEvent domread
  • Coq 中的“错误:宇宙不一致”是什么意思?

    我正在努力通过软件基础 http www cis upenn edu bcpierce sf current 目前正在做教堂数字的练习 这是自然数的类型签名 Definition nat forall X Type X gt X gt X
  • 在 C# 中比较两个结构体的值

    我不是在寻找返回 bool 的两个结构的比较 我想知道是否有一种方法可以获取两个结构的哪些字段 相同的结构 但可能不同的值 是不同的 基本上我想要一种更简单的方法来执行以下操作 public class Diff public String
  • Coq 中的 Modus Ponens 和 Modus Tollens

    我想要针对这些简单的推理规则使用 Ltac 策略 在 Modus Ponens 中 如果我有H P gt Qand H1 P Ltac mp H H1将添加Q到上下文为H2 Q 在 Modus Tollens 中 如果我有H P gt Qa
  • 如何获得两个集合的交集,同时不仅通过引用而且还通过它们的相同结构和条目识别相等的集合值/项目?

    我有两个交易两个Set实例 const set1 new Set name a name b lastname bb name c name d const set2 new Set name b name d 集合中的任何对象都将具有多个
  • Coq:添加“强归纳”策略

    对自然数的 强 或 完全 归纳意味着当证明 n 上的归纳步骤时 您可以假设该属性对于任何 k 都成立 Theorem strong induction forall P nat gt Prop forall n nat forall k n
  • JavaScript 中的字谜查找器

    我应该用 JavaScript 编写一个程序来查找所提供的一系列单词中的所有字谜 例如 monk konm nkom bbc cbb dell ledl llde 输出应分为几行 1 monk konm nkom 2 bbc cbb 3 d
  • Coq 中 MSet 的使用示例

    MSets https coq inria fr library Coq MSets MSets html似乎是 OCaml 式有限集的最佳选择 可悲的是 我找不到示例用途 如何定义一个空的MSet或单身人士MSet 我怎样才能结合两个MS
  • 测试“0”、“-0”、“0.0”、“00”时的 PHP 和 Perl 行为

    当 PHP Perl 测试一个值时 我遇到了这个有趣的行为 print 0 Yes No gt No print 00 Yes No gt Yes print 0 0 Yes No gt Yes print 0 Yes No gt Yes
  • 关于 .Equals() 与 == 运算符以及基元与对象比较的混淆

    考虑这段代码 int a 0 short b 0 int c 0 object a1 a object b1 b object c1 c Console WriteLine 1 comparing primitives int vs sho
  • 如何匹配 Coq 中的特定值?

    我正在尝试实现一个函数 该函数可以简单地计算包中某些 nat 的出现次数 只是列表的同义词 这就是我想做的 但它不起作用 Require Import Coq Lists List Import ListNotations Definiti
  • 将目录树表示为递归列表

    我被某项任务困住了 我想要的是一个函数 给定目录路径 它将返回递归列表作为输出 输出的格式应为 myList dir subdir subdir fullFilePath 所以基本上我想将目录树表示为某个列表 我获取了所有文件 获取了每个文
  • Coq案例分析和函数返回子集类型的重写

    我正在做一个关于使用子集类型编写经过认证的函数的简单练习 想法是先写一个前驱函数 pred forall n n nat n gt 0 m nat S m n 1 然后使用这个定义给定一个函数 pred2 forall n n nat n
  • Ruby 比较运算符? == 与 === [重复]

    这个问题在这里已经有答案了 和 有什么区别 什么时候应该使用哪一个 两者都只是在对象上调用的方法 这意味着对象决定哪个意味着什么 然而 Ruby 中有一些关于它们之间差异的约定 通常 比 a b几乎总是为真 如果a b是 阅读此内容的最佳位
  • 我可以将 pandas.dataframe.isin() 与数字容差参数一起使用吗?

    我事先查看了以下帖子 有没有办法将 DataFrame isin 与近似因子或容差值一起使用 或者还有其他方法可以吗 如果列中的值位于一组值列表中 则过滤数据框行 https stackoverflow com questions 1206
  • 为什么在比较时将常量放在变量之前?

    我注意到我们的一些代码中存在以下语法有一段时间了 if NULL var or if 0 var 和类似的事情 有人可以解释一下为什么写这个的人选择这个符号而不是常见的符号var 0 way 这是风格问题 还是以某种方式影响性能 这是一种避
  • 如何确定两个泛型类型值是否相等?

    Update 我很抱歉 我的示例代码包含一个错误 导致很多我不理解的答案 代替 Console WriteLine 3 this Equals go1 Equals go2 我本来想写 Console WriteLine 3 this Eq
  • 为什么较新的依赖类型语言没有采用 SSReflect 的方法?

    我在 Coq 的 SSReflect 扩展中发现了两个约定 它们似乎特别有用 但我还没有看到它们在较新的依赖类型语言 Lean Agda Idris 中得到广泛采用 首先 可能的谓词被表示为布尔返回函数而不是归纳定义的数据类型 默认情况下
  • C 中浮点数的比较

    我有一个double打印为0 000000我试图将其与0 0f 不成功 为什么这里有区别呢 确定双精度数是否为零的最可靠方法是什么 确定它是否足够接近零以将其打印为0 000000精确到小数点后六位 例如 fabs d lt 0 00000
  • 如何使用可用内存有效地比较 1,000 张图像

    这是一个棘手的问题 我的磁盘中存储了大约 1 000 张图像 我想通过成对比较来找到彼此相似的图像 所以我必须做周围1 000 999 2 https stackoverflow com questions 46958633 generat

随机推荐

  • 跳过第一个元素之后的所有其他元素[重复]

    这个问题在这里已经有答案了 我知道如何在 Java 中做到这一点 但我正在学习 Python 不知道如何做到这一点 我需要实现一个函数 该函数返回一个列表 其中包含列表中的所有其他元素 从第一个元素开始 到目前为止 我不确定如何从这里开始
  • 为什么 C++ 中的字符数组接受非 ASCII 字符?

    所以 我希望能够在我的 C 程序中使用中文字符 并且我需要使用某种类型来保存超出 ASCII 范围的此类字符 但是 我尝试运行以下代码 并且它有效 include
  • Perl:查找数组的特定元素是否是单词或句子

    我有一个包含文本文件的数组 那么如何使用 perl 查找仅包含一个单词的数组元素 假设文件内容存储在 lines my words grep S lines Note 别忘了chomp lines 在进行任何进一步处理之前
  • CSS强制浏览器显示滚动条

    我编写了一个 Web 应用程序 发现当我调整页面大小时 浏览器不会随着窗口缩小而显示它自己的滚动条 这会阻止用户访问内容 我已将正文宽度设置为 500px 并将导航栏设置为white space nowrap 如何让浏览器识别出屏幕右侧有内
  • Android 中片段中按钮的按钮侦听器

    我是 Android 新手 正在尝试自学 但我在 Fragments 方面遇到了困难 我正在创建一个简单的应用程序来学习片段 我认为这可能看起来很愚蠢 但我真的无法让它发挥作用 我想做的就是单击 Fragment One 中的按钮 butt
  • 如何从 &Vec 或 Vec<&T> 创建 &T 的迭代器?

    我有一个有两个变体的枚举 它要么包含对Vec of Strings 或者它包含一个Vec的参考文献Strings enum Foo lt a gt Owned a Vec
  • 在 Android 上用 Java 获取 SQLite SUM

    我是 SQLite 和 Java 的新手 我正在尝试即时学习 我有一列包含一些数值 我想获取它的总和并将其显示在文本视图中 我当前的代码是这样的 public Cursor getTotal return sqliteDatabase2 r
  • 如何根据 DataAnnotation 中的另一个属性验证一个属性

    考虑我有这两个属性 public class Test Required ErrorMessage Please Enetr Age public System Int32 Age get set Required ErrorMessage
  • 在大型 PR 堆栈中深度重命名变量

    我有一个包含 100 次提交的 PR 它将作为许多较小的 PR 提交 在 PR 堆栈的底部 我选择了一个现在觉得很奇怪的变量名称 并且希望在每次提交期间更改它 但不想在各处繁琐地解决合并冲突 有没有办法自动执行此操作 使用一些 cli 命令
  • 调整生成的相机流的大小

    我试图让用户捕获图像并使用图像将其添加到屏幕上 然而 由于内存限制 我还需要将此图像的大小调整为大约一半大小 12x 5MP 图像在手机上永远不会很好 我正在正常启动相机任务 它调用 Completed 事件 但是 当我尝试使用 Decod
  • Highcharts - 有关完整图表宽度的问题

    我正在使用 Highcharts 柱形图 我希望它是 100 宽度响应式图表 容器很简单 div 没有任何格式 当文档加载时 图表始终是固定宽度 600x400px 大小 如果我调整窗口大小或切换到另一个浏览器选项卡 图表将填充宽度并变成响
  • 将 >100K 页面链接在一起而不会受到 SEO 惩罚

    我正在创建一个网站 该网站将审查互联网上数十万个其他网站的隐私政策 它的最初内容是基于我的运行普通爬行 http commoncrawl org 50 亿页网络转储和分析所有隐私政策 https stackoverflow com ques
  • 如何使用 Retrofit 和 RxJava/RxAndroid 处理响应错误?

    我无法弄清楚如何使用改造和 RxAndroid 处理响应错误 如果存在网络错误等 则会调用 onError 但我需要能够获取响应以检查是否存在身份验证错误 相反 我得到的是一个带有空字符串的令牌 但我找不到原因 解决这个问题的最佳方法是什么
  • 如何修复滚动

    我在将工具提示定位在表内的数据列上时遇到一些问题 该表本身位于垂直滚动 div 内 为您提供一点背景 由于我无法控制的遗留问题 我正在开发的页面必须通过固定宽度和高度的 iframe 来显示 我需要显示的数据大约有12列 需要全部显示 一列
  • Django - 为什么syncdb不尊重数据库路由器?

    我已经设置了一个数据库路由器 使用以下命令将不同的应用程序和不同的模型定向到不同的数据库db for read and db for write路由器方法 这非常有效 除了 manage py syncdb不尊重这些路由器设置 When I
  • 作为 JS 的相对初学者 我正在努力尝试找到解决方案 我需要找出无序列表的哪一行被单击 ul li Line 1 li li Line 2 li li Line 3 li ul 我真的不想为每一行添加 onclick 事件 我确信一定有办法
  • 在 Android 中将图像添加到画布

    今天是个好日子 我希望您能帮助我理解如何在视图上实现的 OnTouchEvent 上将图像添加到画布中的概念 到目前为止 这就是我想出的 parent是在此自定义视图中实例化并添加到的活动 Override protected void o
  • mongodb 将 $lte 与 $indexOfArray 一起使用

    与模型的集合 stack mean 3 5 如何查询平均值小于 4 38 的堆栈数组索引 db stacks aggregate project index indexOfArray stack mean lte 4 38 我收到此错误 o
  • “@+id”是什么意思?

    我已经阅读了大部分 Android 文档 但还没有找到任何声明来说明 id 值前缀 id 的含义 我知道 string 及其变体的含义 但不知道 的变体 除了给我答案之外 你能告诉我 Android 文档中记录的位置吗 加号仅表示如果 ID
  • 为什么coq互感类型必须具有相同的参数?

    下列的亚瑟的建议 https stackoverflow com a 17304209 403875 我改变了我的Fixpoint相互关系Inductive这种关系 建立 游戏之间的不同比较 而不是 深入研究 但现在我收到一条全新的错误消息