Constraint Programming – Filtering : Part 2 –
Christophe Lecoutre [email protected]
CRIL-CNRS UMR 8188 Universite d’Artois
Lens, France
January 2021
Outline
1 Tables and MDDs
2 Specific Algorithms for Table Constraints
3 Compact Table
4 Local Consistencies
Outline
1 Tables and MDDs
2 Specific Algorithms for Table Constraints
3 Compact Table
4 Local Consistencies
Recall
CP is about:
1 modeling constrained combinatorial problems under the form of constraint networks (CSPs / COPs)
2 solving such problems by employing inference methods and search strategies
Classically, we use:
• backtrack search
• while maintaining AC (Arc Consistency) at each node
For enforcing AC, all constraints are sollicited in turn for filtering domains (principle called constraint propagation).
It is possible to:
• use a generic propagation scheme, like AC3
• or implement specialized filtering algorithms, one forallDifferent,
Table Constraints
Classically, for constraints defined in extension, we useordinarytables that contain ordinary tuples, as e.g., (a,b,a).
But, many recent developments concern:
• starred (or short) tables, containing the symbol *, as e.g., (a,∗,b)
• smarttables, a form of hybridization between intensional and extensional constraints
• MDDs (Multi-Valued Decision Diagrams)
Remark.
These different forms are useful when modeling.
Remark.
We need filtering algorithms for both positive and negative forms (tables).
Table Constraints
Classically, for constraints defined in extension, we useordinarytables that contain ordinary tuples, as e.g., (a,b,a).
But, many recent developments concern:
• starred (or short) tables, containing the symbol *, as e.g., (a,∗,b)
• smarttables, a form of hybridization between intensional and extensional constraints
• MDDs (Multi-Valued Decision Diagrams)
Remark.
These different forms are useful when modeling.
Remark.
We need filtering algorithms for both positive and negative forms (tables).
Table Constraints
Classically, for constraints defined in extension, we useordinarytables that contain ordinary tuples, as e.g., (a,b,a).
But, many recent developments concern:
• starred (or short) tables, containing the symbol *, as e.g., (a,∗,b)
• smarttables, a form of hybridization between intensional and extensional constraints
• MDDs (Multi-Valued Decision Diagrams)
Remark.
These different forms are useful when modeling.
Remark.
We need filtering algorithms for both positive and negative forms (tables).
Starred Tables
Introduction of wildcard symbols (*) in tables (Nightingaleet al., 2013) The constraintx=y∨y =z can be defined by:
x y z
a a ∗
b b ∗
c c ∗
∗ a a
∗ b b
∗ c c
The global constraintelement(I,hx1,x2, . . . ,xmi,R) can be defined by:
I x1 x2 . . . xr R
1 a ∗ . . . ∗ a
1 b ∗ . . . ∗ b
. . . . . . . . . . . . . . . . . .
2 ∗ a . . . ∗ a
Starred Tables
Introduction of wildcard symbols (*) in tables (Nightingaleet al., 2013) The constraintx=y∨y =z can be defined by:
x y z
a a ∗
b b ∗
c c ∗
∗ a a
∗ b b
∗ c c
The global constraintelement(I,hx1,x2, . . . ,xmi,R) can be defined by:
I x1 x2 . . . xr R
1 a ∗ . . . ∗ a
1 b ∗ . . . ∗ b
. . . . . . . . . . . . . . . . . .
2 ∗ a . . . ∗ a
Starred Tables
Introduction of wildcard symbols (*) in tables (Nightingaleet al., 2013) The constraintx=y∨y =z can be defined by:
x y z
a a ∗
b b ∗
c c ∗
∗ a a
∗ b b
∗ c c
The global constraintelement(I,hx1,x2, . . . ,xmi,R) can be defined by:
I x1 x2 . . . xr R
1 a ∗ . . . ∗ a
1 b ∗ . . . ∗ b
. . . . . . . . . . . . . . . . . .
2 ∗ a . . . ∗ a
Smart Tables
Introduction of elementary constraints in tables (Mairyet al., 2015) The constraintx=y∨y =z can be defined by:
x y z
=y ∗ ∗
∗ =z ∗
The global constraintelement(I,hx1,x2, . . . ,xmi,R) can be defined by:
I x1 x2 . . . xm R
1 ∗ ∗ . . . ∗ =x1
2 ∗ ∗ . . . ∗ =x2
. . . . . . . . . . . . . . . . . .
m ∗ ∗ . . . ∗ =xm
Smart Tables
Introduction of elementary constraints in tables (Mairyet al., 2015) The constraintx=y∨y =z can be defined by:
x y z
=y ∗ ∗
∗ =z ∗
The global constraintelement(I,hx1,x2, . . . ,xmi,R) can be defined by:
I x1 x2 . . . xm R
1 ∗ ∗ . . . ∗ =x1
2 ∗ ∗ . . . ∗ =x2
. . . . . . . . . . . . . . . . . .
m ∗ ∗ . . . ∗ =xm
Smart Tables
Introduction of elementary constraints in tables (Mairyet al., 2015) The constraintx=y∨y =z can be defined by:
x y z
=y ∗ ∗
∗ =z ∗
The global constraintelement(I,hx1,x2, . . . ,xmi,R) can be defined by:
I x1 x2 . . . xm R
1 ∗ ∗ . . . ∗ =x1
2 ∗ ∗ . . . ∗ =x2
. . . . . . . . . . . . . . . . . .
m ∗ ∗ . . . ∗ =xm
Tables vs MDDs
Multi-valued Decision Diagrams allow us to share prefixes and suffixes.
hx,y,zi ∈T T a a a a a b a b b b a a b a b b b c b c a c a a
t
1 2 3 4 level
a a
c b
b c
bc
b a c a
b a
b a
y z x
Bin Packing
We are given:
• a pool of similar bins (with a specified capacity)
• a set of items, each of them with a specified weight The problem is:
• to put all items in the available bins
• while minimizing the number of necessary bins
Data for BinPacking
Data are stored in a JSON file:
{
" n B i n s ":40 ,
" b i n C a p a c i t y ":100 ,
" i t e m W e i g h t s ":[30 ,31 ,31 ,32 ,34 ,35 ,35 ,40 ,40 ,40 ,41 ,41 ,...]
}
ThePyCSP3 model given in the next slide requires two auxiliary functions (not shown here):
• max items per bin()
• occ of weights()
Remark.
The operator + defined on dictionaries is aPyCSP3extension.
Model for BinPacking
f r o m p y c s p 3 i m p o r t *
nBins , c a p a c i t y , w e i g h t s = d a t a n I t e m s = len ( w e i g h t s )
m a x P e r B i n = m a x _ i t e m s _ p e r _ b i n ()
# x [ i ][ j ] is the w e i g h t of the jth o b j e c t put in the ith bin . x = V a r A r r a y (s i z e=[ nBins , m a x P e r B i n ] , dom={0 , * w e i g h t s }) s a t i s f y(
# not e x c e e d i n g the c a p a c i t y of e a c h bin [ Sum ( x [ i ]) <= c a p a c i t y for i in r a n g e ( n B i n s )] ,
# i t e m s are s t o r e d d e c r e a s i n g l y a c c o r d i n g to t h e i r w e i g h t s [ D e c r e a s i n g ( x [ i ]) for i in r a n g e ( n B i n s )] ,
# e n s u r i n g t h a t e a c h i t e m is s t o r e d in a bin
C a r d i n a l i t y ( x , o c c u r r e n c e s= { 0 : n B i n s * m a x P e r B i n - n I t e m s } + { wgt : occ for ( wgt , occ ) in o c c _ o f _ w e i g h t s ( ) } ) )
m a x i m i z e(
# m a x i m i z i n g the n u m b e r of u n u s e d b i n s Sum ( x [ i ] [ 0 ] == 0 for i in r a n g e ( n B i n s ))
Using Tables or MDDs
Can a pair of constraints defined on similar scopes (from a giveni):
Sum ( x [ i ]) <= c a p a c i t y D e c r e a s i n g ( x [ i ])
be translated into :
• a table constraint
• or an MDD constraint
?
Answer: Yes
Example.
InstanceBinPacking-sw100-00
• 18 tables with 2,747,755 tuples
• 18 MDDs with 1,554 nodes
Using Tables or MDDs
Can a pair of constraints defined on similar scopes (from a giveni):
Sum ( x [ i ]) <= c a p a c i t y D e c r e a s i n g ( x [ i ])
be translated into :
• a table constraint
• or an MDD constraint
?
Answer: Yes
Example.
InstanceBinPacking-sw100-00
• 18 tables with 2,747,755 tuples
• 18 MDDs with 1,554 nodes
Using Tables or MDDs
Can a pair of constraints defined on similar scopes (from a giveni):
Sum ( x [ i ]) <= c a p a c i t y D e c r e a s i n g ( x [ i ])
be translated into :
• a table constraint
• or an MDD constraint
?
Answer: Yes
Example.
InstanceBinPacking-sw100-00
• 18 tables with 2,747,755 tuples
• 18 MDDs with 1,554 nodes
Outline
1 Tables and MDDs
2 Specific Algorithms for Table Constraints
3 Compact Table
4 Local Consistencies
Recall: Table Constraints
Often, a constraintextensionis called a table constraint, especially when it is non-binary.
A table constraint is then simply a constraint defined in extension. And is is said to be:
• positive if allowed tuples are given
• negativeif forbidden tuples are given
Remark.
We turn to specific algorithms for efficiency reasons.
Recall: Table Constraints
Often, a constraintextensionis called a table constraint, especially when it is non-binary.
A table constraint is then simply a constraint defined in extension. And is is said to be:
• positive if allowed tuples are given
• negativeif forbidden tuples are given
Remark.
We turn to specific algorithms for efficiency reasons.
Recall: Table Constraints
Often, a constraintextensionis called a table constraint, especially when it is non-binary.
A table constraint is then simply a constraint defined in extension. And is is said to be:
• positive if allowed tuples are given
• negativeif forbidden tuples are given
Remark.
We turn to specific algorithms for efficiency reasons.
Algorithms for Table Constraints
Many schemes/algorithms proposed in the literature:
• AC-valid (Bessiere & R´egin, 1997)
• AC-allowed (Bessiere & R´egin, 1997)
• AC-valid+allowed (Lecoutre & Szymanek, 2006)
• NextIn Indexing (Lhomme & R´egin, 2005)
• NextDiff Indexing (Gentet al., 2007)
• Tries (Gentet al., 2007)
• Compressed Tables (Katsirelos & Walsh, 2007)
• MDDs (Cheng & Yap, 2010)
• STR1 (Ullmann, 2007)
• STR2 (Lecoutre, 2008)
• STR3 (Lecoutreet al., 2012)
• AC5-TCOpt (Mairyet al., 2012)
• AC4R and MDD4R (Perez & R´egin, 2014)
Classical Schemes
Basic Schemes:
• AC-allowed: iterating over the list of allowed tuples
• AC-valid: iterating over the list of valid tuples
• AC-valid+allowed: visiting both lists
There existr-ary positive table constraints such that, for some current domains of variables,
• applying AC-allowed isO(2r−1).
• applying AC-valid is O(2r−1).
• applying AC-valid+allowed is O(r2)
Classical Schemes
Basic Schemes:
• AC-allowed: iterating over the list of allowed tuples
• AC-valid: iterating over the list of valid tuples
• AC-valid+allowed: visiting both lists
There existr-ary positive table constraints such that, for some current domains of variables,
• applying AC-allowed isO(2r−1).
• applying AC-valid is O(2r−1).
• applying AC-valid+allowed is O(r2)
Simple Tabular Reduction (STR)
The previous schemes proceedgradually: a support is sought for each value in turn: (x,a), (x,b), (x,c),. . .
Other (more recent) schemes proceedglobally: AC is enforced by traversing (once) the structure of the constraint. For example :
• STR
• MDDc
Constraint filtering/propagation aims at pruning the search space. STR (Simple Tabular Reduction) prunes both:
• the tables
• and the domains
Simple Tabular Reduction (STR)
The previous schemes proceedgradually: a support is sought for each value in turn: (x,a), (x,b), (x,c),. . .
Other (more recent) schemes proceedglobally: AC is enforced by traversing (once) the structure of the constraint. For example :
• STR
• MDDc
Constraint filtering/propagation aims at pruning the search space. STR (Simple Tabular Reduction) prunes both:
• the tables
• and the domains
Simple Tabular Reduction
Simple Tabular Reduction (STR)
• principle: dynamically maintaining tables (only keeping supports)
• efficiency obtained by using a sparse set data structure Versions of STR:
• STR(1) (Ullmann, 2007)
• STR2 (Lecoutre, 2008)
• STR3 (Lecoutreet al., 2012) Complexity:
1
t
x1x2x3 . . . xr
1
x1x2x3 . . . xr
t
Data Structures
For each constraintc, we just need a few structures:
• table[c] the current table containing the current supports ofc. It can be advantageously implemented by a sparse set (shown later).
• for each variable x,gacValues[x] is the set containing the values in the domain of x that are (generalized) arc-consistent onc.
Algorithm 1:STR(c: Constraint) foreachvariable x ∈scp(c)do
gacValues[x]← ∅
foreachtupleτ∈table[c] do ifisValid(c, τ)then
foreachvariable x ∈scp(c)do if τ[x]∈/ gacValues[x] then addτ[x] togacValues[x] else
removeTuple(c, τ) // domains are now updated foreachvariable x ∈scp(c)do
dom(x)←gacValues[x]
Illustration of STR
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b) (a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={} gacV alues[y] ={} gacV alues[z] ={}
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
Illustration of STR
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b) (a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={} gacV alues[y] ={} gacV alues[z] ={}
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
Illustration of STR
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b) (a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={}
gacV alues[y] ={}
gacV alues[z] ={}
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
Illustration of STR
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b) (a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={} gacV alues[y] ={} gacV alues[z] ={}
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
Illustration of STR
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b) (a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={} gacV alues[y] ={} gacV alues[z] ={}
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
Illustration of STR
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b) (a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={} gacV alues[y] ={} gacV alues[z] ={}
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
Illustration of STR
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b) (a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b) (a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={} gacV alues[y] ={} gacV alues[z] ={}
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a} gacV alues[z] ={c}
√
(a,,b)
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c} gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√
(,,)
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√
a
b
a
b
a
b
table[cxyz] x y z
(a,a,)
(b,a,a)
(b,b,)
(,a,b)
gacV alues[x] ={a, c}
(,,)
gacV alues[y] ={a, c} gacV alues[z] ={b, c}
√
(a,,b)
√
dom (x)
dom (y)
dom (z)
(a,b,a)
√√