Рыцари и лжецы

Правила игры

Каждый персонаж игры или рыцарь, или лжец. Рыцарь всегда говорит правду. Лжец всегда лжёт. Цель игры - по высказанным персонажами предложениям определить, кто есть кто.

Например, персонаж A сказал: "Я и рыцарь и лжец". Мы рассуждаем, что если A сказал правду, то он рыцарь. Но мы знаем, что персонаж не может быть и рыцарем, и лжецом одновременно, значит A врёт, он лжец.

Наша задача - реализовать эту игру, используя логику высказываний, а ИИ решит её.

Начало

Зайдите на ide.cs50.io. Перейдите в домашний каталог
cd ~
Загрузите дистрибутив с http://vadimgb.github.io/weeks/logic/knights.zip и unzip его.
wget https://vadimgb.github.io/weeks/logic/knights.zip
unzip knights.zip
rm -rf knights.zip
cd knights

Содержание архива

Файл logic.js подобен рассмотренному в лекции, он содержит определение классов и функцию - проверка_моделей. Последняя для заданных базы знаний и запроса вычисляет, вытекает ли запрос из БЗ.

В верхней части файла puzzle.js вводится 6 пропозициональных символов. Например, АРыцарь, представляет предложение, что "A - рыцарь." Аналогично определяются пропозициональные символы для Б и В.

Далее следуют четыре базы знаний: знания0, знания1, знания2, знания3 - которые будут содержать знания необходимые для логического вывода решений для Головоломок 0, 1, 2, 3 соответственно. Заметьте, что сейчас эти базы пустые. Это ваша задача, наполнить их.

Функция - main в цикле для каждой головоломки при помощи функции, проверки моделей по БЗ головоломки, вычисляет, кто персонаж: лжец или рыцарь и печатает результат.

Спецификация

Добавьте знания в БЗ знаиня0, знания1, знания2, знания3, чтобы решить следующие головоломки.

В каждой головоломке, каждый персонаж либо рыцарь, либо лжец. Каждое предложение, сказанное рыцарем, правда, каждое предложение, сказанное лжецом, ложь.

Когда вы заполните БЗ для головоломки, вы сможете запустить node puzzle.js, чтобы получить решение.

Пример решения задания 0.

В файл puzzle.js добавим


знания0 = new И()
//Эквивалентность, рыцарь - не лжец 
знания0.добавить(new Эквивалентность(АРыцарь, new Не(АЛжец)))
//Эквивалентность, сказал правду - значит рыцарь
знания0.добавить(new Эквивалентность(new И(АРыцарь, АЛжец), АРыцарь))

Запустим, выполнив node puzzle.js .

Как проверить

Чтобы проверить правильность выполнения задания, выполните команду
npx check204 2021/knights local

Как отправить на проверку

  1. Для отправки на проверку выполните команду
    npx check204 2021/knights
    
  2. Заполните форму форма отправки на проверку
Свои оценки вы можете посмотреть на http://90.188.117.161:8080.