这是一个愚蠢的初学者问题,但我如何证明这个定理?
Open Scope Z.
Theorem test : forall x y:Z, (x > 0 -> y = 1) / (x <= 0 -> y = 2) -> y >= 1.
Proof.
intros.
destruct x.
destruct H.
(* stuck *)
Qed.
我真正想做的是将一个if-then-else语句建模为一个Prop,并在证明它的条件下进行案例拆分。我陷入了这样的上下文:
y: nat
H: 0 > 0 -> y = 1
-----------------
(1/3)
y >= 1
(2/3)
y >= 1
(3/3)
y >= 1
我有点明白,要摆脱不可能的情况,我需要在假设中找到矛盾,但我该怎么做呢?
欢迎就如何做得更好提出建议,例如,这是模拟if-then-else的最佳方式吗?
我如何证明这个定理?
Theorem test : forall x y:Z, (x > 0 -> y = 1) / (x <= 0 -> y = 2) -> y >= 1.
你的定理是不正确的。
假设H: x > 0 -> y = 1
但x
实际上是0
,那么你没有办法证明y >= 1
因为你对y
一无所知。
也许你的意思是使用and
(/
)而不是or
? 然后这里有一个证明,它使用lia
来完成繁琐的Z
算术。
Require Import ZArith Lia. Open Scope Z.
Theorem test : forall x y:Z, (x > 0 -> y = 1) / (x <= 0 -> y = 2) -> y >= 1.
Proof. intros x y [H1 H2]. enough (x>0 / x<=0) as [H|H]; lia. Qed.
我认为您正在寻找的是引理
Z_lt_le_dec : forall x y : Z, {x < y} + {y <= x}
的图书馆。{ … } + { … }
的意思类似于/
,即它是一种析取,但在这里这种析取构造了一个Set
而不是Prop
的类型。这意味着,虽然你不能使用/
的析取来构建一个返回nat
的函数(因为Coq强制认为命题应该是无关紧要的),但你可以使用{ … } + { … }
的函数。你可以写
Definition test (x : Z) := if (Z_lt_le_dec 0 x) then 1 else 2.
这是像这样的模式匹配的语法糖
Definition test (x : Z) := match (Z_lt_le_dec 0 x) with
| left _ => 1
| right _ => 2
end.
其中left
和right
是{ … } + { … }
的两个构造函数。
要检查此test
是否发挥了应有的作用,您现在可以尝试去证明
Lemma test_ge1 (x : Z) : 1 <= test x.