:?- 1 + = 5.
Prolog , Prolog "". , X , "+ " , X = 4 . "=" is , CLP(R) . ( SICStus Prolog) CLP(R) :
?- { 1 + X = 5!. % X = 4
, , . Prolog , . . Prolog, , - . Cl. C2 : <; Cl, C2, )
:
Exprl Operator Expr2
Exprl, 2 . , CLP(R), , sin;X). Operator , .
=. .
=\=. .
<,_<, >, >=. .
306 II. Prolog
, , , Prolog.
Prolog is, , :
convert; Centigrade, Fahrenheit):-Centigrade is (Fahrenheit - 32)*5/9.
35 , , , is , , . , , , , . CLP(R), , , , .
|
|
convert E Centigrade, Fahrenheit):-
{ Centigrade = [Fahrenheit - 32) *S/9).?- convert (35, F). F = 95
?- convert (C, 95). = 35
CLP{R) , :
?- convert! , F). t F = 32.0 + 1.8* }
, , : F , . , , CLP, convert.
, , . .
?- (3* - 2*Y = 6, 2*Y = X}.
X - 3.0
- 1.5
?- { 1 =< -2, Z =< 6-, 2 + 1 = 2).
= 1.0
{X >= 3.0}
(X =< 5.0}
CLP(R) , , . CLP(R):
minimize! Expr) maximize(Expr)
Expr , . , , , .
14.
■?- { | X =< 5), maximize(X). |
X - | 5.0 |
?- { | X =< 5, 2 =< X}, minimize (2*X + 3) |
X = | 2.0 |
?- { | X >-2, Y >=2, Y -< X+l, 2*Y -< 3-, |
X - | 4.0 |
Y = | 2.0 |
Z = | 14.0 |
?- { | X =< 5}, minimize! X). |
no |
S
2*X + 3*Y}r maximize(2)
X , .
CLP(R) ( ) ( ) :
supf Expr, MaxVal)
inf(Expr, MinVal)
Expr , a MaxVal MinVal , , . maximize/1 minimize/1, Expr , ,
?- { 2 =< X =< 5), inf( X, Min), sup; X, ].
Max =5.0
Min -2.0
(X >- 2.0J
{X =< 5.0
?- (X >=2, Y >=2, Y -< X+l, 2*Y =< 8-X, 2 = 2*X + 3*Y},
sup (Z,Max), inflZ.Min), maximize (Z).
X = 4.0
Y = 2. 0
Z = 14.0
- 14.0
Min = 10.0
, , d CLP(R) :
?- ( + 2=<= , % | |
+ 2 =< , % | |
+ 3 =< Td, % | |
+ 5 =< Tf, % | |
Td + 4 = < Tf }, % | |
minimize(Tf), | |
= 0.0 | |
Tb = 2.0 | |
Td = 5.0 | |
Tf 9.0 | |
{ -< 4.0} | |
{ >= 2.0> |
d Tf
|
|
d Tf
, Prolog. fib { N, F) - : F (0) -1, F(l)l, (2)2, F<3)-3, (4)=5 .. N > 1, F(N> = F(N-l) + F (N-2). fib/2 Prolog.
fib(, F):-N=0, F=l
-1, F=l
308 II. Prolog
>1,
N1 is H-l, fib(Hl.Pl), N2 is H-2, fib{N2,F2), F is Fl + F2.
, :?- fib(6, }. F=13
, ^:?- fib CM, 13).
, N > 1 - . , CLP(R), , ,
fib (N, ):-i N = , F - 13
'( - 1, F-1}
t > 1, F = F1+F2, HI -S-1, N2 = -2 fib( HI, Fl), fib( N2, F2>.
. , F :?- fib(N, 13). N = 6
, :?- fib{ , 4}.
F1 F2, Fl + F2 = 4. F1 F2 , 4. , 4, 4. , . , , , fib, . , N F(N) £ N. N1, Fl, N2 F2 : F1 >= N1, F2 >= N2. fib.
fib(S, F):-
{ > 1, F = F1+F2, Hi = -1, N2 = 8-2,
F1 >= HI, F2 >- 2}, % fib( HI, Fl), fib(82 F2).
, :
?- fib , 4).
fib
F F = 4:
4 - F - Fl + F2 =
Fl' + F2' + F2 =
1< ' + F2" + F2" + F2
14.
. , , .
CLP(Q), CLP(R). , CLP(R) , Q , .. , . . Q R ( ) , , . .
|
|
?- (X=2*Y, Y=l-X }.
CLP(Q) : X = 2/3, Y = 1/3. CLP{R) : X = 0.666666666, Y = 0.333333333.
14,3. , "?-fib(N, 4;.", , , .
CLP
, , .
7;,...,:..
Di........ Dn .
, , :
prec(Ti,?,!
, . , Tj.
::., .
: ( ).
, ,
.
. ,
:
,
.
CLP :
, S1,..., Sn, ,
, 1........ .
. , ,
310 II. Prolog
. , , . , . , , , prec (a, b). , Da, b Sa Sb. , Sa sb : { + Da -< Sb }
, , . 0, FinTime : { Si >- 0, Si + Di =< FinTime }
: tasksC [Taskl/Durationl, Task2/Duration2,...])
. prec(Taskl, Task2)
Taskl 2. resource! Task, [ Procl, Proc2,...])
, Task
|
|
Procl, Proc2................. , -
, 12 ( 12.3), . . 12 , , .
. . 14.1. , 14.1, . , . schedule! Schedule, FinTime)
Schedule , tasks prec, a FinTime . :
Schedule = [ Taskl/Startl/Durationl, Task2 /Start2/Duration2,...]
14.1.
I ■.::.■..'
scheduler Schedule, FinTime):-tasks TasksDurs), precedence_constr{ TasksDurs, Schedule, FinTime), %
% minimize! FinTime).
precedence_constr([1, [], FinTime).
14.
precedence_constr([T/D ] TDs], [T/Start/D | Rest], FinTime):-
{ Start >- 0, %
Start + D =< FinTime}, % FinTime precedence_constr(TDs, Rest, FinTime), prec_constr(T/Start/D, Rest).
pzec_constx [ _, []).
prec_constr(T/S/D, [T1/S1/D1 I Rest]):-
(prec(T, Tl;,!, t S+D -< SI}
s precl Tl, T),!, { Sl + Dl =< S)
true),
prec_constr(T/S/D, Rest).
% ,
tasks; [ tl/5, t2/7, t3/10, t4/2, t5/9L>.
%
prec[ tl, t2). prec(tl, t-4). prec (t2, t3). prec i t4, t5).
schedule, , .
1. , .
2. ,
, , CLP(R) .
pracedeiice_constrTasksDuraticns, Schedule, FinTime)
Schedule FinTime. prec_constr[ Task/Start/Duration, RestOfSchedule)
Start Task RestOfSchedule , .
, 14.1, . - :
?- schedule; Schedule, FinTime).
FinTime = 22,
Schedule = [tl/0/5, t2/5/7, t3/12/10,t4/S4/2,t5/S5/9],
(SS =< 13)
{S4 >= 5}
(S4-S5 =< -2)
t4 t5 . 3 4 S5 t4 t5 . (tl, t2 t3) , .
II. Prolog
. , , 12 (. 12.3, . 12.6), . , , .
.
1. .
2. .
, , 14.1. . . , Ti , Pi, . :
|
|
Schedule = [ Taskl/Frocl/Startl/Durl, Task2/Proc2/Start2/Dur2,...]
Procl , Taskl, Startl Taskl Durl . , 14.2, 14.1. schedule (BestSchedule, BestTime)
BestTime. , , :
precedence^onstr ( TasksDurations, Schedule, FinTime!
14.2. CLP(R)
& CLP
schedule (BestSchedule, EestTime):-tasks{ TasksDurs), precedence_constr{ TasksDurs, Schedule, FinTime), % ,
\
initialise bound, %
%
assign_processors{ Schedule, FinTime), '--.
minimize(FinTime),
update_bound(Schedule, FinTime),
fail \ ,
bestsofar(BestSchedule, EestTime). %
% precedence_constr { TasksDurs, Schedule, FinTime):
% , ^
, Schedule, -:
% , .
% FinTime
,
precedence_constr{ [], [], FinTime).
precedenee_constr ([T/D | TDs), [T/Proc/Start/D [ Rest], FinTime):-
{ Start >- 0, % 0
Start + D =< FinTime }, % FinTime
precedence_Constr(TDs, Rest, FinTime;,
14.
prec_Constr(T/Proc/Start/D, Rest).
prec_constr(_, [}).
prec_constr[ T/P/S/D, [T1/P1/S1/D1 I Rest]):-(~prec(T, 11), 1, { S+D =< SI}
precf Tl, T), i, { Sl+Dl =< S}
true), prec_constr (T/P/S/D, Rest).
I assign_prccessors(Schedule, FinTime}:
% Schedule
assign^processors I [], FinTime).
assign_processors { [T/P/S/D | Rest], FinTime}:-
assign_Drocessors(Rest, FinTime),
resource; T, Processors), %
4 Processors
member(p, Processors), %
resource_constr (T/P/S/D, Rest}, %
bestsofarf _, BestTimeSoFarj,
(FinTime < BestTimeSoFar }. %
%
% resource__coristr (ScheduledTask, TaskList):
, I ScheduledTasJc TaskList
resource_constr(_, []).
resource COnetr< Task, [Taskl I Rest]) ; -
no_conflict(Task, Taskl), resource_constr (Task, Rest).
no_conflict[ T/P/S/D, T1/P1/S1/D1)
P \PI,! %
prec{ T, Tl),! %
prec{ Tl, T),! %
(-S+D =< 51 % ,-
Sl+Dl =< S}. initialise_bound: -retract (feestsefar (_,_}>, fail
assert! bestsofarf dummy_schedule, 9999)). % , 9999
% update_bound[ Schedule, FinTime):
*
update_bound(Schedule, FinTime):-retract (bestsofar[_,_)),!, assert(bestsofar(Schedule, FinTime]).
% ,
tasks! [tl/4,t2/2,t3/2, t4/20, t5/20, t6/ll, t7/ll]).
II. Prolog
-
[ tl, t4), prec(tl, t5). precC t2, t4). prec(t2, t5). prect t2, t6). prec(t3, t5). prect t3, t>. prec< t3, tl).
i resource) Task, Processors):
% Processors, Task
resource) _, [1,2,3]). % ,
%
14.1. .
. , . , . , , , . , 14.2, . , . ( , fail). . , ( bestsofar). . , , .
, 14.2, . assign_processors . , , , . . , - , . , FinTime , . : (FinTime < BestTimeSoFar }
, . , . , FinTime < BestTimeSoFar , ; .. , , . ,
14.
. , , , ' , . , .
, - . , BestTimeSoFar, . , , , . , , . , - , .
14.2 (. . 12.6), . , , , .?- schedule Schedule, FiiiTime]. FinTime = 24
Schedule = t tl/3/0/4,12/2/0/2,13/1/0/2, t4/3/4/20, t5/2/4/20, 16/1/2/11,17/1/13/11]
11 , , t2 2, 0 .. . , - . , , . , , , 1 t7 t6 1 2. , resource. , , , . , , , , , .
14.4. , 14.1. , , . ?
14.5. , 14.2, (best sofa ) , . , . , , , , , . , ,
316 II. Prolog
( ). . , .