我有以下目标:
f : bool -> bool
b : bool
H1 : f true = true
H2 : f true = false
H3 : f false = false
============================
false = true
现在使用H1和H2,我想用矛盾证明目标。我知道inversion
战术,但我不认为我可以在这里应用它。关于如何从这里开始的任何想法?
这是完全可重现的代码,您可以在其中实现上述目标:
Theorem bool_fn_applied_thrice :
forall (f : bool -> bool) (b : bool),
f (f (f b)) = f b.
Proof.
intros f b.
destruct (f b) eqn:H1.
- destruct (f true) eqn:H2.
+ rewrite -> H2.
reflexivity.
+ destruct (f false) eqn:H3.
* reflexivity.
* destruct b in H1.
{
}
也有兴趣知道是否有一种比上述方法更简单的方法来解决上述定理(只是提示。另一种接近方式是在b
上使用destruct,这实际证明了以后的定理5.破坏的用法)。
答案 0 :(得分:1)
有很多方法可以继续,因为这是一个可以用作家庭作业的软件基础练习,我不会给出完整的答案。
确实H1和H2相互矛盾。
我希望你现在知道的方法是使用重写。例如,rewrite H1 in H2.
会将f true
替换为true
中的H2
,并产生H2 : true = false
。然后,您可以执行inversion H2
或discriminate
。
我不确定是否有最好的证明方法,基本上有8种情况需要考虑,只有很少的空间来缩短这些。