2016-07-28 8 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매우 낮은 레벨 술어입니다. 매우 특별한 경우에만 사용할 수 있습니다. 대부분의 경우 하나 또는 두 개의 인수가 충분히 인스턴스화되지 않았기 때문에 이러한 술어는 인스턴스화   오류으로 연결됩니다.

제약 조건은 모든 경우에 올바르게 작동하는 선언적 솔루션입니다.

 
:- use_module(library(clpq)). 

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

샘플 쿼리 및 결과 :

예를 들어, 당신은 당신의 코드의 최소한의 수정을 SICStus 프롤로그에로 사용할 수 CLP (Q)을 사용할 수 있습니다

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

가장 널리 사용 된 Prolog 및 Prolog와 유사한 시스템 (SICStus, ECLiPSe   등)은 모두 강력한 제약 라이브러리를 가지고 있으며, 이는 정수 및 이성에 대해 추론 할 때 특히 유용하게 사용됩니다.

+0

SWI-Prolog에는 어느 라이브러리가 있습니까? – 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, solution (X, 50) .'이 성공합니다. 그러나'(is)/2','(> =)/2' ...에는이 문제가 없습니다. – false