要推理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 在 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) 也可能值得一试。