Coq 重写目标中存在的等价性

Coq 重写目标中存在的等价性,coq,dependent-type,theorem-proving,Coq,Dependent Type,Theorem Proving,我已经证明了一个等价性,并且将\u分布在\u或: Theorem and_distributes_over_or : forall P Q R : Prop, P /\ (Q \/ R) <-> (P /\ Q) \/ (P /\ R). (对于我正在处理的上下文,我正在进行。不过,请不要告诉我该练习的解决方案!) 我试着用重写并在我的目标上分配fx0=y/\(x=x0\/在x0xs中)),而Coq的记法机制将它很好地打印为存在的x0,。基本的rewrite策略不能在函数内部进

我已经证明了一个等价性
,并且将\u分布在\u或

Theorem and_distributes_over_or : forall P Q R : Prop,
  P /\ (Q \/ R) <-> (P /\ Q) \/ (P /\ R).
(对于我正在处理的上下文,我正在进行。不过,请不要告诉我该练习的解决方案!)

我试着用
重写并在我的目标上分配(得到
存在x0:A,(fx0=y/\x=x0)\/(fx0=y/\In x0-xs)
)。我有一个错误:

Found no subterm matching "?P /\ (?P0 \/ ?P1)" in the current goal.
用我的人脑,我可以看到目标中一个非常明显的亚项。为什么Coq不能用它的非人类非大脑,在存在量词下看到它?你有什么建议可以让这一切顺利进行吗


我读过,但那是关于在假设中重写,而不是在目标中重写,答案似乎不适用于我的情况。

只需使用
setoid\u rewrite
,而不是
rewrite
,并确保
需要setoid。
(尽管在这种情况下加载
列表已经这样做了)

Coq正在寻找的图案位于活页夹下方;也就是说,它在函数体中。活页夹并不明显,因为它是
存在的一部分
,但实际上您的目标是
ex(fun(x0:A)=>fx0=y/\(x=x0\/在x0xs中))
,而Coq的记法机制将它很好地打印为
存在的x0,
。基本的
rewrite
策略不能在函数内部进行重写,但是
setoid\u rewrite
可以


旁白:请注意,定义
ex
及其符号
exists x,…
不是Coq内置的,而是在标准库中定义的!您可以使用
Locate exists
(查找符号)和
Print ex
(查看定义)检查这类内容。还有未设置的打印符号。
如果您不确定使用的是什么符号,请记住,有很多符号您可能认为是理所当然的,比如
/\
=
,甚至是
->

@stephencit's,这是一种用于自动定理证明的编程语言。有很多类似的问题,绝对不是离题的。没有不尊重。如果我们是在开玩笑,那么堆栈溢出和Mathematics SE首先不应该真的是不同的站点。史蒂芬奇已经有超过1000个问题了,即使Coq被认为只是一个正式的证明系统,那么我认为这个问题仍然属于这里,因为它不是真正关于数学或逻辑的。它是关于如何让工具做你想做的事情。在这种情况下,这纯粹是技术上的东西。但是,如果这个问题是关于Coq的基本理论,那么我同意你的看法,因为CS.SE(或CStheory.SE)将是一个更好的地方。有点相关(我把链接放在这里,以便找到链接问题的人可以来这里看这个简明的说明)。非常感谢,
setoid\u rewrite
做了这个把戏,我学到了一些关于
存在的知识!为什么
setoid\u rewrite
可以看到lambdas内部,但
rewrite
不能?
rewrite
处理的关系是否比等价关系弱?实际上,这与关系无关<当不使用相等作为关系时,代码>重写
已经依赖于
setoid_rewrite
。文档()说,出于兼容性的原因,rewrite不在binders之下;使用活页夹可以改变许多现有重写的行为。明白了,这是有道理的。谢谢你的耐心!
Found no subterm matching "?P /\ (?P0 \/ ?P1)" in the current goal.