2016-07-28 2 views
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 

は、どのように私はこれらのエラーを修正することができますか?

答えて

3

(>=)/2および(is)/2は、と非常に低いレベルの述語である。非常に特殊な状況でのみ使用できます。ほとんどの場合、一方または両方の引数が十分にインスタンス化されていないため、インスタンス化 エラーになります。

制約は、そのような場合の宣言的な解決策であり、すべてのケースで正しく機能します。最も広く

 
| ?- solutionX, Y), maximize(X+3*Y). 
X = 0, 
Y = 50 ? ; 
no 

 
:- use_module(library(clpq)). 

solution(X, Y) :- 
    { X >= 0, 
     Y >= 0, 
     X + Y =< 50, 
     2*X + Y =< 60 }. 

サンプルクエリと結果:

たとえば、あなたはあなたのコードの最小限の変更でSICStusプロローグのように利用できるCLP(Q)を使用することができます使用されるPrologとPrologのようなシステム(SICStus、ECLiPSe  など)には、すべて強力な制約ライブラリが付属しています。これは特に整数や有理数について推論する際に使用されます。

+0

SWI-Prologではどれが1つのライブラリですか? – rnso

+0

SWI-Prologには、SICStus CLP(Q)ライブラリの[ポート](http://eu.swi-prolog.org/man/clpqr.html)が同梱されています。しかし、SWIの実装には間違いがあるので、私はそれをお勧めできません。 – mat

+0

解決策「解決策(X、50)、X = 0 + 0.」は失敗するが、「X = 0 + 0、解(X、50)しかし、 '(is)/ 2'、'(> =)/ 2' ...にはこの問題はありません。 – false

関連する問題