% Licenced under CC-BY-4.0 : http://creativecommons.org/licenses/by/4.0/ 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 ;