Next: LockingDaughters, Previous: LinkingNotMother, Up: Principles list
principle.linkingSisters
D1, D2, D3
Which: set(label(D1))
Which: ^.D3.entry.which
LinkingSisters (priority 100)
This principle assumes that the Graph principle (Graph) is used
on dimensions D1 and D2.
This principle is from the family of linking principles.
The constraint for all edges from v to v' labeled
l on D1 is:
Which, then there must
be another node v”, being the mother of both v and
v' on D2, i.e. v and v' must be sisters on
D2
Here is the definition of the LinkingSisters constraint
functor:
%% Copyright 2001-2008
%% by Ralph Debusmann <rade@ps.uni-sb.de> (Saarland University) and
%% Denys Duchier <duchier@ps.uni-sb.de> (LIFO, Orleans) and
%% Jorge Marques Pelizzoni <jpeliz@icmc.usp.br> (ICMC, Sao Paulo) and
%% Jochen Setz <info@jochensetz.de> (Saarland University)
%%
functor
import
% System(show)
Helpers(checkModel) at 'Helpers.ozf'
Opti(isIn) at 'Opti.ozf'
export
Constraint
define
proc {Constraint Nodes G Principle FD FS Select}
DVA2DIDA = Principle.dVA2DIDA
ArgRecProc = Principle.argRecProc
%%
D1DIDA = {DVA2DIDA 'D1'}
D2DIDA = {DVA2DIDA 'D2'}
D2DIDALabelLat = G.dIDA2LabelLat
D1LabelLat = {D2DIDALabelLat D1DIDA}
D1LAs = D1LabelLat.constants
in
if {Helpers.checkModel 'LinkingSisters.oz' Nodes
[D1DIDA#daughtersL
D2DIDA#mothers]} then
for Node1 in Nodes do
for Node2 in Nodes do
for LA in D1LAs do
if {Not {Opti.isIn Node2.index Node1.D1DIDA.model.daughtersL.LA}=='out'} then
%% Linking Sisters
%%
%% m -l->1 d =>
%% l in Which(m) => exists m' in V: m' ->2 m and m' ->2 d
LI = {D1LabelLat.aI2I LA}
WhichM = {ArgRecProc 'Which' o('^': Node1)}
D2MothersM = {FS.intersect
Node1.D2DIDA.model.mothers
Node2.D2DIDA.model.mothers}
in
{FD.impl
{FS.reified.include Node2.index Node1.D1DIDA.model.daughtersL.LA}
{FD.impl
{FS.reified.include LI WhichM}
{FD.reified.greater {FS.card D2MothersM} 0}} 1}
end
end
end
end
end
end
end