Next: Climbing, Previous: CSD1, Up: Principles list
principle.chorus
D1
, D2
, D3
Chorus: set(label(D1))
Chorus: _.D3.entry.chorus
Chorus
(priority 130)
This principle assumes that the Graph principle (Graph) is used
on dimensions D1
and D2
.1
It is fairly specialized, and is so far only used in the Chorus grammar (Chorus) for optimization (hence its name).
It creates for each node v the two sets S1 and
S2. S1 is the set of nodes below edges labeled by
l' in Chorus
which emanate from v on D1
.
S2 is the set of nodes equal or below the mother of v on
D2
.
It then stipulates for all nodes v that S1 must be subset of S2.
Here is the definition of the Chorus
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 in %% check features if {Helpers.checkModel 'Chorus.oz' Nodes [D2DIDA#eqdown D1DIDA#downL D2DIDA#mothers]} then D2EqdownMs = {Map Nodes fun {$ Node} Node.D2DIDA.model.eqdown end} in for Node in Nodes do Dom1LM = {ArgRecProc 'Chorus' o('_': Node)} %% D1DownLMs = {Map D1LAs fun {$ LA} Node.D1DIDA.model.downL.LA end} D1DownLM = {Select.union D1DownLMs Dom1LM} %% D2MothersM = Node.D2DIDA.model.mothers D2EqdownM = {Select.union D2EqdownMs D2MothersM} in {FS.subset D1DownLM D2EqdownM} end end end end