我想证明以下术语:
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 = true
到false = true
的假设A来重写我的目标?
答案 0 :(得分:1)
回答你的直接问题:
如何简化从
(false && true)%bool = true
到false = 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个可能的参数变体,因为andb
在short-circuit style中定义。
有关更多详细信息,请参阅this question。因此,在问题中使用了这种策略,我会将证据写成如下:
intros x y A.
destruct x.
- reflexivity. (* x = true *)
- simpl in A. rewrite A. reflexivity. (* x = false *)