Ответ в теме: Логическая задача на Prolog: Порядок фигур

      Комментарии к записи Ответ в теме: Логическая задача на Prolog: Порядок фигур отключены
#2835

Посмотрите пример решения задачи на следование.

Ваш код можно значительно сократить и упростить. Вместо проверок not(Тип1 = Тип2) и так далее достаточно применить функцию unique, которая завершается успешно только если в списке нет повторяющихся элементов:

unique([Цвет1, Цает2, Цвет3, Цвет4]),
unique([Тип1, Тип2, Тип3, Тип4]).

Чтобы это работало в Visual Prolog , в разделе domains нужно объявить список цветов и список типов:

типы = тип*
цвета = цвет*

Номера фигурам не нужны – для этого достаточно позиции элемента в списке. Функция извлечения свойств – тоже не нужна. Вам нужно применить функцию разделения списка (ее можно использовать также для поиска подсписков). С ее помощью все ограничения из задачи записываются очень легко:

%% фигура красного цвета лежит между зеленой и синей
red_shape_chech(Shapes):-
  divide_list(Shapes, [_,[shape(_, green), shape(_, red), shape(_, blue)], _]);
  divide_list(Shapes, [_,[shape(_, blue), shape(_, red), shape(_, green)], _]).

Мы ищем в списке фигур и цветов подсписок из трех элементов – [зеленый, красный, синий], а если не находим – то ищем [синий, красный, зеленый]. Если не один из подсписков не найден в списке – то вариант размещения фигур и цветов будет отвергнут (запустится поиск других вариантов).

Аналогично при проверке, что справа от желтой фигуры лежит ромб достаточно проверить в списке наличие нужного подсписка из двух элементов:

yellow_shape_check(Shapes):-
  divide_list(Shapes, [_,[shape(_, yellow), shape(rhombus, _)], _]).

Аналогично записываются все остальные условия.