使用 Prolog 求解线性规划

Solving linear programming with Prolog

我正在尝试解决 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

如何更正这些错误?

(>=)/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 等)都附带强大的约束库,这些库主要用于对整数和有理数进行推理。