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

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

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 10 мес., 4 нед. назад.

  • Автор
    Сообщения
  • #2678

    questioner
    Участник

    Добрый вечер. Помогите реализовать программу на Turbo Prolog — с языком пока мало знаком:

    Лариса, Даша, Оля, Соня и Вера учились на курсах кройки и шитья. 2 шитье платьев, а три — в шитье костюмов. Кто из учился шить костюмы, если известно, что:

    1. Даша и Лариса шили разные вещи;
    2. Соня и Вера тренировались в шитье одинаковых вещей;
    3. у Оли и Даши были в работе разные вещи

    Мои попытки решения задачи:

    domains
      name=larisa;olja;dasha;sonja;vera.
      that_it=plat;kost.
    predicates
      sew(name,that_it).
    clauses
      %% Кто-то 1 + Кто-то 2 + Кто-то 3 шьют костюмы если 2 других шьют платья
      sew(X1,kost), sew(X2,kost), sew(X3,kost):-
        sew(X4,plat), sew(X5,plat).
      %% вера шьет тоже самое если соня шьет тоже самое 
      sew(vera,X):-
        sew(sonja,X). 
      %% лариса и оля что-то одно если даша и лариса разное
      sew(larisa,X),sew(olja,X):-
        sew(dasha,Y),sew(larisa,X).
      %% даша соня и вера что-то одно если лариса и оля что-то одно 
      sew(dasha,Y),sew(sonja,Y),sew(vera,Y):-
        sew(larisa,X),sew(olja,X).
    goal
      %% Кто шьет костюмы
      sew(What,kost). 

    Делал в visual prolog выдает 3 ошибки. Подскажите что не так?

    При написании программы я придерживался следующей логики: мы знаем что у нас двое шьют платья и трое шьют костюмы. Даша и Лариса шьют разное. Соня и Вера шьют одно и тоже. Оля и Даша разное, а т.к Даша и Лариса тоже разное — следовательно Лариса и Оля одно и то же. Так как Соня и Вера шьют одно и тоже Лариса и Оля — тоже, следовательно Соня с Верой шьют что то другое (не то что шьют Лариса и Оля так как максимум может быть трое, которые шьют одно и тоже(костюмы)). Следовательно Лариса и Оля шьют платья а Даша, Вера и Соня костюмы. Как это в коде сделать не знаю, помогите.

  • #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 в таком виде.

Для ответа в этой теме необходимо авторизоваться.