Initializing help system before first use

Generic binary and n-ary constraints


Type: Programming
Rating: 3 (intermediate)
Description: Implementation of a user-defined constraints:
  • ac2001.mos: Generic binary constraint
  • gac2001.mos: Generic n-ary constraints
File(s): ac2001.mos, gac2001.mos


ac2001.mos
(!****************************************************************
   CP example problems
   ===================
   
   file ac2001.mos
   ```````````````
   Generic binary constraints.

   (c) 2008 Artelys S.A. and Fair Isaac Corporation
       Creation: 2005
*****************************************************************!)
model "generic_binary_constraint example"
 uses "kalis"

 forward function truth_value(v1:integer, v2:integer): boolean

 declarations 
  V1 : cpvar 
  V2 : cpvar          
  c  : integer
 end-declarations

 c := 4
 0 <= V1 ; V1 <= 10
 0 <= V2 ; V2 <= 5

! Define and post the user constraint
 generic_binary_constraint(V1, V2, "truth_value")

! Search for all solutions and print them out
 while (cp_find_next_sol)
  writeln("A solution has been found with V1 = ",
          getsol(V1), " and V2 = ", getsol(V2) )

! Implementation of the user constraint
 function truth_value(v1:integer, v2:integer): boolean 
  returned := (v1 = v2 mod c)
 end-function

end-model


gac2001.mos
(!****************************************************************
   CP example problems
   ===================
   
   file gac2001.mos
   ````````````````
   Generic n-ary constraints.

   (c) 2009 Artelys S.A. and Fair Isaac Corporation
       Creation: Nov. 2009, rev. July 2010
*****************************************************************!)
model "generic_n_ary_constraint example"
 uses "kalis"
 
 parameters
  N = 6
 end-parameters

 forward function greater_than_previous(tuple: cptuple, flag:integer): boolean
  
 declarations
  R = 1..N 
  vars : array(R) of cpvar 
 end-declarations
 
 forall(i in R) setdomain(vars(i),0,N)

! Define and post the user constraint
 generic_nary_constraint(vars, "greater_than_previous", 1)

 cp_show_prob

! Search for all solutions and print them out
 while (cp_find_next_sol)
  cp_show_sol

!**** Implementation of the user constraint: the value of each
!**** tuple element must be strictly larger than its predecessor
 function greater_than_previous(tuple: cptuple, flag:integer): boolean 
  returned := true
  first := true
  lastv := 0
  forall (indexv in 1..getsize(tuple)) do
   v := getelt(tuple,indexv)
   if (first) then
    lastv := v
    first := false
   else
    if (v < lastv + 1 ) then         
     returned:= false
     break
    end-if
    lastv := v
   end-if
  end-do   
 end-function

end-model