
MAIN MODEL Main_Langford

  DECLARATION SECTION 

    MATHEMATICAL PROGRAM:
       identifier   :  LangfordPlan
       direction    :  minimize
       constraints  :  AllConstraints
       variables    :  AllVariables
       type         :  CSP ;

    PARAMETER:
       identifier   :  k
       initial data :  8 ;

    PARAMETER:
       identifier   :  k2
       definition   :  k*2 ;

    SET:
       identifier   :  jj
       subset of    :  Integers
       index        :  j
       definition   :  {1..k2} ;

    SET:
       identifier   :  ii
       subset of    :  Integers
       index        :  i
       definition   :  {1..k} ;

    ELEMENT VARIABLE:
       identifier   :  position
       index domain :  (j)
       range        :  jj ;

    ELEMENT VARIABLE:
       identifier   :  solution
       index domain :  j
       range        :  ii ;

    CONSTRAINT:
       identifier   :  pos1
       index domain :  j |j <= k
       definition   :  position(j) + j+1 = position(j+k)
       comment      :  "Note the index domain." ;

    CONSTRAINT:
       identifier   :  pos2
       index domain :  (i)
       definition   :  solution(position(i)) = i ;

    CONSTRAINT:
       identifier   :  pos3
       index domain :  j |j <= k
       definition   :  solution(position(k+j)) = j
       comment      :  "Note the index domain." ;

    CONSTRAINT:
       identifier   :  alldiff_position
       definition   :  cp::AllDifferent(j, position(j)) ;

    CONSTRAINT:
       identifier   :  symm1
       definition   :  solution(1) > solution(k2) ;

  ENDSECTION  ;

  PROCEDURE
    identifier :  MainInitialization

  ENDPROCEDURE  ;

  PROCEDURE
    identifier :  MainExecution
    body       :  
      ShowProgressWindow;
      solve LangfordPlan;
      
        if (LangfordPlan.ProgramStatus <> 'Optimal') then
             empty solution, position;
        endif;
      
        DialogMessage(GMP::Solution::Count('LangfordPlan'));

  ENDPROCEDURE  ;

  PROCEDURE
    identifier :  MainTermination
    body       :  
      return DataManagementExit();

  ENDPROCEDURE  ;

ENDMODEL Main_Langford ;
