/* Five translators problem in Picat. http://stackoverflow.com/questions/26260407/prolog-logic-puzzle-constraint-programming """ Five translators are working in an international organization: Spaniard, Englishman, Frenchman, German and Russian. Each of them speaks its native language and also two languages from the native languages of other translators. Find the languages speaked by each translator if it is known that 1. The Englishman speaks German. 2. The Spaniard speaks French. 3. The German does not speak Spanish. 4. The Frenchman does not speak German. 5. Spaniard and Englishman can talk with each other in German. 6. Englishman and Frenchman can talk with each other in two languages. 7. Four translators speak Russian. 8. Exactly two translators speak French. 9. Only one translator who speaks Spanish speaks also Russian. 10. Russian and Englishman have no common languages except their native languages. """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import util. import cp. main => go. go ?=> N = 5, Spanish = 1, English = 2, French = 3, German = 4, Russian = 5, Languages = ["Spanish","English","French","German","Russian"], % decision variables X = new_array(N,N), X :: 0..1, foreach(I in 1..N) % one speak one's native language X[I,I] #= 1, % all translators speak three languages sum([X[I,J] : J in 1..N]) #= 3 end, % 1. The Englishman speaks German. X[English,German] #= 1, % 2. The Spaniard speaks French. X[Spanish,French] #= 1, % 3. The German does not speak Spanish. X[German,Spanish] #= 0, % 4. The Frenchman does not speak German. X[French,German] #= 0, % 5. Spaniard and Englishman can talk with each other in German. X[Spanish,German] #= 1, X[English,German] #= 1, % 6. Englishman and Frenchman can talk with each other in two languages. sum([X[English,J] #= X[French,J] #/\ X[French,J] #= 1 : J in 1..N]) #= 2, % 7. Four translators speak Russian. sum([X[I,Russian] : I in 1..N]) #= 4, % 8. Exactly two translators speak French. sum([X[I,French] : I in 1..N]) #= 2, % 9. Only one translator who speaks Spanish speaks also Russian. sum([X[I,Spanish] #= 1 #/\ X[I,Russian] #= 1 : I in 1..N]) #= 1, % 10. Russian and Englishman have no common languages except their native languages. sum([X[English,J] #= X[Russian,J] #/\ X[Russian,J] #= 1 : J in [Spanish,French,German]]) #= 0, solve(X), println(X), foreach(I in 1..N) println(Languages[I]=[Languages[J] : J in 1..N, X[I,J] = 1]) end, fail, nl. go => true.