Zsbán Ambrus <ambrus(a)math.bme.hu> writes:
A jegyzetben a 107. oldalon szerepel a következõ
példa, amely a #=<
korlát egy megvalósítását mutatja.
% X #=< Y, globális korlátként megvalósítva
lseq(X, Y) :-
fd_global(lseq(X,Y), void, [min(X),max(Y)]).
:- multifile clpfd:dispatch_global/4.
:- discontiguous clpfd:dispatch_global/4.
clpfd:dispatch_global(lseq(X,Y), St, St, Actions) :-
dispatch_lseq(X, Y, Actions).
dispatch_lseq(X, Y, Actions) :-
fd_min(X, MinX), fd_max(X, MaxX),
fd_min(Y, MinY), fd_max(Y, MaxY),
( number(MaxX), number(MinY), MaxX =< MinY
-> Actions = [exit]
; Actions = [X in inf..MaxY, Y in MinX..sup]
).
A kérdésem az, szükség van-e itt a MaxX =< MinY feltétel vizsgálatára?
A definíció akkor is mûködne, ha a dispatch_lseq eljárást egyszerûen
csak úgy definiálnánk, hogy
dispatch_lseq(X, Y, [X in inf..MaxY, Y in MinX..sup]) :-
fd_min(X, MinX), fd_max(Y, MaxY).
Ez is mukodik, csak sosem lep ki a korlat. Ez tehat egy memoria-luk
(memory-leak) lenne, amit fontos elkerulni.
-Peter