我想证明以下内容:
1 subgoals
a : nat
b : nat
H0 : a + b = 0
______________________________________(1/1)
a = 0 /\ b = 0
这似乎很容易,甚至是微不足道的,但我不知道该怎么做。我尝试induction
,case
但未成功。有什么想法吗?
感谢您的帮助。
答案 0 :(得分:5)
您可以通过forall n1 n2, n1 + n2 = 0 -> n1 = 0
上的案例分析来证明n1
。
如果n1
为0
,则结论为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.