Next: Dag, Previous: Coindex, Up: Principles list
principle.customs
D
Customs: iset(label(D))
Customs: _.D.entry.customs
Customs (priority 130)
This principle was written by Ondrej Bojar.
Here is the definition of the Customs constraint functor:
%% Copyright 2004-2008
%% by Ralph Debusmann <rade@ps.uni-sb.de> (Saarland University)
%% Ondrej Bojar <obo@cuni.cz>
%%
functor
import
Helpers(checkModel) at 'Helpers.ozf'
export
Constraint
define
proc {Constraint Nodes G Principle FD FS Select}
DVA2DIDA = Principle.dVA2DIDA
ArgRecProc = Principle.argRecProc
%%
DIDA = {DVA2DIDA 'D'}
in
%% check features
if {Helpers.checkModel 'Customs.oz' Nodes
[DIDA#labels DIDA#daughters DIDA#down]} then
for Node in Nodes do
if Node.index > 1 andthen
Node.index < {Length Nodes}
then
AllowedOverEdges = {ArgRecProc 'Customs' o('_': Node)}
DaughtersMs = {Map Nodes fun {$ A} A.DIDA.model.daughters end}
LabelsMs = {Map Nodes fun {$ A} A.DIDA.model.labels end}
ML = {FS.value.make [1#(Node.index-1)]}
% nodes left of me
MLAbove = {FS.diff ML Node.DIDA.model.down}
% nodes left of me and not below me
MR = {FS.value.make [(Node.index+1)#{Length Nodes}]}
MRAbove = {FS.diff MR Node.DIDA.model.down}
MLSons = {Select.union DaughtersMs MLAbove}
% sons of nodes left of me
MRL = {FS.intersect MLSons MR}
% nodes right of me that have the father left of me
LabsRL = {Select.union LabelsMs MRL}
% labels of such edges
MRSons = {Select.union DaughtersMs MRAbove}
% nodes left of me that have the father right of me
% sons of nodes left of me
MLR = {FS.intersect MRSons ML}
LabsLR = {Select.union LabelsMs MLR}
% labels of such edges
in
{FS.subset LabsLR AllowedOverEdges}
{FS.subset LabsRL AllowedOverEdges}
end % if
end
end
end
end