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

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

Вот эта огромная группа проверок:

not(Имя1=Имя2),not(Цвет1=Цвет2), not(Способ1=Способ2),
not(Имя1=Имя3),not(Цвет1=Цвет3), not(Способ1=Способ3),
not(Имя1=Имя4),not(Цвет1=Цвет4), not(Способ1=Способ4),
not(Имя2=Имя3),not(Цвет2=Цвет3), not(Способ2=Способ3),
not(Имя2=Имя4),not(Цвет2=Цвет4), not(Способ2=Способ4),
not(Имя3=Имя4),not(Цвет3=Цвет4), Способ3=Способ4,

может быть заменена на
unique([Имя1, Имя2, Имя3, Имя4]),
unique([Цвет1, Цвет2, Цвет3, Цвет4]),
unique([Способ1, Способ2, Способ3, Способ4]),

Предикат unique можно взять из статьи «Списки в Prolog. Примеры«. Такая замена — более правильный путь, т.к. при копировании и вставке (так получен ваш код) часто возникают ошибки. У вас ошибка в том, что вы требуете, чтобы Способ3 был равен Способ4 (забыли not добавить).

В остальной части кода, я не понял что именно вы пытались сделать. Все эти предикаты одинаковы:

  зовут_не_Б(X,[X|_]).
  не_одевает_красное(X,[X|_]).
  не_одевает_оранжевое(X,[X|_]).
  не_пользуется_воздушным_такси(X,[X|_]).
  не_пользуется_воздушным_трамваем(X,[X|_]).
  не_путешествует_пешком(X,[X|_]).

Они лишь проверяют, что переданный элемент находится в списке первым.
Да и общая схема вашего кода мне тоже не понятна.