我最终得到了以下目标,令人失望的是, 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个值的所有组合,并且它在所有实例中都匹配,所以我认为目标是有效的。
是否有其他方法可以解决这个问题(最好尽可能自动)?
此外,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.
......我该怎么做?
(processorcount=4 or processorcount=8) and kernel=Linux
答案 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