Hi Jorge,

here is some more code demonstrating the bug in FS.reified.include that you have found:

proc {Test Sol}
   M = {FS.value.make [1 2 3]}
   D = {FS.reified.include 64 M}
in
   Sol = D
end
Sols = {Search.base.all Test}
{Inspect Sols}

Feeding this code does not determine the elements of Sols, but returns

['_'{0#1}]

in the Inspector. When I replace the 64 with 63 in

D = {FS.reified.include 64 M}

Sols does get determined and bound to:

[0]

I do recall that the Mozart FS constraints, when they were first implemented in the 90s, only worked with values up to 63 - higher values were introduced later, and there were a number of bugs at the beginning and much trouble.

Now, I guess, Mozart still works with two internal representations for sets containing values up to 63 (using bitstrings when I recall correctly) and sets containing higher values. So the above bug can be "explained" as follows: when a set with values <64 gets determined, its representation is changed to bitstrings. Then the call to FS.reified.include ensues where it is checked whether a number >63 is included in the set M which can (because of its representation) only contain values up to 63, and here some kind of clash occurs.

One could fix this by replacing FS.reified.include by the following code:

fun {ReifiedInclude D M}
   D1 = {FD.int 0#1}
in
   thread
      or {FS.include D M}
         D1=1
      [] {FS.exclude D M}
         D1=0
      end
   end
   D1
end

Since FS.include and FS.exclude seem as if they do not have the same bug as FS.reified.include. However, I sincerely think that someone should check the Mozart constraint system and fix the bugs within Mozart. Especially since I have the uneasy feeling that there may be more bugs like this still hidden in the Mozart constraint engine...

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

Reply via email to