考慮到@ re3el評論,我們從他們的「筆和紙的證明」開始:
if a>b max a b = a, a < a+b; else max a b = b, b < a+b
現在,讓我們翻譯成勒柯克!事實上,我們需要做的第一件事情是<
的可判定性,這是通過使用le_lt_dec a b
引理完成的。其餘的例程如下:
Require Import Arith.
Theorem max_sum (a b: nat) : max a b <= a + b.
Proof.
case (le_lt_dec a b).
+ now rewrite <- Nat.max_r_iff; intros ->; apply le_plus_r.
+ intros ha; apply Nat.lt_le_incl, Nat.max_l_iff in ha.
now rewrite ha; apply le_plus_l.
Qed.
然而,我們可以提高這個證明相當多。有各種各樣的候選人,一個好的使用STDLIB是:
Theorem max_sum_1 (a b: nat) : max a b <= a + b.
Proof.
now rewrite Nat.max_lub_iff; split; [apply le_plus_l | apply le_plus_r].
Qed.
使用我所選擇的庫[數學-COMP],你可以鏈中的重寫,以獲得更緊湊的證明:
From mathcomp Require Import all_ssreflect.
Theorem max_sum_2 (a b: nat) : maxn a b <= a + b.
Proof. by rewrite geq_max leq_addl leq_addr. Qed.
事實上,根據簡短的證明,也許最初的引理甚至不需要首先。
編輯:@Jason總提到的證明另一種風格更豐富的使用將使用:
Proof. apply Max.max_case_strong; omega. Qed.
然而,這個證明涉及使用一個重量級的自動化策略,omega
的;我強烈建議所有初學者暫時避免這種策略,並學習如何更「手動」地進行校樣。實際上,使用任何SMT技術,最初的目標都可以通過調用SMT來解決。
抱歉不太熟悉coq-tactic,但如果這是一般數學問題max(a,b)<= a + b是不正確的。示例a = 10,b = -20。 – DoesData
@DoesData:在coq中,我試圖證明自然數,它們在coq中都是大於零的值。 – re3el
@AntonTrunov:編輯問題 – re3el