Dear Joshua,

There are a number of problems with your example.

- You never call a solver
- You don't encapsulate your CSP in a script (your proc Dinner is not a script!)
- You post constraints after calling FD.distribute
...

You may want to read the Finite Domain Constraint Programming tutorial first (you are actually citing it, so I wonder..).

I also suggest first trying something out in the OPI before writing an application.

Best,
Torsten


On 20.04.2007, at 17:50, Joshua ben Jore wrote:

I am having difficulty writing a very simple little constraint
program. When I use FD.distribute my program stops. When I manually
set values that haven't been completely constrained yet, I get invalid
results (unless I *reassert* a constraint).

I'm certain I'm doing something wrong.

{Dinner 20} returns the following where I expect a tuple of unique
values. This is just ordering the numbers 1..20 by the rules in the
solver.

dinner(_{1#19} _{2#19} _{3#19} _{4#19} _{5#19} _{6#19} _{7#19} _{8#19}
_{9#19} _{10#19} _{11#19} _{12#20} _{1#20} _{1#20} _{1#20}
_{1#20} 1 _{1#19} _{2#20} _{1#20})

If I use FD.distribute then my solver's execution stops. Wha? I don't
much care *how* it picks solutions, I just want it to pick some
solutions.

If I try to set all variables to their minimum, I get this invalid
result. I *hoped* that the range for each variable would adjust as I
modified other variables they were constrained against. I don't see
why I have a pile of values all '2'.

dinner(2 3 4 5 6 7 8 9 10 11 12 13 2 2 2 2 1 2 3 2)

If I use that previous loop but reassert FD.distinct then it actually
finds a solution. Huh? Didn't I already assert FD.distinct? Why should
I have to reassert it? Did it forget?

Any help understanding my problem would be most appreciated. I have
read http://www.mozart-oz.org/documentation/fdt/node52.html but don't
see an immediate application. All my domains are finite and specified
- they're just not getting solved.

Thanks in advance,
Josh.

%% Example program follows:
functor
import
  Application
  System
  FD
  Property
  Browser
define
  proc {LeftOf X Y}
     X <: Y
  end
  proc {ImmediatelyLeft X Y}
     X =: Y - 1
  end
  proc {Dinner NumGuests Guests}
     {FD.tuple dinner NumGuests 1#NumGuests Guests}
     {FD.distinct Guests}

     %% Guests 1 to 12 sit left of each other with people possibly
     %% between them.
     for L in 1..11 do
         R
     in
         R = L + 1
         {LeftOf Guests.L Guests.R}
     end

     %% 17th guest is in seat 1
     Guests.17 =: 1

     %% 18 is immediately to the left of 19.
     {ImmediatelyLeft Guests.18 Guests.19}
  end
  Sol
in
  {Property.put 'print.width' 100}
  {Dinner 20 Sol}
  {Browser.browse Sol}
  {System.show Sol}

  %%% Appears to begin waiting for something. What?
  %%{FD.distribute ff Sol}

  %%% Also appears to wait for something.
  %% {FD.assign min Sol}

  %% Produces invalid results?! At least it finishes. I'm *Sure
  for I in 1..20 do
     Min Max
  in
     %% More than one possible solution for this variable?
     Min = {FD.reflect.min Sol.I}
     Max = {FD.reflect.max Sol.I}
     if Min \= Max then
         Sol.I = Min
         %% Works if I reassert this.
         {FD.distinct Sol}
     end
  end

  {System.show Sol}
  {Application.exit 0}
end
_______________________________________________________________________ __________ mozart-users mailing list [email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users


--
Torsten Anders
Sonic Arts Research Centre • Queen's University Belfast
Frankstr. 49 • D-50996 Köln
Tel: +49-221-3980750
http://strasheela.sourceforge.net
http://www.torsten-anders.de

_________________________________________________________________________________
mozart-users mailing list                               
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users

Reply via email to