[英]IndProp: ev_plus_plus
(** **** Exercise: 3 stars, standard, optional (ev_plus_plus)
This exercise just requires applying existing lemmas. No
induction or even case analysis is needed, though some of the
rewriting may be tedious. *)
Theorem ev_plus_plus : forall n m p,
even (n+m) -> even (n+p) -> even (m+p).
Proof.
intros n m p H1 H2.
這是我得到的:
1 subgoal (ID 89)
n, m, p : nat
H1 : even (n + m)
H2 : even (n + p)
============================
even (m + p)
我已經證明了先前的定理:
Theorem ev_ev__ev : forall n m,
even (n+m) -> even n -> even m.
並想將其應用於H1,但是
apply ev_ev__ev in H1.
給出一個錯誤:
Error: Unable to find an instance for the variable m.
為什么even (n + m)
表達式中even (n + m)
找不到“ m”? 怎么修?
更新
apply ev_ev__ev with (m:=m) in H1.
給出一個非常奇怪的結果:
2 subgoals (ID 90)
n, m, p : nat
H1 : even m
H2 : even (n + p)
============================
even (m + p)
subgoal 2 (ID 92) is:
even (n + m + m)
我認為這會將H1轉換為2個假設:
H11 : even n
H12 : even m
但是取而代之的是給了2個子目標,我們需要證明的第二個子目標比最初的子目標更復雜:
even (n + m + m)
這里發生了什么事?
語句forall nm, even (n+m) -> even n -> even m.
並不意味着“如果我們擁有(n + m)為偶數,那么我們擁有n為偶數和m為偶數”(這是錯誤的,請考慮n = m = 1)。 相反,它的意思是“如果我們(n + m)為偶數,並且n為偶數,那么m為偶數”。
H12 : even m
H1 : even (n + m)
不可能假設H11 : even n
和H12 : even m
,而沒有矛盾。 我建議在嘗試用Coq證明之前,先弄清楚如何用紙和筆證明您的定理。
因為Coq無法確定應為m賦予什么值。 您可以eapply ev_ev__ev in H1.
應用策略eapply ev_ev__ev in H1.
並看到目標
n, m, p : nat
H2 : even (n + p)
H1 : even ?m
============================
even (m + p)
subgoal 2 (ID 17) is:
even (n + m + ?m)
Coq用元變量?m實例化了m,最后您需要為該元變量提供見證以完成證明。
第二種方法是通過apply ev_ev__ev with (m := m) in H1.
實例化m的值apply ev_ev__ev with (m := m) in H1.
您可以在軟件基金會https://softwarefoundations.cis.upenn.edu/lf-current/Tactics.html中看到更多有關戰術應用的信息
發生的事情是Coq用ev_ev__ev
的even n
參數而不是even (n+m)
統一H1
。
您可以確切地告訴Coq您想要H1
到達的位置,並使用_
通配符表示讓Coq計算出詳細信息的位置。
您可能想要用even n -> even m
類型的ev_ev__ev nm H1
,但是您的apply
產生了ev_ev__ev (n+m) m _ H1
,這也給您提供了更多的證明依據。 要查看證明上下文,請執行
Check ev_ev__ev (n+m) m _ H1.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.