users-prolog
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: FD constraints - strange behavior


From: Daniel Diaz
Subject: Re: FD constraints - strange behavior
Date: Wed, 19 Dec 2007 11:13:07 +0100
User-agent: Thunderbird 2.0.0.9 (Windows/20071031)

Hi, Fred

Hello,

Using Gnu-Prolog up to 1.3.0, I'm facing something strange (might be a bug ?) illustrated in the predicates below. Why on earth doesn't v1(_) find the solution ? Defining a new variable for the subexpression (C+30) seems to help Gnu-Prolog...

It could be related to an overflow problem, but It would be surprising : we are far below max_integer. It does not seem to be related to the "FD sparse representation" pitfall (setting fd_set_vector_max to a big value has no effect).

Thanks in advance.

-----------
Execution :
-----------

| ?- v1(Res).
     no
| ?- v2(Res).
     Res = [9,7]
     yes
| ?- v3(Res).
     Res = [9,7]
     yes

-----------
Listing :
-----------

v1(Ls) :-
        Ls = [C,G],
        fd_domain(C, 8, 9), fd_domain(G, 7, 8),
        780 + 52*(C+30) + 12*G*(C+30) #= 156*(C+30),
        fd_labelingff(Ls).
v2(Ls) :-
        Ls = [C,G],
        fd_domain(C, 8, 9), fd_domain(G, 7, 8),
        C30#=30+C, % replacing _expression_ in v1
        780 + 52*(C30) + 12*G*(C30) #= 156*(C30),
        fd_labelingff(Ls).
v3(Ls) :-
        Ls = [C,G],
        fd_domain(C, 8, 9), fd_domain(G, 7, 8),
        C#=9,  % adding a constraint to v1
        780 + 52*(C+30) + 12*G*(C+30) #= 156*(C+30),
        fd_labelingff(Ls).
--------------------------------------------------

thank you for report.
it is due to how big expressions are split into simpler ones. This is done with new brand intermediate variables whose initial domain is 0..max_int. When 2 of these variables are multiplied (non-linearity) an overflow occurs and resulting in an empty domain (max < min). This is clearly a behavior we don"t want. I add it to my TODO list. A workaround consists in splitting by hand the _expression_ (as you did).


By the way, my original code (for a CLP problem taken from a book) showing the "bug" was :

fractions1(Ls) :-
        Ls = [A,B,C,D,E,F,G,H,I],
        fd_domain(Ls, 1, 9),
        fd_all_different(Ls),
        BC #= 10*B+C, EF #= 10*E+F, HI #= 10*H+I,
        A*EF*HI + D*BC*HI + G*BC*EF #= BC*EF*HI,
        fd_labelingff(Ls).



Strange, I have no problem with this one !

| ?- fractions1(Ls).

Ls = [5,3,4,7,6,8,9,1,2] ? ;

Ls = [5,3,4,9,1,2,7,6,8] ? ;

Ls = [7,6,8,5,3,4,9,1,2] ? ;

Ls = [7,6,8,9,1,2,5,3,4] ? ;

Ls = [9,1,2,5,3,4,7,6,8] ? ;

Ls = [9,1,2,7,6,8,5,3,4] ? ;

(140 ms) no



reply via email to

[Prev in Thread] Current Thread [Next in Thread]