Логическая задача про поэта, композитора и художника

Программирование Помощь с решением задач на Prolog Решение головоломок на Prolog Логическая задача про поэта, композитора и художника

В этой теме 1 ответ, 2 участника, последнее обновление 1 месяц, 4 нед. назад.

  • Автор
    Сообщения
  • #5487
    @user1202190

    Помогите пожалуйста решить следующую задачу
    Андреев, Борисов и Николаев – поэт, композитор и художник. У поэта нет бороды, и он зарабатывает меньше всех. Андреев считает, что Николаеву очень идет борода. Андреев зарабатывает больше композитора. Определите, кто является поэтом, кто композитором, кто художником и у кого есть борода.

    predicates 
      est_boroda (symbol) 
      prof (symbol)
      human (symbol)
      zarplata (prof, human)
    clauses
      prof (compositor).
      prof (xydozhnik).
      prof (poet).
    
      human (Andreev).
      human (Borisov).
      human (Nikolaev).
    
      est_boroda (compositor).
      est_boroda (xydozhnik).
      zarplata (poet,_):- 
       < zarplata (compositor,_), 
      zarplata (xydozhnik,_)
    

  • #5488
    @admin

    Не понятно что хотели изобразить этим кодом. Неверно тут все. Человек несколько, но у вас нет ничего похожего на список. Борода является свойством человека в условии задачи, у вас нет структур, выражающих это (и все остальное). Структуры описываются в domains, а не как у вас.

    Посмотрите как описаны типы данных в других задачах, затем структура:

    domains 
      структура_гипотезы = персонаж(имя, профессия, начилие_бороды, зароботок)
      гипотеза = структура_гипотезы*

    Теперь можно генерировать все возможные варианты решений:

    генерация_гипотезы(Гипотеза):-
      входит_в(ПрофессияАндреева, все_профессии),
      входит_в(ПрофессияБорисова, все_профессии),
      входит_в(ПрофессияНиколаева, все_профессии),
    
      входит_в(БородаАндреева, возможное_наличие),
      входит_в(БородаБорисова, возможное_наличие),
      входит_в(БородаНиколаева, возможное_наличие),
     
      входит_в(ЗаработокАндреева, возможный_заработок),
      входит_в(ЗаработокБорисова, возможный_заработок),
      входит_в(ЗаработокНиколаева, возможный_заработок),
    
      без_повторов([ПрофессияАндреева, ПрофессияБорисова, ПрофессияНиколаева]),
      % ... добавить проверку отсутствия повторов в заработках
    
      Гипотеза = [
        персонаж(андреев, ПрофессияАндреева, БородаАндреева, ЗаработокАндреева),
        персонаж(борисов, ПрофессияБорисова, БородаБорисова, ЗаработокБорисова),
        персонаж(николаев, ПрофессияНиколаева, БородаНиколаева, ЗаработокНиколаева)
      ].

    Предикат входит_в и без_повторов брать отсюда: Простое объяснение работы со списками.

    Дальше проверяете гипотезу на условия из задачи:

    % У поэта нет бороды, и он зарабатывает меньше всех
    проверка(1, Гипотеза):-
      входит_в(персонаж(_, поэт, нет, меньше_всех).
    
    % Андреев считает, что Николаеву очень идет борода
    проверка(2, Гипотеза):-
      входит_в(персонаж(николаев, _, есть, _).
    
    % Андреев зарабатывает больше композитора
    проверка(3, Гипотеза):-
      входит_в(персонаж(андреев, _, _, ЗаработокАндреева),
      входит_в(персонаж(_, композитор, _, ЗаработокКомпозитора),
      больше(ЗаработокАндреева, ЗаработокКомпозитора).

    Остается собрать все это вместе и добавить предикат проверки заработков.

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