# [gecode-users] BoolExpr example

Malcolm Ryan malcolmr at cse.unsw.edu.au
Fri Nov 21 04:13:54 CET 2008

```So... some clarifying questions:

1) What's the difference between BoolVarArgs and BoolVarArray?

2) Could you explain in more detail what ~ does?

3) Likewise, what does tt() do?

4) Under exactly what conditions does post() create a BoolVar?

5) How's the documentation coming along?

Malcolm

On 20/11/2008, at 6:30 PM, Mikael Zayenz Lagerkvist wrote:

> On Thu, Nov 20, 2008 at 7:52 AM, Malcolm Ryan <malcolmr at cse.unsw.edu.au
> > wrote:
>> I'm not sure I understand that code. Would you mind explaining in
>> more
>> detail?
>
> First of all, the loops in the code looping through layers can be
> ignored for exposition, since they are there to handle the cases when
> cards are in the bottom, middle, or top of a pile of three cards.
> Assume that we have two piles of card (X1, X2, X3) and (Y1, Y2, Y3)
> where Xv and Xv are integer variables, and where X2 and Y2 have the
> same function for purposes of the game. The values of the cards
> represent when they are played (note that I mistranslated the
> condition in my earlier post, X1 and Y1 should be exchanged, as should
> X3 and Y3). Now the code can be simplified to
>  // cond is the condition for the symmetry
>   BoolVarArgs ba(4);
>   // Both cards played after the ones on top of them
>   ba[0] = post(this, ~(X2 < Y3));
>   ba[1] = post(this, ~(Y2 < X3));
>   // Both cards played before the ones under them
>   ba[2] = post(this, ~(Y1 < X2));
>   ba[3] = post(this, ~(X1 < Y2));
>   // Cond holds when all the above holds
>   BoolVar cond(this, 0, 1);
>   rel(this, BOT_AND, ba, cond);
>
>   // If cond is fulfilled, then we can order the cards
>   // cond -> (X2 < Y2)
>   post(this, tt(!cond || ~(X2 < Y2)));
>
> The ba-array holds a set Boolean variables for reified relations, and
> the rel-function takes the conjunction of these. The final post just
> uses the standard unfolding of an implication since there is no
> implication-operator. You can also use the implication-function
> together with post to get it:
>   post(this, tt(imp(cond, ~(X2 < Y2))));
>
>
>> How do you do reified constraints in Gecode?
>
> By using the reified post-functions, such as
>   rel(this, x, IRT_LE, y, b);
> with x and y integer variables and b a Boolean control variable. In
> MiniModel expressions, you can use the unary tilde-operator to reify
> an expression:
>   BoolVar b = post(this, ~(x < y));
>
> Cheers,
> Mikael
>
> --
> Mikael Zayenz Lagerkvist, http://www.ict.kth.se/~zayenz/

```