Next: LinkingBelow1or2Start, Previous: LinkingAboveStartEnd, Up: Principles list
principle.linkingBelow
D1, D2, D3
Which: set(label(D1))
Which: ^.D3.entry.which
LinkingBelow (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 v' must be below
v on D2
Which specifies that the daughter v' of v
on D1 can be found below v on D2. In other words,
Which specifies the direction of the path from v to
v' on D2.
Here is the definition of the LinkingBelow 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 'LinkingBelow.oz' Nodes
[D1DIDA#daughtersL
D2DIDA#down]} 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
%% LinkingBelow
%%
%% m -l->1 d =>
%% l in Which =>
%% m ->+2 d
LI = {D1LabelLat.aI2I LA}
Node2I = Node2.index
%%
WhichM = {ArgRecProc 'Which' o('^': Node1)}
in
{FD.impl
{FS.reified.include Node2.index Node1.D1DIDA.model.daughtersL.LA}
{FD.impl
{FS.reified.include LI WhichM}
{FS.reified.include Node2I Node1.D2DIDA.model.down}} 1}
end
end
end
end
end
end
end