Coq:如何证明max a b< = a + b?

时间:2017-09-25 16:39:23

标签: coq coq-tactic

我无法使用coq的策略来证明简单的逻辑 if member.range:range(1, 6):string() == 'result' then 。我应该怎么解决呢?下面是我到目前为止所使用的代码。 max a b <= a+b已被证明,但为了简单起见,此处未提及。

s_le_n

1 个答案:

答案 0 :(得分:2)

考虑到@ re3el评论,我们从他们的&#34;笔和纸张证明&#34;开始:

if a>b max a b = a, a < a+b; else max a b = b, b < a+b

现在让我们把它翻译成Coq吧!事实上,我们需要做的第一件事是关于<的可判定性的案例,这是使用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.

使用我选择的库[math-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 Gross提到了另一种经验丰富的使用样式:

Proof. apply Max.max_case_strong; omega. Qed.

然而,这个证据涉及使用重量级自动化策略,omega;我强烈建议所有初学者暂时避免使用这种策略,并学习如何更多地进行校对&#34;手动&#34;。实际上,使用任何支持SMT的策略,可以通过调用SMT简单地解决原始目标。