我已经证明了等价and_distributes_over_or
:
Theorem and_distributes_over_or : forall P Q R : Prop,
P /\ (Q \/ R) <-> (P /\ Q) \/ (P /\ R).
在其他地方,我的目标是
exists x0 : A, f x0 = y /\ (x = x0 \/ In x0 xs)
(对于上下文I&#39; m Logical Foundations;我在the In_map_iff
exercise of the chapter on constructive logic。请不要告诉我练习的解决方案!)
我尝试在目标上使用rewrite and_distributes_over_or
(获取exists x0 : A, (f x0 = y /\ x = x0) \/ (f x0 = y /\ In x0 xs)
)。我收到了一个错误:
Found no subterm matching "?P /\ (?P0 \/ ?P1)" in the current goal.
使用我的人脑,我可以看到目标中那种形式的一个非常明显的子项。为什么Coq,其非人类非大脑,在存在量词下看到它?你有任何提示让这项工作吗?
我已经阅读了a previous question with a similar title to this one,但那是关于重写假设,而不是目标,答案似乎并不适用于我的情况。
答案 0 :(得分:4)
只需使用setoid_rewrite
代替rewrite
,并确保Require Setoid.
(尽管在这种情况下加载List
已经这样做了。)
Coq正在寻找的模式是在一个活页夹下面;也就是说,它在函数体中。绑定器并不明显,因为它是exists
的一部分,但您的目标实际上是ex (fun (x0:A) => f x0 = y /\ (x = x0 \/ In x0 xs))
,而Coq的符号机制很好地打印为exists x0, ...
}。基本的rewrite
策略不能重写函数内部,但setoid_rewrite
可以。
除此之外:请注意,定义ex
及其符号exists x, ...
并非内置于Coq,而是在标准库中定义!您可以使用Locate exists
(查找表示法)和Print ex
(查看定义)来检查这些类型的事物。如果您不确定正在使用哪些符号,那么还有Unset Printing Notations.
,但请记住,您可能认为有许多符号是理所当然的,例如/\
,{ {1}},甚至是=
。