Это проблема: 16 детей должны сидеть в 4 x 4 стульях. У детей 8 девочек (число 1,8) и 8 мальчиков (с номером 9,16). 1,3,5,8 думаю, что мальчики yucky 9,10,11,14 считают, что девочки являются грубыми эти пары являются врагами: [[1,2], [4,6], [4,7], [4, 9], [9,11], [12, 14], [14,16]]Исключая список tuples_in в прологе
предикат, чтобы найти двух детей не враги определяется как:
not_enemy(A, B) :-
NotA #\= A #\/ NotB #\= B,
tuples_in([[NotA, NotB]],
[[1,2], [4,6], [4,7], [4, 9],[9,11], [12, 14], [14,16]]).
выше код был найден here
но когда я запрашиваю? - not_enemy (1,2), вывод является истинным.
Я должен использовать этот длинный код вместо:
not_enemy(A, B) :-
A #=1 #==> B #\= 2,
A #=4 #==> B #\= 6,
A #=4 #==> B #\= 7,
A #=4 #==> B #\= 9,
A #=9 #==> B #\= 11,
A #=12 #==> B #\= 14,
A #=14 #==> B #\= 16.
Может кто-нибудь, пожалуйста, помогите исправить первый кусок кода? Заранее спасибо.
Пример неправильный, и смешение reifications с помощью 'tuples_in/2', безусловно, не является хорошим способом выразить заданные ограничения с помощью CLP (FD). Ваш код - один правильный способ сделать это (+1!). Другой способ - применить метод @repeat: вы можете построить дополнение к отношению и использовать 'tuples_in/2', чтобы ограничить пары * совместимыми * элементами. Еще один способ - свести на нет отдельные ограничения 'tuples_in/2'. Будьте осторожны, но не случайно отрицайте ограничение 'tuples_in/2', которое включает в себя более одной пары, поскольку это не будет логически эквивалентно другим способам. – mat