简化假设

时间:2016-05-16 12:43:10

标签: coq

我想证明以下术语:

Goal forall x y, andb x y = true -> x = true.

相当于

Goal forall x y, ((andb x y) = true) -> (x = true).

因此,我在纸面上的方法是遍历x和y的所有选项,并表明只要左边是真(true = true),右边也是(true = true),将满足暗示的要求。

Proof.
  intros x y A. destruct x.
  - destruct y.
    + reflexivity.
    + reflexivity. (*I am not certain why this works but I assume due to the implication*)
  - destruct y.
   (* here I am lost*)
Qed.

我需要简化假设,因为目前A:(false && true)%bool = true&&的评估会产生false,因此,A:false = true和我可以重写显示false = false的目标,该目标可以通过reflexivity解决。但是使用simpl A.会产生Error: Cannot coerce A to an evaluable reference.,直接rewrite A会产生Error: Found no subterm matching "(false && true)%bool" in the current goal.

如何简化从(false && true)%bool = truefalse = true的假设A来重写我的目标?

1 个答案:

答案 0 :(得分:1)

回答你的直接问题:

  

如何简化从(false && true)%bool = truefalse = true的假设A来重写我的目标?

(1)只需使用simpl in A.simpl之后的中有关键字“)。

(2)另一种变体是

rewrite <- A. (* notice the arrow which shows rewriting direction *)
reflexivity.  (* this will also perform simplification *)

(3)考虑OP中源代码中的第一条评论:

  

自反。 (*我不确定为什么会这样,但我认为由于暗示*)

该行有效,因为true = true(看目标),就像在第一个子目标中一样。你实际上不需要在第二个参数上进行dustructuring(x = true在这种情况下和(非正式地)你已经证明了你的目标),但是你做destruct y.后需要证明true = true两次,因此需要两次使用reflexivity

(4)我还应该注意到,您不必考虑4个可能的参数变体,因为andbshort-circuit style中定义。 有关更多详细信息,请参阅this question。因此,在问题中使用了这种策略,我会将证据写成如下:

intros x y A.
destruct x.
  - reflexivity.                         (* x = true *)
  - simpl in A. rewrite A. reflexivity.  (* x = false *)