重写目标中存在的等价

时间:2018-05-09 12:37:40

标签: coq dependent-type theorem-proving

我已经证明了等价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,但那是关于重写假设,而不是目标,答案似乎并不适用于我的情况。

1 个答案:

答案 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}},甚至是=