/* Global constraint nvalue_common in Picat. From Global Constraint Catalogue http://www.emn.fr/x-info/sdemasse/gccat/Cnvalue_common.html """ Constraint nvalue_on_intersection(NVAL,VARIABLES1,VARIABLES2) Purpose NVAL is the number of distinct values that both occur in the VARIABLES1 and VARIABLES2 collections. Example ( 2,<1,9,1,5>, <2,1,9,9,6,9> ) Observe that the two collections <1,9,1,5> and <2,1,9,9,6,9> share two values in common (i.e., values 1 and 9). Consequently the nvalue_on_intersection constraint holds since its first argument NVAL is set to 2. """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp. main => go. go ?=> N = 4, M = 6, Variables1 = new_list(N), Variables1 :: 1..9, Variables2 = new_list(M), Variables2 :: 1..9, NVal :: 0..min(M,N), Variables1 = [1,9,1,5], Variables2 = [2,1,9,9,6,9], NVal #= 2, nvalue_common(NVal, Variables1, Variables2), Vars = Variables1 ++ Variables2 ++ [NVal], solve(Vars), println(variables1=Variables1), println(variables2=Variables2), println(nval=NVal), nl, fail, nl. go => true. nvalue_common(NVal, V1,V2) => Max = max(fd_max_array(V1),fd_max_array(V2)), Min = min(fd_min_array(V1),fd_min_array(V2)), NVal #= sum([ sum([V1[J] #= I : J in 1..V1.len]) #>= 1 #/\ sum([V2[J] #= I : J in 1..V2.len]) #>= 1 : I in Min..Max]). fd_max_array(X) = max([fd_max(V) : V in X]). fd_min_array(X) = min([fd_min(V) : V in X]).