Рыцари и лжецы
Правила игры
Каждый персонаж игры или рыцарь, или лжец. Рыцарь всегда говорит правду. Лжец всегда лжёт. Цель игры - по высказанным персонажами предложениям определить, кто есть кто.
Например, персонаж 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,
чтобы решить следующие головоломки.
-
Головоломка 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
Как отправить на проверку
- Для отправки на проверку выполните команду
npx check204 2021/knights
- Заполните форму форма отправки на проверку