我正在尝试解决http://www.zweigmedia.com/RealWorld/tutorialsf4/framesLinProGr.html上的第一个线性规划问题示例。 X和Y为零或正数,它们的总和可以达到50,2X + Y可以达到60.函数X + 3Y必须最大化。
我正在使用以下代码:
mysol2(X,Y,Z):-
X in 0..sup, % Error: Syntax error: Operator expected
Y in 0..sup,
X + Y =< 50,
2 * X + Y =< 60,
Z is max(X + 3*Y).
但是,它甚至没有加载(错误如上所示)。
使用以下代码:
mysol2(X,Y,Z):-
X >= 0,
Y >= 0,
X + Y =< 50,
2 * X + Y =< 60,
Z is max(X + 3*Y).
程序加载,但在运行时:
ERROR: >=/2: Arguments are not sufficiently instantiated
如何更正这些错误?
答案 0 :(得分:3)
(>=)/2
和(is)/2
是非常低级别的谓词。您只能在非常特殊的情况下使用它们。在大多数情况下,这些谓词会导致实例化错误,因为一个或两个参数没有充分实例化。
约束是一种声明性解决方案,在所有情况下都能正常工作。
例如,您可以使用SICStus Prolog中提供的 CLP(Q),只需对代码进行最少的修改:
:- use_module(library(clpq)). solution(X, Y) :- { X >= 0, Y >= 0, X + Y =< 50, 2*X + Y =< 60 }.
示例查询和结果:
| ?- solutionX, Y), maximize(X+3*Y). X = 0, Y = 50 ? ; no
最广泛使用的Prolog和Prolog类系统(SICStus,ECLiPSe等)都附带强大的约束库,这些库在推理整数和有理数时非常有用。