Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types Coq中平等型证据的案例分析_Types_Equality_Coq_Coq Tactic - Fatal编程技术网

Types Coq中平等型证据的案例分析

Types Coq中平等型证据的案例分析,types,equality,coq,coq-tactic,Types,Equality,Coq,Coq Tactic,我对Coq中的归纳定义关系eq有一个疑问。在Coq中考虑下面的 EQ的定义: Inductive eq (A : Type) (x : A) : A -> Prop := eq_refl : x = x 这是一种归纳定义的关系,就像le(错误是由于析构函数的工作方式造成的,回想一下,该策略试图构建匹配语句,为了实现这一点,它采用了一些启发式方法,将相关假设带入上下文 特别是,在这种情况下,它试图对变量m进行抽象,该变量是y:m=m中归纳的eq的索引;但是y未纳入上下文,因此错误为m!=

我对Coq中的归纳定义关系
eq
有一个疑问。在Coq中考虑下面的<代码> EQ的定义:

Inductive eq (A : Type) (x : A) : A -> Prop :=  eq_refl : x = x

这是一种归纳定义的关系,就像
le
错误是由于
析构函数的工作方式造成的,回想一下,该策略试图构建匹配语句,为了实现这一点,它采用了一些启发式方法,将相关假设带入上下文

特别是,在这种情况下,它试图对变量
m
进行抽象,该变量是
y:m=m
中归纳的
eq
的索引;但是
y
未纳入上下文,因此错误为
m!=m0
[其中
m0
是抽象的
m
]。您可以通过执行“不太聪明”的匹配来解决该问题,该匹配不会修改
m

refine (match x with | @eq_refl _ _ => _ end).
但通常,最好的解决方案是将有缺陷的假设纳入范围:

revert y; destruct x.
另一方面,要证明你的目标,正如其他优秀答案所指出的那样,简单的模式匹配是不够的。我更喜欢使用库来解决像你这样的目标:

From mathcomp Require Import all_ssreflect.

Lemma true_num (m : nat) (x y : m = m) : x = y.
Proof. exact: eq_irrelevance. Qed.
在这种情况下,
nat
类型的正确侧面条件由库的机制自动推断

m=m的唯一证明应该是@eq\u refl nat m,因为eq\u refl是唯一的构造函数

不。你的定理恰好是正确的,因为你正在谈论的是
nat
的相等性,但是如果你用
Type
替换
nat
,你的推理也同样(或很差),而用
Type
替换
nat
会使定理无法证明

问题是,等式类型的族是通过自反证明自由生成的。因此,由于Coq中的所有内容都以正确的方式尊重等式(这是我有点模糊的一点),因此要证明族中所有等式证明的属性(即对于某些固定的
x
和所有
y
x=y
的所有证明),它足以证明生成器的属性,即反身证明。然而,一旦你确定了两个端点,可以说,你就不再具有此属性。换句话说,
eq
的归纳原理实际上是
{y | x=y}的归纳原理
,不适用于
x=y
。类似地,向量的归纳原则(长度索引列表)实际上是
{n&Vector.tan}
的归纳原则

要解码错误消息,可以尝试手动应用
eq
的归纳原则。归纳原则说明:给定类型
a
、术语
x:a
、属性
p:forall y:a,x=y->Prop
,以证明任何给定
y:a
和任何证据
e的
py
:x=y
,它足以证明P x eq\u refl
。(看为什么这是有意义的,考虑一个不相关的版本:给定一个类型<代码>一个<代码> x:a <代码>,一个属性<代码> p:A- > PROP<代码>,对于任何<代码>:A/<代码>和任何证明>代码> E:x= y,证明<代码> p y < /代码>,足以证明<代码> p x< /代码>)

如果您尝试手动应用此方法,您将发现,当您尝试导入第二个等式证明时,无法构造类型良好的函数
p


这里有一篇很好的博文更深入地解释了这一点:

是相关的。@AntonTrunov这似乎是真正的问题。阅读讨论我可以看到目标是可证明的。然而,我想知道为什么仅仅在Coq中进行案例分析就很难证明这样的事情。这只有一个构造函数确实,你的引理是中定义的
UIP_nat
的一个特例。UIP适用于具有可判定等式的类型。为了更好地理解这里发生的事情,我建议阅读CPDT书的章节(
lemma3
似乎是最相关的)。这解决了x上的案例分析。但是,最终我希望也对y进行案例分析。因此,在y上的第二次析构函数中,它再次失败,出现以下错误:错误:无法实例化类型为“forall a:nat,m=a->Prop”的元变量P,抽象为“fun(m:nat)(y:m=m)=>eq\u refl=y”的不兼容类型“forall m:nat,m=m->Prop”。在哪里可以获得有关析构函数(其实现)工作的更多详细信息?在Coq中是否有其他更有效的策略来对此类证据进行案例分析?最常见的是
重写
策略。这是一个令人费解的问题;问题同构于问为什么Axiom K独立于Coq,后者与
匹配的实现有关,而与实现无关在
自毁
重写
的。
From mathcomp Require Import all_ssreflect.

Lemma true_num (m : nat) (x y : m = m) : x = y.
Proof. exact: eq_irrelevance. Qed.