用Coq求解多项式方程组

用Coq求解多项式方程组,coq,Coq,我最终实现了以下目标,令人失望的是,无论是Psatz还是欧米茄的战术都没有解决这个问题 虽然我很懒,但我测试了30个值的所有组合,并且在所有情况下都匹配,所以我认为目标是有效的 是否有其他方法来解决此目标(最好尽可能自动) 另外,omega和lia什么时候会失败(对于有效的方程组)?我惊讶地注意到,omega甚至不能解出a*b=b*a 编辑: 在进行一些手动替换之后,可以使用lia策略来解决Z整数的问题。(对nat进行替换不起作用(!)这可以通过其他策略实现自动化吗?然后我必须把定理“移植”回n

我最终实现了以下目标,令人失望的是,无论是Psatz还是欧米茄的战术都没有解决这个问题

虽然我很懒,但我测试了30个值的所有组合,并且在所有情况下都匹配,所以我认为目标是有效的

是否有其他方法来解决此目标(最好尽可能自动)

另外,
omega
lia
什么时候会失败(对于有效的方程组)?我惊讶地注意到,
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.

在您的情况下,
nia
将解决该目标。来自Coq参考的报价:

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

由于方程不是线性的,这将起作用(即使在
nat\u范围内
):

至于问题的
omega
部分:

。。。欧米茄甚至没有解出
a*b=b*a

omega
是基于,顺便说一句,它是可判定的。摘自Coq:

乘法由ω处理,但只有乘积的两个被乘数中至少有一个是常数的目标才是可解的。这就是“普雷斯伯格算法”的限制

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


一个成熟的选择是(注意:使用Coq 8.5时,您需要why3 head),但也可以选择其他选项,例如“…omega甚至没有解决ab=ba”--乘法由omega处理,但只有两个乘积中至少有一个是常数的目标才是可解的。这就是“Presburger算术”的限制]非常感谢!这回答了问题的一部分。你知道为什么
lia
适用于
Z
而不适用于
nat
?一个人如何将一个定理从
Z
导入
nat
?在
Z
中,
m-n+n=m
是正确的,但在
nat
中,情况并非如此(例如,如果
n>m
)。因此,部分问题可能来自于此……但例如,
n5+n4=n6+n3
意味着
n5=n6+n3-n4
(但事实并非如此),因此
n4
不能大于
n6+n3
。也许
lia
的问题在于
nat
不是一个正确的环(带负号),但该语句仍然应该是正确的,对吧?它确实暗示了这一点,但它不是等价的,所以我可以理解为什么(完整的)解算器会放弃执行该步骤。正如你们现在接受的答案所提到的,
nia
(我不知道)确实是不完整的。谢谢,这就是我需要的。它也适用于
Z
。我会将此标记为anwered,但是您是否有任何关于将函数通过
Z
(或
positive
)移植到
nat
的想法?如果你这样做了,我会把它作为一个单独的问题发布。我从来没有真正想过它(答应明天做)。但是无论如何,一定要把问题贴出来!你永远不知道这里的人能想出什么。我从这里的答案中学到了很多。我在这里贴了一个问题:谢谢,我会调查的。让我失望的一件事是:“然后将当前目标转换为Why3的逻辑,并调用验证程序。如果它报告目标有效,则使用Coq的
承认
策略来假设目标。”我希望为什么要创建一个可以构建回Coq证明的跟踪,不增加受信任代码的数量。我见过这样的东西被用于HOL证明,但显然这不是为什么(至少不是从为什么到Coq的方向)。事实上,使用Z3解算器的Coq smt检查(从第二个链接)在实数领域工作(
R\u scope
):
简介。smt解决方案;通过smt应用。
解决了该问题。插件在
nat_scope
Z_scope
@larsr中失败是可以理解的,这就是为什么我说“原型化”。请记住,SMT可以通过GiB中的痕迹来解决巨大的目标。不过,有些解算器(如Zenon)会生成跟踪,但我对它们没有经验。
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.
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.