Dear Lyle,
NOTE: the equality constraint is =:, which := is the assignment operator!
> how does it get translated into functions?
As far as I know, this syntax translation is not well documented (one of the
rare cases of missing docs in Oz).
However, by forcing a failure the compiler tells us how this syntax is
translated.
declare
[A B] = {FD.list 2 1#100}
A+B =: 0
%***************************** failure **************************
%**
%** In statement: {FDP.sum A{1#100}#B{1#100} '=:' 0}
%**
FDP.sum is FD.sum, if I remember correctly from reading the sources once.
> Anyway, it turns out that I can't use 711*1000000 on the RHS because it is
> pre-reduced to a constant that is too large to be used in an FD constraint.
> But when I wrote:
>
> Item1*Item2*Item3*Item4 =: S*1000000
>
> it worked fine. What is that getting translated to? There doesn't seem to be
> an FD.mulC that takes an arbitrary number of arguments, so it seems to
> require temporary variables, yet it works.
If I remember correctly, propagators can work with larger numbers internally,
but no FD int (including plain ints) can be larger than FD.sup.
> if [A B C]::1###1000, and V is unbound, then:
>
> A+B+C =: V
>
> should be enough for Oz to determine that V must be an FD variable with a
> range from 3 to 3000.
The following code reduces C as expected.
declare
[A B] = {FD.list 2 1#100}
C = {FD.decl}
A+B =: C
Best,
Torste
On 11 Jul 2011, at 20:28, Lyle Kopnicky wrote:
> Thanks, Peter and Torsten. Is there documentation of how Oz transforms
> constraint expressions using operators into calls to FD functions? At the
> moment it's a bit of a mystery to me.
>
> I had suspected that about the temporary variables. I wasn't sure whether the
> expression parser was smart enough to turn them into FD variables or not.
> Though this issue came up a lot more in the SEND+MORE=MONEY generalization
> problem.
>
> If I write the following constraint, where A, B, C, D and E have already been
> declared as FD variables, how does it get translated into functions?
>
> A+B+C := D+E
>
> I guess it can't be {FD.Sum [A B C] ':='} = {FD.Sum [D E] ':='}, because that
> would create a temporary, non-FD variable. So does it translate as {FD.SumC
> [1 1 1 ~1 ~1] [A B C D E] ':=' 0}? Or does it not try to translate it at all?
>
> Anyway, it turns out that I can't use 711*1000000 on the RHS because it is
> pre-reduced to a constant that is too large to be used in an FD constraint.
> But when I wrote:
>
> Item1*Item2*Item3*Item4 =: S*1000000
>
> it worked fine. What is that getting translated to? There doesn't seem to be
> an FD.mulC that takes an arbitrary number of arguments, so it seems to
> require temporary variables, yet it works.
>
> Also, it seems to me that temporary variables could, in some cases at least,
> be automatically range-determined. E.g., if [A B C]::1###1000, and V is
> unbound, then:
>
> A+B+C =: V
>
> should be enough for Oz to determine that V must be an FD variable with a
> range from 3 to 3000. I think it would get more difficult to determine in
> arbitrarily complex equations, though.
>
> - Lyle
> _________________________________________________________________________________
> mozart-users mailing list
> [email protected]
> http://www.mozart-oz.org/mailman/listinfo/mozart-users
Best wishes,
Torsten
--
Dr Torsten Anders
Course Leader, Music Technology
University of Bedfordshire
Park Square, Room A315
http://strasheela.sourceforge.net
http://www.torsten-anders.de
_________________________________________________________________________________
mozart-users mailing list
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users