Next: , Previous: LockingDaughters, Up: Principles list


7.2.47 LookRight principle

This principle was written by Ondrej Bojar.

Here is the definition of the LookRight constraint functor:

%% Copyright 2004-2008
%% by 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'}
      AttrsLat = {G.dIDA2AttrsLat DIDA}
      ALatRec = AttrsLat.record
      AgrReqLat = ALatRec.agrreq
      AgrReqAs = AgrReqLat.constants
   in
      %% check features
      if {Helpers.checkModel 'LookRight.oz' Nodes
          [DIDA#labels]} then
         for Node in Nodes I in 1..{Length Nodes} do
            LookRightRec = {ArgRecProc 'LookRight' o('_': Node)}
            Index1 = I+1
	    N = {Length Nodes}
            %% right neighbour's agr must allow our edge label,
            %% i.e. our edge label in ...
	    AllowedLabelsM =
	    if Index1 =< N then
	       Node1 = {Nth Nodes Index1}
	       AgrReqD = Node1.DIDA.attrs.agrreq
	    in
	       {Select.fs
		{Map AgrReqAs fun {$ A} LookRightRec.A end}
		AgrReqD}
	    else
	       LookRightRec.'-1'
	    end
	 in
	    {FS.subset Node.DIDA.model.labels AllowedLabelsM}
         end
      end
   end
end