bug-prolog
[Top][All Lists]

## Re: failure to post arithmetic constraint

 From: Bowie Owens Subject: Re: failure to post arithmetic constraint Date: Wed, 6 Feb 2002 09:27:11 +1100 User-agent: Mutt/1.2.5i

```Hi Daniel,

I see what you are saying. The problem is that having bounds for A and
X before posting A * X #= Y is not always convenient. I am thinking of
the case where bounds on A and Y are known, from these bounds for X can
be derived.  What if you change line 457 of BipsFD/fd_math_fd.fd to:

start Z in min(X)*min(Y) ..
ite(max(X)<max_integer/<max(Y), max(X)*max(Y), max_integer)

Assuming I have the syntax right then this should only perform max(X)
* max(Y) if it will not overflow, otherwise it uses max_integer.
Recompiling with this change seems to have the desired effect.

| ?- A * X #= Y.

A = _#3(0..268435455)
X = _#22(0..268435455)
Y = _#41(0..268435455)

yes

Putting the above change in context makes the xy_eq_z function:

xy_eq_z(fdv X,fdv Y,fdv Z)

{
start X in ite(max(Y)==0,0,min(Z)/>max(Y)) ..
ite(min(Y)==0,max_integer,max(Z)/<min(Y))
start Y in ite(max(X)==0,0,min(Z)/>max(X)) ..
ite(min(X)==0,max_integer,max(Z)/<min(X))
start Z in min(X)*min(Y) ..
ite(max(X)<max_integer/<max(Y),max(X)*max(Y),max_integer)
}

On Tue, Feb 05, 2002 at 07:28:19PM +0100, Daniel Diaz wrote:
> Hi Bowie,
>
> you have to define the (relative small) domains of your variables before
> settings constraints. In
> particular non-linear constraints. In A*X #= Y the max of Y is max(X) *
> max(A) which leads to an
> overflow on our integers. Recall that FD are for (small) finite domains...
> :-))
>
> Bowie Owens wrote:
> >
> > Hi,
> >
> > I am having difficulty posting some simple arithmetic constraints in
> > GNU Prolog 1.2.8 (and 1.2.9) under x86 Linux. The problems come from
> > the multiplication of otherwise unconstrained variables. There does seem
> > to be some interaction with the vector representation of variables. As
> > using full AC equality forces use of the vector representation when I
> > would not expect it to do so.
> >
> > | ?- A * X  #= Y.
> >
> > no
> > | ?-  A+X #=< 127, A * X  #= Y.
> >
> > A = _#22(0..127)
> > X = _#41(0..127)
> > Y = _#86(0..16129)
> >
> > yes
> > | ?- A+X #>= 127, A * X  #= Y.
> >
> > no
> > | ?- A * X  #=# Y.
> >
> > A = _#3(0..268435455)
> > X = _#22(0..268435455)
> > Y = _#41(0..127@)
> >
> > yes
> > | ?- A+X #>= 127, A * X  #=# Y.
> >
> > A = _#22(0..268435455)
> > X = _#41(0..268435455)
> > Y = _#86(0..127@)
> >
> > yes
> > | ?- A+X #=< 127, A * X  #=# Y.
> >
> > A = _#22(0..127)
> > X = _#41(0..127)
> > Y = _#86(0..127)
> >
> > yes
> >
> > -- Bowie Owens
> >
> > CSIRO Mathematical & Information Sciences
> > phone : +61 3 9545 8055
> >
> > _______________________________________________
> > Bug-prolog mailing list
> > http://mail.gnu.org/mailman/listinfo/bug-prolog
>
> --
> http://pauillac.inria.fr/~diaz
> gprolog --version 2>&1 | sed -n -e 's/By //p'
>
-- Bowie Owens

CSIRO Mathematical & Information Sciences
phone : +61 3 9545 8055