Ответ в теме: Логическая задача: курсы кройки и шитья

      Комментарии к записи Ответ в теме: Логическая задача: курсы кройки и шитья отключены
#2679

У вас некорректная запись:

sew(X1,kost), sew(X2,kost), sew(X3,kost):-
    sew(X4,plat), sew(X5,plat).

Слева от оператора :- должно находиться имя функции (одной) и аргументы. Через запятую можно соединять вызовы предикатов только внутри тела функции.

Вам нужно описать возможные варианты шитья:

sew(dress).
sew(suit).

Попросить интерпретатор перебрать все возможные варианты шитья, сгруппировать их в список для проверки того, что двое из них шьют платья, а трое — костюмы предикатом count:

solution(Solution):-
  sew(LarisaSew), sew(DashaSew), sew(OlyaSew), sew(SonyaSew), sew(VeraSew),
  Solution = [LarisaSew, DashaSew, OlyaSew, SonyaSew, VeraSew],
  
  count(Solution, dress, 2).

Если мы запустим сейчас эту программу, то получим на экране кучу вариантов, в каждом из которых платья будут шить только двое.

Остается лишь дополнить решение дополнительными условиями из задачи:

NOT(DashaSew = LarisaSew),
SonyaSew = VeraSew,
NOT(DashaSew = OlyaSew).

На скриншоте ниже показан результат работы на SWI Prolog, под него я чуть-чуть изменил код, т.к. он не поддерживает конструкцию NOT в таком виде.