3

如果我使用

diophantine(2*x+3*y-5*z-77)

我收到了这个结果。

{(t_0, -9*t_0 - 5*t_1 + 154, -5*t_0 - 3*t_1 + 77)}

到目前为止还好。然而,有时人们可能希望将 x、y 和 z 限制为(比如说)非负数。当我使用这样的方法时<

reduce_inequalities([0<=t_0, 0<=-9*t_0 - 5*t_1 + 154, 0<=-5*t_0 - 3*t_1 + 77],[t_0, t_1])

我得到:

NotImplementedError: 
inequality has more than one symbol of interest

sympy、sage、prolog、haskell 或其他一些免费提供的产品是否具有解决以这种方式出现的线性不等式系统的方法。

谢谢!

4

1 回答 1

2

要推理Prolog 中的整数,您可以使用 Prolog 系统的CLP(FD) 约束

不同 Prolog 系统之间的确切细节略有不同。请参阅您的系统手册了解更多信息,也请参阅了解相关问题。

在您的情况下,我们可以从简单地发布约束开始:

?- 2*X + 3*Y - 5*Z #= 77。
2*X+3*Y#=5*Z+77。

在这种情况下,对于所有纯 Prolog 程序,系统的答案在声明上等同于原始查询。这在这里没有多大帮助:系统只是稍微重写了原始约束。

您可以进一步限制这一点,例如:

?- 2*X + 3*Y - 5*Z #= 77,
    [X,Y,Z] ins 0..sup.
X 在 0..sup,
2*X+3*Y#=5*Z+77,
Y 在 0..sup 中,
Z 在 0..sup.

根据要求,此附加目标将变量限制为非负整数。系统的回答仍然没有太大帮助。

您可以使用label/1来搜索具体的解决方案。但是,这种所谓的标记要求所有域都是 有限的,因此我们目前得到:

?- 2*X + 3*Y - 5*Z #= 77,
   Vs = [X,Y,Z],
   VS ins 0..sup,
   标签(Vs)错误:参数没有充分实例化

好消息(在某​​种意义上)是我们在任何情况下都没有时间尝试所有的可能性。所以我们不妨将自己限制在搜索空间的某个有限部分。例如:

?- 2*X + 3*Y - 5*Z #= 77,
   Vs = [X,Y,Z],
   VS ins 0..10 000 000 000 000 000 000 ,
   标签(Vs)。

使用此查询,您可以获得具体的整数作为解决方案:

X = 0,
Y = 29,
Z = 2,
Vs = [0, 29, 2] ;
X = 0,
Y = 34,
Z = 5,
Vs = [0, 34, 5] ;
X = 0,
Y = 39,
Z = 8,
Vs = [0, 39, 8] ;
X = 0,
Y = 44,
Z = 11,
Vs = [0, 44, 11] ;
等等

由于您正在对线性约束进行推理,因此 CLP(Q) 也可能值得一试。

于 2017-03-23T15:56:18.660 回答