Sziasztok!
Írtam 1 globális korlátot ami a könyvtári sum-ot egészíti ki ugy, hogy a
listában amit összegez ne lehessenek egyedül álló 1esek. A lista csak
1esekből és 0kból áll. Sajnos vmiért elszáll a tőle a sicstus. Ha valakinek
van 1 kis ideje, nézze meg légyszives, hogy mi lehet vele a gond!
-----------------------------------------------------------
% sumex(L, E): L lista elemeinek összege E, és L nem tartalmaz 1edül álló
1est
sumex(L, E) :-
minmaxs(L, Susp),
fd_global(sumex(L, E), void, Susp).
minmaxs([], []).
minmaxs([X|XS], [minmax(X)|YS]) :-
minmaxs(XS, YS).
:- multifile clpfd:dispatch_global/4.
:- discontiguous clpfd:dispatch_global/4.
clpfd:dispatch_global(sumex(L, E), St, St, Actions) :-
dispatch_sumex(L, E, Actions).
dispatch_sumex(L0, E0, Actions) :-
filter(L0),
ossz(L0, E0, L, E),
length(L, Len),
( Len < E -> Action = [fail]
; E == 0 -> Action = [exit|Szuk1], szukites1(L, Szuk1)
; E == Len -> Action = [exit|Szuk2], szukites2(L, Szuk2)
; Actions = []
).
% filter(L): Az L lista első 2 vagy 3 elemében nincs 1edül álló 1es.
filter([A,B,C|L0]) :-
( number(A), number(B), number(C) ->
\+ ( A == 0, B == 1, C == 0 ),
\+ ( A == 1, B == 0 )
; number(A), number(B) ->
\+ ( A == 1, B == 0 )
; true
),
filter1([B,C|L0]).
% filter1(L): Az L lista további elemeiben sincs 1edül álló 1es.
filter1([A,B,C|L0]) :-
( number(A), number(B) ,number(C) ->
( L0 == [] \+ ( A == 0, B == 1, C == 0 )
; \+ ( A == 0, B == 1, C == 0 ), filter1([B,C|L0])
)
; number(B), number(C), L0 == [] -> \+ ( B == 0, C == 1 )
; filter1([B,C|L0])
).
% ossz(L0, E0, L, E): Az L0 lista elemeinek összege E0, L lista pedig az L0
lista, kivéve a már konstans elemeket, E pedig L0 elemeinek összege.
ossz([], X, [], X).
ossz([X|L0], E0, L, E) :-
( number(X) -> E1 is E0 - X, L = L1
; E1 is E0, L = [X|L1]
),
ossz(L0, E1, L1, E).
% szukites1(L, Szuk): L lista minden elemét 0 értékre szűkítő korlátlista
Szuk.
szukites1([], []).
szukites1([X|L], [S|SL]) :-
fdset_singleton(Set, 0),
S = (X in_set Set),
szukites1(L, SL).
% szukites1(L, Szuk): L lista minden elemét 1 értékre szűkítő korlátlista
Szuk.
szukites2([], []).
szukites2([X|L], [S|SL]) :-
fdset_singleton(Set, 1),
S = (X in_set Set),
szukites1(L, SL).
-----------------------------------------------------------
Köszi!
Csaba