Задание №9
«Мини GURU»

Описание задачи

GURU -- это известная в свое время мощная экспертная система. Вам предлагается написать сильно упрощенный вариант подобной экспертной системы.

Мини GURU использует в своей работе терминологический словарь. Терминологический словарь (далее -- словарь) состоит из статей, которые содержат толкование слов в следующей форме:

ТЕРМИН -- ПРИЗНАК, ПРИЗНАК, ... , ПРИЗНАК.

В статье словаря слева от тире стоит слово или несколько слов, которыми обозначают данный термин. Справа от тире -- набор признаков, разделенных запятыми; каждый признак состоит из одного или нескольких слов. Статья заканчивается точкой. Статья может располагаться на нескольких строках. Везде, где есть пробел, можно вставить еще пробелы или разбить в этом месте строку на две строки.

Словарь корректен, т.е. не содержит объяснений термина через сам этот термин. Пример словаря:

МУХОМОР -- ГРИБ, ШЛЯПКА КРАСНАЯ, НЕ ЕДЯТ.
БЛЕДНАЯ ПОГАНКА -- ГРИБ, ШЛЯПКА БЕЛАЯ, ЯДОВИТЫЙ.
ПОДБЕРЕЗОВИК -- ГРИБ, ЕДЯТ.
ЯДОВИТЫЙ -- НЕ ЕДЯТ.

В словарь можно добавлять новые термины, искать в нем толкования терминов или искать в нем термины по признакам.

Запрос на добавление термина начинается со знака  '+', за которым следует текст толкования. Например:

Запрос Вывод
+ МОЛОКО -- ЖИДКОСТЬ, БЕЛАЯ. Добавлен термин "МОЛОКО"
+ ОГУРЕЦ -- ОВОЩ, ЗЕЛЕНЫЙ. Добавлен термин "ОГУРЕЦ"

Запрос на толкование термина начинается со знака '#'. Например:

Запрос Вывод
# ЯДОВИТЫЙ ЯДОВИТЫЙ -- НЕ ЕДЯТ
# КИВИ НЕТ ТАКОГО ТЕРМИНА!
# <все термины словаря и их толкования>

Запрос на поиск термина по признакам начинается со знака '?' и содержит один или несколько признаков, разделенных ключевыми словами "И" или "ИЛИ". В одном запросе используется либо только ключевое слово "И", либо только ключевое слово "ИЛИ".

Запрос Вывод
? ГРИБ МУХОМОР -- ГРИБ, ШЛЯПКА КРАСНАЯ, НЕ ЕДЯТ.
БЛЕДНАЯ ПОГАНКА -- ГРИБ, ШЛЯПКА БЕЛАЯ, ЯДОВИТЫЙ.
ПОДБЕРЕЗОВИК -- ГРИБ, ЕДЯТ.
? ГРИБ И ШЛЯПКА КРАСНАЯ МУХОМОР -- ГРИБ, ШЛЯПКА КРАСНАЯ, НЕ ЕДЯТ.
? ШЛЯПКА БЕЛАЯ ИЛИ ШЛЯПКА КРАСНАЯ МУХОМОР -- ГРИБ, ШЛЯПКА КРАСНАЯ, НЕ ЕДЯТ.
БЛЕДНАЯ ПОГАНКА -- ГРИБ, ШЛЯПКА БЕЛАЯ, ЯДОВИТЫЙ.

Мини GURU разумно реагирует, если какой-либо признак является термином словаря: он заменяется на совокупность признаков, определяющих этот термин и ищет термины, удовлетворяющие этим признакам. Например:

Запрос Вывод
? ЯДОВИТЫЙ МУХОМОР -- ГРИБ, ШЛЯПКА КРАСНАЯ, НЕ ЕДЯТ.
БЛЕДНАЯ ПОГАНКА -- ГРИБ, ШЛЯПКА БЕЛАЯ, ЯДОВИТЫЙ.
ЯДОВИТЫЙ -- НЕ ЕДЯТ.

Если в статье словаря используется термин в качестве признака, то Мини GURU учитывает признаки этого термина при поиске по признакам. Например:

Запрос Вывод
? ГРИБ И НЕ ЕДЯТ. МУХОМОР -- ГРИБ, ШЛЯПКА КРАСНАЯ, НЕ ЕДЯТ.
БЛЕДНАЯ ПОГАНКА -- ГРИБ, ШЛЯПКА БЕЛАЯ, ЯДОВИТЫЙ.

Требуется написать программу, реализующую Мини GURU. 


Функциональные требования:
  1. Программа должна быть реализована в консоли (графический или текстовый режим по выбору студента). Использование визуальных средств должно быть согласовано с преподавателем.
  2. Программа должна предоставлять два варианта пользовательского интерфейса: "командная строка" (описание, приведенное выше) и меню-ориентированный (выбор запроса из списка, многооконный и т.д.).
  3. Терминологический словарь нужно уметь сохранять в файле и загружать из файла.