1

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

我该如何纠正这些错误?

4

1 回答 1

3

(>=)/2并且(is)/2非常低级的谓词。您只能在非常特殊的情况下使用它们。在大多数情况下,这些谓词会导致实例化错误,因为一个或两个参数没有充分实例化。

在这种情况下,约束是一种声明性解决方案,在所有情况下都能正常工作。

例如,您可以使用SICStus Prolog 中提供的CLP(Q) ,只需对代码进行最少的修改:

:- 使用模块(库(clpq))。

解决方案(X,Y):-
    { X >= 0,
      Y >= 0,
      X + Y =< 50,
      2*X + Y =< 60 }。

示例查询和结果:

| ?- 解决方案X,Y),最大化(X+3*Y)。
X = 0,
Y = 50 ? ;
不

最广泛使用的 Prolog 和类似 Prolog 的系统(SICStus、ECLiPSe 等)都带有强大的约束库,特别是在对整数和有理数进行推理时使用。

于 2016-07-28T13:43:55.850 回答