Zsbán Ambrus <ambrus(a)math.bme.hu> writes:
2009/6/20 Peter Szeredi <szeredi(a)cs.bme.hu>hu>:
jovore minmax ebredesi feltetellel tervezem
elmondani az lseq-t...
Igen, de persze nem elég csak az ébredési feltételt módosítani,
ahogyan a 4. kisházi trükkös mintabemenete mutatja.
Jogos. Ket megoldas lehetseges:
- a kilepesi feltetelt bonyolultabba tenni;
- kikapcsolni az idempotens viselkedest.
Az utobbit mutatja az alabbi futas, amely Ambrusetol csak abban ter el,
hogy az fd_global kapott egy 4. parametert, az [idempotent(false)]
opciolistat.
-Peter
10:09 ~/tmp[48] cat glo-t.pl
% felhasználói korlát példa az NLP jegyzetbõl
:- use_module(library(clpfd)).
% X #=< Y, globális korlátként megvalósítva
lseq(X, Y) :-
fd_global(lseq(X,Y), void, [minmax(X),minmax(Y)],
[idempotent(false)]).
:- 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]
).
10:09 ~/tmp[48] sicstus -l glo-t.pl
% compiling /home/szeredi/tmp/glo-t.pl...
(...)
% compiled /home/szeredi/tmp/glo-t.pl in module user, 120 msec 470300 bytes
SICStus 3.12.2 (x86-linux-glibc2.3): Sun May 29 11:59:09 CEST 2005
Licensed to BUTE DCSIT
| ?- assert(clpfd:full_answer).
yes
| ?- X in {3,4,9}, Y in {1,7}, lseq(X, Y).
Y = 7,
X in 3..4 ? ;
no
| ?-