/* Global constraint elements_alldifferent in Picat. From Global Constraint Catalogue http://www.emn.fr/x-info/sdemasse/gccat/Celements_alldifferent.html """ Constraint elements_alldifferent(ITEMS,TABLE) Purpose All the items of the ITEMS collection should be equal to one of the entries of the table TABLE and all the variables ITEMS.index should take distinct values. Example ( < index-2 value-9, index-1 value-6, index-4 value-9, index-3 value-2 >, < index-1 value-6, index-2 value-9, index-3 value-2, index-4 value-9 > ) The elements_alldifferent constraint holds since, as depicted by Figure 4.114.1 [see the referred page], there is a one to one correspondence between the items of the ITEMS collection and the items of the TABLE collection. """ 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, % length of table M = 4, % length of items ElementTable = new_array(N,2), ElementTable :: 1..9, Items = new_array(M,2), Items :: 1..9, ElementTable = {{1,6}, {2,9}, {3,2}, {4,9}}, Items = {{2,9}, {1,6}, {_,_}, {_,_}}, elements_alldifferent(Items, ElementTable), Vars = ElementTable ++ Items, solve(Vars), println(elementTable=ElementTable), println(items=Items), nl, fail, nl. go => true. elements_alldifferent(Items, ElementTable) => foreach(I in 1..Items.len) sum([Items[I,1] #= ElementTable[J,1] #/\ Items[I,2] #= ElementTable[J,2] : J in 1..ElementTable.len]) #= 1 end, all_different([Items[I,1] : I in 1..Items.len]).