要在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).
错误:参数未充分实例化
好消息(在某种意义上)是我们无论如何都没有时间尝试所有可能性。所以我们最好将自己限制在搜索空间的一部分。例如:
使用以下查询,您可以获得具体的整数解决方案:
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)也值得一试。
scipy.optimize.linprog()
。 - Dietrich