Strictly speaking, 'reify' is more expensive than 'if', but might
yield some propagation, and that's the whole point of constraint
programming. Actually, you do not have a space copy (Space.clone is
never called), just a plain nested space. Anyway, Torsten hit the
spot: it looks like you _really_ need to take a look at reified
constraints, if you haven't yet

Cheers,

Jorge.

2009/7/19 Torsten Anders <[email protected]>:
> Dear Mark,
>
> For applying constraints that depend on the truth value of other constraints
> you may also want to check out Oz' support for Constraint Combinators
> (http://www.mozart-oz.org/documentation/system/node44.html#chapter.combinator).
> Raphael already mentioned or. If you want to make constrainable whether some
> arbitrary Oz code is executed or not then Combinator.'reify' might be what
> you are looking for. However, it is less efficient than your plain if
> statement (it creates a space copy in the background). Here is a simple
> example (there is no example in the doc): B = 1 if X = Y, and B = 0 if X \=
> Y.
>
>  B = {Combinator.'reify' proc {$} X = Y end}
>
> Best
> Torsten
>
>
> On Jul 19, 2009, at 10:41 PM, mark richardson wrote:
>
>> Hi,
>>
>> Thanks for your reply.
>> I really, really wasn't expecting this sort of reply. I'm now in the
>> uncomfortable position of trying to decide exactly what I DO mean :+)
>>
>> To put the problem into a clearer perspective, it concerns 3 variables A,B
>> and C.
>> A is a FD integer which represents a virtual actor, B is a FS which
>> represents one or more other virtual actors.
>> C is a FD integer which represents an interaction which is possible
>> between virtual actors depending upon characteristics of those agents.
>> At the moment I'm using the format:
>>
>> thread
>>    if C==x then
>>       <post constraints on A and B to match interaction x>
>>    end
>> end
>>
>> My thought was that I could possibly make speed improvements on this by
>> replacing the 'if' statement with something which would cause the thread to
>> fail sooner - namely the (C==x)=true idea.
>>
>> Now I'm struggling to decide if saying something completely different
>> semantically by doing this will fundamentally alter the function of my
>> program or even whether I'm structuring my problem logic correctly in the
>> first place.
>> I think some more thought on this might be in order :+)
>>
>> Regards
>>
>> Mark
>>
>>
>> Raphael Collet wrote:
>>>
>>> Dear Mark,
>>>
>>> Your two threads simply implement different semantics!  See below:
>>>
>>> On Sun, Jul 19, 2009 at 10:05 PM, mark richardson
>>> <[email protected]> wrote:
>>> Hi,
>>>
>>> I have a constraint based problem that implements constraints as
>>> explicitly defined threads. An if statement guards whether the constraint is
>>> imposed or not. For example one of the constraints could be something like:
>>>
>>> thread
>>>  if B==2 then
>>>     <post some constraint>
>>>  end
>>> end
>>>
>>> This threads tries to enforce the logic statement (B==2 and <constraint>)
>>> or (B\=2).  If B is different from 2, the logic statement is equivalent to
>>> 'true'.
>>>
>>> My program isn't as simple as this and there IS a good reason why I'm
>>> doing things this way :+), but it demonstrates the basic idea.
>>>
>>> My question is this (although I can't think of a simplified example to
>>> test it with); would the above code block prove more efficient like this:
>>>
>>> thread
>>>  (B==2)=true
>>>  <post some constraint>
>>> end
>>>
>>> This second threads enforces the logic statement (B==2 and <constraint>).
>>>  In this case, if B is different from 2, the logic statement is equivalent
>>> to 'false'.  Therefore both threads are not equivalent from a logic point of
>>> view.
>>>
>>> Here I'm assuming this thread would signal failure whenever B was not 2
>>> and subsequently fail the space it was in.
>>> In other words, are there any efficiency gains to be made by using
>>> failure as a guard for the constraint rather than a logic conditional
>>> statement? (Obviously I'm talking about a very large number of calls to this
>>> thread.)
>>>
>>> The first question is: which of the two logic statements correspond to
>>> the problem?
>>>
>>> For the first semantics, it is possible to use an 'or' statement, and let
>>> the posted constraint be evaluated in a subspace.
>>>
>>> or B=2 <post some constraint>
>>> [] B\=:2
>>> end
>>>
>>> If the posted constraint fails, the 'or' statement will automatically
>>> enforce the remaining clause, i.e., B\=2.  Note that this technique should
>>> be used with care, because it creates more computation spaces, but it can
>>> pay off if the posted constraint is likely to fail...
>>>
>>> Cheers,
>>> raph
>>>
>
>
> --
> Torsten Anders
> Interdisciplinary Centre for Computer Music Research
> University of Plymouth
> Office: +44-1752-586219
> Private: +44-1752-558917
> http://strasheela.sourceforge.net
> http://www.torsten-anders.de
>
> _________________________________________________________________________________
> mozart-users mailing list
> [email protected]
> http://www.mozart-oz.org/mailman/listinfo/mozart-users
>
_________________________________________________________________________________
mozart-users mailing list                               
[email protected]
http://www.mozart-oz.org/mailman/listinfo/mozart-users

Reply via email to