Next: LinkingDaughter, Previous: LinkingBelowStart, Up: Principles list
principle.linkingBelowStartEnd
D1, D2, D3
Start: vec(label(D1) set(label(D2)))End: vec(label(D1) set(label(D2)))
Start: ^.D3.entry.startEnd: ^.D3.entry.end
LinkingBelowStartEnd (D1)
This principle assumes that the Graph principle (Graph) is used
on dimensions D1 and D2.1
This principle is from the family of linking principles.
For all edges from v to v' labeled l on D1,
it stipulates the constraints:
Start(l) is not empty, then on D2,
v' must be below an edge emanating from v and labeled by
a label in Start(l)
End(l) is not empty, then on D2,
v' must be below v, and the incoming edge of v'
must be in End(l)
Start(l) and End(l) specify the direction,
startpoint and endpoint of the path from v to v' on
D2.
Here is the definition of the LinkingBelowStartEnd
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'}
DIDA2LabelLat = G.dIDA2LabelLat
D1LabelLat = {DIDA2LabelLat D1DIDA}
D2LabelLat = {DIDA2LabelLat D2DIDA}
D1LAs = D1LabelLat.constants
D2LAs = D2LabelLat.constants
in
if {Helpers.checkModel 'LinkingBelowStartEnd.oz' Nodes
[D1DIDA#daughtersL
D2DIDA#downL
D2DIDA#upL]} 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
local
%% Linking Below and Startpoint
%% m -l->1 d =>
%% Start(l) neq emptyset =>
%% m -Start(l)->2 ->*2 d
StartLALMRec =
{ArgRecProc 'Start' o('^': Node1)}
StartLM = StartLALMRec.LA
%%
Node1D2DownLMs =
{Map D2LAs
fun {$ LA} Node1.D2DIDA.model.downL.LA end}
Node1D2DownLM =
{Select.union Node1D2DownLMs StartLM}
in
{FD.impl
{FS.reified.include Node2.index Node1.D1DIDA.model.daughtersL.LA}
{FD.impl
{FD.nega {FS.reified.equal StartLM FS.value.empty}}
{FS.reified.include Node2.index Node1D2DownLM}} 1}
end
%%
local
%% Linking Below and Endpoint
%% m -l->1 d =>
%% End(l) neq emptyset =>
%% m ->*2 -End(l)->2 d
EndLALMRec =
{ArgRecProc 'End' o('^': Node1)}
EndLM = EndLALMRec.LA
%%
Node2D2UpLMs =
{Map D2LAs
fun {$ LA} Node2.D2DIDA.model.upL.LA end}
Node2D2UpLM =
{Select.union Node2D2UpLMs EndLM}
in
{FD.impl
{FS.reified.include Node2.index Node1.D1DIDA.model.daughtersL.LA}
{FD.impl
{FD.nega {FS.reified.equal EndLM FS.value.empty}}
{FS.reified.include Node1.index Node2D2UpLM}} 1}
end
end
end
end
end
end
end
end