如果我使用
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或其他一些免费提供的产品是否有解决以这种方式产生的线性不等式系统的方法。
谢谢!
答案 0 :(得分:2)
为了推理Prolog中的整数,您可以使用Prolog系统的 CLP(FD)约束。
不同Prolog系统之间的确切细节略有不同。有关详细信息,请参阅系统手册;有关相关问题,请参阅clpfd。
在您的情况下,我们可以从发布约束开始:
?- 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 in 0..sup, 2*X+3*Y#=5*Z+77, Y in 0..sup, Z in 0..sup.
根据要求,此额外目标将变量限制为非负整数。该系统的答案仍然没有多大帮助。
您可以使用label/1
搜索具体的解决方案。但是,这种所谓的标记要求所有域都是有限的,因此我们目前得到:
?- 2*X + 3*Y - 5*Z #= 77, Vs = [X,Y,Z], Vs ins 0..sup, label(Vs). ERROR: Arguments are not sufficiently instantiated
好消息(在某种意义上)是我们在任何情况下都没有时间尝试所有的可能性。所以我们不妨将自己局限于搜索空间的某些有限部分。例如:
?- 2*X + 3*Y - 5*Z #= 77, Vs = [X,Y,Z], Vs ins 0..10 000 000 000 000 000 000, label(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] ; etc.
由于您在推理线性约束,因此CLP(Q)也值得一试。