Prolog — задача 83 Кухарка и Кот

  • В этой теме 0 ответов, 1 участник, последнее обновление 2 месяца назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #6777
      @admin
      StudLance.ru

      Задача:

      Кухарка и Кот
      — Когда я говорю «не в своем уме»,— продолжала Герцогиня,—то я имею в виду именно то,
      о чем говорю. Бедняги совсем выжили из ума. У них в голове все перепуталось.
      Обо всем они судят превратно—не кое о чем, а обо всем!

      Все, что они считают истинным, на самом деле ложно,
      а все, что они считают ложным, в действительности истинно.

      Услышав о столь странном положении дел, Алиса задумалась.
      — Считает ли тот, кто не в своем уме, человек или какое-нибудь существо,
      что дважды два—пять?— спросила Алиса.

      — Конечно, дитя мое! Поскольку дважды два не пять, то тот, кто не в своем уме,
      считает, что дважды два—пять.

      — А считает ли тот, кто не в своем уме, что дважды два—шесть?—
      задала новый вопрос Алиса.

      — Конечно, дитя мое!—ответила Герцогиня.— Поскольку дважды два не шесть,
      то тот, кто не в своем уме, считает, что дважды два—шесть.

      — А как с теми, кто здесь в своем уме?—воскликнула Алиса. ?
      Наверное, они придерживаются в основном правильных представлений,
      хотя кое в чем могут и заблуждаться?

      — Ни в коем случае!—решительно возразила Гер­цогиня.—Так ведут себя здравые
      люди там, откуда ты пришла. Здесь же те, кто в своем уме, абсолютно точны в
      своих суждениях. Все, что истинно, здравые люди считают истинным, все, что ложно,—ложным.

      Алиса немного задумалась.
      — Хотела бы я знать,—сказала она,—кто здесь в здравом уме и кто безумец.
      — Взять, например, мою кухарку и Чеширского Кота,—продолжала Герцогиня.

      —Кухарка считает, что по крайней мере один из них не в своем уме.
      Можете ли вы путем логических рассуждений определить, в своем ли уме кухарка и Кот?

      Приведенные тут варианты решения очень легко читаются — я думаю, к ним не нужны дополнительные пояснения. Если что-то не понятно — спрашивайте. Наиболее сложные предикаты — входит_в, без_повторов и убрать_повторы подробно разобраны тут. Там же, объясняется как понять findall. Также, понять решение может помочь статья «Решение логических задач на Prolog«.

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

      Решение 1

      domains
        существо = кухарка;кот
        состояние = здравомыслящий;безумец
      
        структура_гипотезы = кто_есть_кто(существо, состояние)
        гипотеза = структура_гипотезы*
      predicates
        nondeterm возможное_существо(существо)
        nondeterm возможное_состояние(состояние)
        
        nondeterm входит_в(структура_гипотезы, гипотеза)
        nondeterm генерация_гипотезы(гипотеза)
        
        nondeterm сказал(существо, гипотеза)
        nondeterm проверка_с_учетом_состояния(существо, гипотеза)
      clauses
          возможное_существо(кухарка).
          возможное_существо(кот).
          
          возможное_состояние(здравомыслящий).
          возможное_состояние(безумец).
          
          входит_в(Элемент, [Элемент|_ОстальныеЭлементы]).
          входит_в(Элемент, [_ПервыйЭлемент|ОстальныеЭлементы]):-
              входит_в(Элемент, ОстальныеЭлементы).
          
          генерация_гипотезы(Гипотеза):-
          	возможное_состояние(СостояниеКота),
          	возможное_состояние(СостояниеКухарки),
          	
          	Гипотеза = [
          		кто_есть_кто(кухарка, СостояниеКухарки),
          		кто_есть_кто(кот, СостояниеКота)
          	].
          	
      % —Кухарка считает, что по крайней мере один из них не в своем уме.
          сказал(кухарка, Гипотеза):-
          	входит_в(кто_есть_кто(_КтоТо, безумец), Гипотеза).
          	
         проверка_с_учетом_состояния(Имя, Гипотеза):-
         	входит_в(кто_есть_кто(Имя, здравомыслящий), Гипотеза),
          	сказал(Имя, Гипотеза).
         проверка_с_учетом_состояния(Имя, Гипотеза):-
         	входит_в(кто_есть_кто(Имя, безумец), Гипотеза),
          	NOT(сказал(Имя, Гипотеза)).
      goal 
          
          генерация_гипотезы(Гипотеза),
          проверка_с_учетом_состояния(кухарка, Гипотеза).
      

      StudLance.ru

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