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.start
End: ^.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