DemonScript
DemonScript - язык, предназначенный для представления обыденных знаний и проведения логических выводов в условиях неполноты информации. Базовой конструкцией, с которой работает DemonScript является семантическая сеть, состоящая из узлов, соединённых направленными рёбрами. В задачах искусственного интеллекта узлы представляют конкретные или абстрактные сущности (ящик, птица, множество всех птиц и т.д.), а рёбра - отношения между сущностями.
В отличие от языка Prolog:
- В
DemonScript не предполагается замкнутости мира. Если данный факт не введен в систему, она считает его не ложным, а неопределённым. Даже в простых задачах DemonScript работает с трёхзначной логикой: True (истина), False (ложь) и Undef (неопределено: может быть как истиной, так и ложью). - Можно задавать не только истинность фактов, но и их ложность, а также промежуточные значения истинности. Для этого используется обобщение нечёткой логики, т.н. интервальная логика множества миров.
- Аксиомы (правила), описывающие свойства отношений между объектами, не ограничены хорновскими выражениями и могут быть произвольными формулами.
- Язык позволяет совмещать логическое и процедурное программирование. В частности, в аксиомах можно использовать функции-демоны, содержащие произвольные алгоритмы, реализация которых чисто логическими средствами была бы затруднена.
DemonScript доступен для различных платформ (Windows, Mac, Linux). Простые примеры Можно также запускать непосредственно на сайте.
Пример
Приведём пример простой программы на DemonScript. Пусть есть три ящика a, b и с. Известно, что ящик a находится внутри c, а ящик b не находится внутри c. Необходимо ответить на вопросы: находится ли b внутри a?; может ли a находится в b?; если может, то в каком случае?
edges in // типы отношений Mind.add( // свойства отношения in: X !in X, // антирефлексивность X in Z & Z in Y -> X in Y, // транзитивность Z in X & Z in Y -> X in Y | Y in X | X==Y // образует дерево ) nodes a, b, c; // объекты a in c; // ящик a внутри ящика c b !in c; // ящик b не внутри ящика c Mind.set_graph(GRAPH) // логический вывод out b in a //> False (нет) out a in b //> Undef (возможно) if (a in b) == Undef { // не запрещено, поэтому a in b; // пусть a внутри b var Models = Mind.get_models(GRAPH, in) // все возможные модели for M in Models: out M // выводим их }Результатом работы скрипта будет (восклицательный знак означает отрицание):
False Undef GRAPH_1 { a { in: [ c,!a, b] }, b { in: [!c,!b,!a] }, c { in: [!c,!a, b] } }
Документация
Контакты
DemonScript можно использовать в любых некоммерческих проектах. Мы приглашаем к сотрудничеству по его тестированию и разработке различных алгоритмов описания обыденных знаний. Просим сообщать о любых замеченных ошибках, как на сайте, так и при работе с DemonScript. С нами можно связаться по адресу: ds@qudata.com