Answers to the Exercises

Answer 3.1

This does not really require to be answered. Just try it.

Answer 3.2

proc {Donald Root}
   sol(a:A b:B d:D e:E g:G l:L n:N  o:O r:R t:T) = Root
in 
   Root ::: 0#9
   {FD.distinct Root}
   D\=:0  R\=:0  G\=:0
      100000*+ 10000*+ 1000*+ 100*+ 10*+ D
   +  100000*+ 10000*+ 1000*+ 100*+ 10*+ D
   =: 100000*+ 10000*+ 1000*+ 100*+ 10*+ T
   {FD.distribute split Root}
end

Answer 7.1

The first redundant constraint follows from the fact that the total number of occurrences in the sequence is n, and that no numbers but those between 0 and n-1 occur in the sequence.

The second redundant constraint follows from the fact that

0\cdot x_0\;+\;\ldots\;+\;
(n-1)\cdot x_{n-1}
\;=\;
x_0\;+\;\ldots\;+\;x_{n-1}

Here is a parametrized script for the Magic Sequence Puzzle:

fun {MagicSequence N}
   Cs = {List.number ~1 N-2 1}
in 
   proc {$ S}
      {FD.tuple sequence N 0#N-1 S}
      {For 0 N-1 1  
       proc {$ I} {FD.exactly S.(I+1) S I} end}
      %% redundant constraints
      {FD.sum S '=:' N}
      {FD.sumC Cs S '=:' 0}
      %% 
      {FD.distribute ff S}
   end 
end

Answer 8.1

{FD.impl X<:Y  X+Y=:Z} = {FD.disj  X*Y=:Z  Z\=:5}

Answer 8.2

proc {Conj X Y Z}
   X::0#1  Y::0#1
   (X+Y=:2) = Z
end 
proc {Equi X Y Z}
   X::0#1  Y::0#1
   (X=:Y) = Z  
end 
proc {Nega X Z}
   X::0#1
   (X=:0) = Z   
end 
proc {Disj X Y Z}
   X::0#1  Y::0#1
   (X+Y>:0) = Z
end 
proc {Impl X Y Z}
   X::0#1  Y::0#1
   (Y-X>=:0) = Z
end

Answer 8.3

To minimize the value of Satisfaction, we modify the distributor for Satisfaction such that it tries smaller values first:

{FD.distribute generic(order:naive value:min) [Satisfaction]}

It turns out that the persons can be aligned such that no preference is satisfied.

Answer 8.4

local Aux in 
   {FD.decl Aux}
   {FD.distance Q.7 Q.'=:' Aux}
   {FD.element Q.7 [4 3 2 1 0] Aux}
end

Answer 8.5

thread 
   if A.type==B.type then  
      A.glass >=: B.glass
   end 
end

Answer 11.1

A possible solution is as follows.

proc {CapacityConstraints TasksOnRes Start Dur}
   {Record.forAll TasksOnRes
    proc {$ Ts}
       {ForAllTail Ts
        proc {$ T1|Tr}
           {ForAll Tr
            proc {$ T2}
               (Start.T1 + Dur.T1 =<: Start.T2) + 
               (Start.T2 + Dur.T2 =<: Start.T1) =: 1
            end}
        end}
    end}
end


Christian Schulte and Gert Smolka
Version 1.4.0 (20080702)