Скрипт не обрабатывает кольцевые и ранговые правила(в связи с тем, что я тупой и не до конца понял, что творится в этой жизни).
- Чтобы собрать Docker образ нужно использовать команду(для удобства из текущей директории проекта):
docker build -t lab1 .
В данном случае создастся образ с именем lab1
- Для запуска Docker контейнера по существующему образу нужно использовать команду:
docker run -it --rm lab1
Благодаря параметру --rm контейнер удалится после завершения работы скрипта
- Генерируются факты и правила.
- Правила приводятся к более удобному виду.
В исходном варианте все правила имеют вид: [ { if:{'operand : [numbers]'},then: number}, ...].
Все факты сортируются в 3 отдельных массива по логическому операнду и каждый массив имеет более удобный вид
[ [ [if], then ], ...]
- Факты приводястя к более удобному виду.
Изначально факты расположены в одномерном массиве и для того, чтобы избежать прогона по всему массиву ( O(n) )
и повторения фактов они помещаются в словарь по сигнатуре { number:True }, если числа нет, то метод get() вернёт None.
- На переработанных данных запускается скрипт проверки фактов.
При проверке правила or ищется хотя бы одно совпадение условия и факт. В таком случае факт добавляется в БЗ.
При проверке правила and ищется хотя бы одно несовпадение условия и факта. В таком случае факт не добавляется в БЗ.
При проверке праила not ищется хотя бы одно совпадение условия и факта. В таком случае факт не добавляется в БЗ.
- Декоративной функцией time() замеряется время работы функции по добавлению правил.