求解Coq

时间:2016-05-17 19:12:11

标签: coq

我最终得到了以下目标,令人失望的是, Psatz Omega 的策略都没有解决。

Require Import Psatz Omega.
Goal forall n n0 n1 n2 n3 n4 n5 n6,
       n5 + n4 = n6 + n3 ->
       n1 + n0 = n2 + n ->
       n5 * n1 + n6 * n2 + n3 * n0 + n * n4 =
       n5 * n2 + n1 * n6 + n3 * n + n0 * n4.
intros.
Fail lia.
Fail omega.

像我一样懒惰,我测试了最多30个值的所有组合,并且它在所有实例中都匹配,所以我认为目标是有效的。

是否有其他方法可以解决这个问题(最好尽可能自动)?

此外,omegalia何时会失败(对于有效的方程式系统)?我惊讶地发现omega甚至没有解决a*b = b*a

编辑:

在进行一些手动替换后,可以使用lia Z整数的nat策略来解决它。 (对nat进行替换不起作用(!))可以通过其他一些策略自动化吗?然后我必须将定理“移植”回Require Import ZArith. Open Scope Z. Lemma help: forall n n0 n1 n2 n3 n4 n5 n6, n >= 0 -> n0 >= 0 -> n1 >= 0 -> n2 >= 0 -> n3 >= 0 -> n4 >= 0 -> n5 >= 0 -> n6 >= 0 -> n5 + n4 = n6 + n3 -> n1 + n0 = n2 + n -> n5 * n1 + n6 * n2 + n3 * n0 + n * n4 = n5 * n2 + n1 * n6 + n3 * n + n0 * n4. intros. Fail lia. assert (n5 = n6 + n3 - n4) by lia; subst n5. assert (n1 = n2 + n - n0) by lia; subst n1. Fail omega. lia. Qed. Close Scope Z. ......我该怎么做?

(processorcount=4 or processorcount=8) and kernel=Linux

2 个答案:

答案 0 :(得分:3)

在您的情况下nia将解决目标。来自Coq参考manual的引用:

  

nia是整数非线性算术的不完整证明程序(参见第22.6节)

由于方程式不是线性的,所以这将起作用(即使在nat_scope中):

Goal forall n n0 n1 n2 n3 n4 n5 n6,
       n5 + n4 = n6 + n3 ->
       n1 + n0 = n2 + n ->
       n5 * n1 + n6 * n2 + n3 * n0 + n * n4 =
       n5 * n2 + n1 * n6 + n3 * n + n0 * n4.
intros.
nia.
Qed.

关于问题的omega部分:

  

......欧米茄甚至没有解决a*b = b*a

omega基于Presburger arithmetic,顺便说一下,这是可判定的。摘自Coq manual

  

乘法由omega处理,但只有产品的两个被乘数中至少有一个是常数的目标是可解的。这是“Presburger算术”所指的限制

答案 1 :(得分:1)

对于这种“原型设计”,除了Coq的程序外,使用外部SMT求解器也可能是一个好主意。

一个成熟的选择是why3 tactic(注意:你需要为什么要使用Coq 8.5),但其他选项也是可能的,例如this