Prolog — Логическая задача. Правильные ответы победителей.

Программирование Помощь с решением задач на Prolog Решение головоломок на Prolog Prolog — Логическая задача. Правильные ответы победителей.

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

  • Автор
    Сообщения
  • #5475
    @maikl58

    Помогите пожалуйста решить задачу подробно.

    Шесть учащихся: Алексеев, Гришин, Смирнов, Трещин, Кузин и Фетисов участвовали в школьной математической олимпиаде. Задачу решили двое. На вопрос: «Кто решил?» участники олимпиады ответили:
    а) Алексеев и Смирнов,
    б) Гришин и Фетисов,
    в) Фетисов и Алексеев,
    г) Гришин и Кузин,
    д) Трещин и Алексеев.
    В четырех из этих ответов указан правильно один из победителей, в одном из ответов оба указаны неправильно. Кто решил задачу?

  • #5477
    @admin

    Описываем типы данных:

    domains 
      имя = алексеев; гришин; смирнов; трещин; кузин; фетисов 
      результат = решил; не_решил

    Думаем какая будет структура гипотезы и гипотеза. Гипотеза должна описывать то, что мы будем предполагать в задаче, в данном случае нужно перебирать варианты «кто решил», т.е. пары «< имя>< результат>«. Гипотеза при этом — список таких пар:

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

    Начало есть, попробуйте предложить сами как проверить второе условие?

    Чтобы перебирать имена и результаты нам потребуются списки:

    constants
      все_имена = [алексеев, гришин, смирнов, трещин, кузин, фетисов ]
      результаты = [решил, не_решил]

    Закончили описывать типы данных. Я сразу перейду к описанию функций (clauses), прототипы (раздел predicates) опишите сами. Итак, сгенерируем гипотезу, для этого к каждому имени подберем возможный результат, при этом используем предикат входит_в, эквивалентный стандартному member из SWI Prolog:

    генерация_гипотезы(Гипотеза):-
      входит_в(РезультатАлексеева, результаты),
      входит_в(РезультатГришина, результаты),
      входит_в(РезультатСмирнова, результаты),
      входит_в(РезультатТрешина, результаты),
      входит_в(РезультатКузина, результаты),
      входит_в(РезультатФетисова, результаты),
    
      Гипотеза = [
        ученик(алексеев, РезультатАлексеева),
        ученик(гришин, РезультатГришина),
        ученик(смирнов, РезультатСмирнова),
        ученик(трешин, РезультатТрешина),
        ученик(кузин, РезультатКузина),
        ученик(фетисов, РезультатФетисова)
      ].

    Если мы сейчас запустим генерацию гипотезы:

    goal
      генерация_гипотезы(Гипотеза).

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

    Первое — «Задачу решили двое» проверяется примерно так:

    findall(Ученик, входит_в(ученик(Ученик, решил), Гипотеза), [_Первый, _Второй]).
    Тут мы просим интерпретатор найти все элементы Гипотезы, где Ученик решил задачу. Последний аргумент findall — список из любых двух элементов, поэтому после добавления такого условия в goal останутся только варианты, соответствующие этому условию.

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