Next: LookRight, Previous: LinkingSisters, Up: Principles list
principle.lockingDaughters
D1, D2, D3
LockDaughters: set(label(D1))ExceptAbove: set(label(D1))Key: set(label(D2))
LockDaughters: {}ExceptAbove: {}Key: {}
LockingDaughters (priority 110)
This principle assumes that the Graph principle (Graph) is used
on dimension D1: it does not work with the Graph1 principle
(Graph1) on D1.
It states the constraint that for all nodes v, the dependents
v' reachable on D1 via an edge label l in the
lexically specified set LockDaughters are “locked”, i.e., on
D2, they cannot be a dependent of any node except:
D1 reachable via an
edge labeled l' in ExceptAbove
Key on D1
Here is the definition of the LockingDaughters 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'
export
Constraint
define
proc {Constraint Nodes G Principle FD FS Select}
DVA2DIDA = Principle.dVA2DIDA
ArgRecProc = Principle.argRecProc
%%
D1DIDA = {DVA2DIDA 'D1'}
D2DIDA = {DVA2DIDA 'D2'}
DIDA2LabelLat = G.dIDA2LabelLat
D1LabelLat = {DIDA2LabelLat D1DIDA}
D1LAs = D1LabelLat.constants
D2LabelLat = {DIDA2LabelLat D2DIDA}
D2LAs = D2LabelLat.constants
in
%% check features
if {Helpers.checkModel 'Locking.oz' Nodes
[D2DIDA#mothers
D2DIDA#mothersL
D1DIDA#daughtersL
D1DIDA#upL
D1DIDA#eq]} then
D2MothersMs =
{Map Nodes
fun {$ Node} Node.D2DIDA.model.mothers end}
%%
D2MothersLMs =
{Map D2LAs
fun {$ LA}
{FS.unionN
{Map Nodes
fun {$ Node} Node.D2DIDA.model.mothersL.LA end}}
end}
in
for Node in Nodes do
LockDaughtersD1LM = {ArgRecProc 'LockDaughters' o('_': Node)}
ExceptAboveD1LM = {ArgRecProc 'ExceptAbove' o('_': Node)}
KeyD2LM = {ArgRecProc 'Key' o('_': Node)}
%%
D1DaughtersLMs = {Map D1LAs
fun {$ LA} Node.D1DIDA.model.daughtersL.LA end}
LockDaughtersM = {Select.union D1DaughtersLMs LockDaughtersD1LM}
%%
D1UpLMs = {Map D1LAs
fun {$ LA} Node.D1DIDA.model.upL.LA end}
ExceptAboveM = {Select.union D1UpLMs ExceptAboveD1LM}
%%
KeyM = {Select.union D2MothersLMs KeyD2LM}
%%
D2MothersLockDaughtersM =
{Select.union D2MothersMs LockDaughtersM}
in
{FS.subset D2MothersLockDaughtersM
{FS.unionN [Node.D1DIDA.model.eq ExceptAboveM KeyM]}}
end
end
end
end