我陷入了假设~ (exists k, k <= n+1 /\ f k = f (n+2))
并希望将其转换为等效(我希望如此)假设forall k, k <= n+1 -> f k <> f (n+2)
的情况。
这是一个小例子:
Require Import Coq.Logic.Classical_Pred_Type.
Require Import Omega.
Section x.
Variable n : nat.
Variable f : nat -> nat.
Hypothesis Hf : forall i, f i <= n+1.
Variable i : nat.
Hypothesis Hi : i <= n+1.
Hypothesis Hfi: f i = n+1.
Hypothesis H_nex : ~ (exists k, k <= n+1 /\ f k = f (n+2)).
Goal (f (n+2) <= n).
我尝试使用not_ex_all_not
中的Coq.Logic.Classical_Pred_Type
。
Check not_ex_all_not.
not_ex_all_not
: forall (U : Type) (P : U -> Prop),
~ (exists n : U, P n) -> forall n : U, ~ P n
apply not_ex_all_not in H_nex.
Error: Unable to find an instance for the variable n.
我不明白这个错误意味着什么,所以随机猜测我试过了:
apply not_ex_all_not with (n := n) in H_nex.
它成功但H_nex
现在完全废话:
H_nex : ~ (n <= n+1 /\ f n = f (n + 2))
另一方面,如果H_nex
表示为forall
,则很容易解决我的目标:
Hypothesis H_nex : forall k, k <= n+1 -> f k <> f (n+2).
specialize (H_nex i).
specialize (Hf (n+2)).
omega.
我发现了类似的question但未能将其应用于我的案例。
答案 0 :(得分:2)
我不太确定你的问题是什么。
以下是如何简明扼要地表明你的暗示。
Section S.
Variable n : nat.
Variable f : nat -> nat.
Hypothesis H : ~ (exists k, k <= n /\ f k = f (n+1)).
Goal forall k, k <= n -> f k <> f (n+1).
Proof.
intros k H1 H2.
apply H.
exists k.
split; assumption.
Qed.
End S.
你的目标也可由apply Hf.
证明,所以我不确定,但你似乎有些困惑......
答案 1 :(得分:2)
如果您想使用not_ex_all_not
引理,您想要证明的内容需要看起来像引理。例如。你可以先证明以下几点:
Lemma lma {n:nat} {f:nat->nat} : ~ (exists k, k <= n /\ f k = f (n+1)) ->
forall k, ~(k <= n /\ f k = f (n+1)).
intro H.
apply not_ex_all_not.
trivial.
Qed.
然后证明其余的:
Theorem thm (n:nat) (f:nat->nat) : ~ (exists k, k <= n /\ f k = f (n+1)) ->
forall k, k <= n -> f k <> f (n+1).
intro P.
specialize (lma P). intro Q.
intro k.
specialize (Q k).
tauto.
Qed.