Вопрос

Я пытаюсь построить основанную на правилах систему для интерпретации данных.Однако у меня возникают проблемы с выбором способа построения логики для хранения и интерпретации правил.

В настоящее время существует структура базы данных, которая довольно сложна, но будет касаться всех аспектов хранения данных правила.Идея заключается в том, что система сможет имитировать способ, которым MS Outlook позволяет пользователю добавлять правила.

Мои проблемы заключаются в следующем:

  1. Какой шаблон я должен использовать для хранения этих правил внутри объектов?
  2. Должен ли я использовать eval() или правильную ориентацию объекта для выполнения правил?

И примером правила может быть:

Собака должно быть, есть воротник в области парк

Где каждый элемент (собака, must have, ошейник, территория, парк) представляет собой отдельный элемент логики, подлежащий интерпретации.

Мы очень ценим любые общие советы по вышеуказанным вопросам!

Это было полезно?

Решение

Я никогда не внедрял систему, подобную описанной вами, в контексте "реального мира", но я много играл с ними в качестве хобби-проектов.Мой предпочтительный подход заключается в использовании какого-то логического языка, такого как Пролог делать утверждения и проверять их.У вас были бы утверждения о том, где находится парк, что значит что-то иметь, что такое собака, а затем вы бы составили правило, почти точно подобное вашему примеру в скобках внизу вашего поста.Мне жаль, что мой Пролог слишком устарел, чтобы привести вам полезный пример...Я слишком долго играл с доморощенными языками вывода.

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

Другие советы

Возможно, этот ответ слишком тривиален / очевиден для вас, но я просто подумал, как бы решить что-то подобное в моем текущем существующем проекте, который является приложением Zend Framework. Я думал о фильтрах и валидаторах, которые использует ZF. Я предполагаю, что у вас есть конечное число возможных входных объектов, конечное число условий / ограничений и конечное число действий. В этом случае вы должны сначала создать экземпляр объекта и запустить его в цепочке условий (валидаторов), если все условия выполнены, вы запускаете объект против actionChain. Здесь я, вероятно, должен был бы внедрить какую-то систему приоритетов действий, поскольку некоторые действия должны выполняться раньше других. Например, «отправить уведомление», а затем «удалить» рассматриваемый объект. Так что в ZF я бы создал собственный валидатор для каждого условия / ограничения. Я не верю, что система Outlook очень умная, а это значит, что я не считаю валидаторы очень общими.

В БД может быть таблица для фактических правил, одна для условий и одна для действий. Тогда может быть две таблицы «многие ко многим», связывающие правило со всеми необходимыми условиями и действиями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top