a + b = 0 - > Coq中a = 0且b = 0

时间:2014-05-27 12:31:32

标签: coq

我想证明以下内容:

1 subgoals
a : nat
b : nat
H0 : a + b = 0
______________________________________(1/1)
a = 0 /\ b = 0

这似乎很容易,甚至是微不足道的,但我不知道该怎么做。我尝试inductioncase但未成功。有什么想法吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

您可以通过forall n1 n2, n1 + n2 = 0 -> n1 = 0上的案例分析来证明n1

如果n10,则结论为0 = 0,您可以证明这一点,因为=具有反身性。

如果有n3 n1 = S n3,那么假设S n3 + n2 = 0会缩减为S (n3 + n2) = 0并隐含False,因为0和{{ 1}}是不同的构造函数。 S暗示任何事情,所以你已经完成了。

你可以通过使用先前的事实和加法的交换来证明False。然后你就可以证明forall n1 n2, n1 + n2 = 0 -> n2 = 0

forall n1 n2, n1 + n2 = 0 -> n1 = 0 /\ n2 = 0

尽管如此,尝试自动化证明可能会更好。

Check eq_refl.
Check O_S.
Check False_rect.
Conjecture plus_comm : forall n1 n2, n1 + n2 = n2 + n1.
Check conj.

无论哪种方式,这一事实已在标准库中得到证实。

Require Import Coq.Setoids.Setoid.

Set Firstorder Depth 0.

Create HintDb Hints.

Ltac simplify := firstorder || autorewrite with Hints in *.

Conjecture C1 : forall t1 (x1 : t1), x1 = x1 <-> True.
Conjecture C2 : forall n1, S n1 = 0 <-> False.
Conjecture C3 : forall n1, 0 = S n1 <-> False.
Conjecture C4 : forall n1 n2, S n1 = S n2 <-> n1 = n2.
Conjecture C5 : forall n1, 0 + n1 = n1.
Conjecture C6 : forall n1 n2, S n1 + n2 = S (n1 + n2).

Hint Rewrite C1 C2 C3 C4 C5 C6 : Hints.

Theorem T1 : forall n1 n2, n1 + n2 = 0 <-> n1 = 0 /\ n2 = 0.
Proof. destruct n1; repeat simplify. Qed.

Hint Rewrite T1 : Hints.