Двигатель для вычисления сопоставления в соответствии с внутренними правилами
-
04-10-2019 - |
Вопрос
У меня есть набор объектов с атрибутами и куча правил, которые применительно к набору объектов обеспечивают подмножество этих объектов. Чтобы облегчить понять, что я предоставим конкретный пример.
Мои объекты являются лицами, и у каждого есть три атрибута: страна происхождения, гендерная и возрастная группа (все атрибуты дискретные). У меня есть куча правил, таких как «все самцы из США», которые соответствуют подмножеству этого большого набора объектов.
Я ищу либо существующий Java «INFERACING EQUINAFIC, или что-то подобное, которое сможет сопоставить правила к подмножеству лиц или совет о том, как пойти на создание собственного. Я прочитал двигатели правил, но этот термин, похоже, используется исключительно для экспертных систем, которые исключают бизнес-правила, и обычно не включает в себя какую-либо расширенную форму выхода. Вот несколько примеров более сложных сценариев, с которыми я должен иметь дело с:
Мне нужны соединение правил. Поэтому, когда представлены как с обоими «включают все мужчины» и «исключить всех нас людей в возрасте 10 лет», «я заинтересуюсь только у мужчин за пределами США, а мужчин в пределах США, которые находятся за пределами 10 - 20 возрастная группа.
Правила могут иметь разные приоритеты (явно определенные). Таким образом, правило, говорящее «исключить всех самцов», будет переопределять правило, говоря, «включать все мужчины США».
Правила могут быть противоречивыми. Таким образом, я мог бы иметь как «включить все мужчины», и «исключить всех самцов», в этом случае приоритеты должны будут урегулировать проблему.
Правила симметричны. Итак, «включать всех самцов» эквивалентно «исключить все самки».
Правила (или точнее подмножества) могут иметь мета правил (явно определенные), связанные с ними. Эти мета правила должны будут применяться в любом случае, что исходное правило применяется, или если подмножество достигнуто через вывод. Итак, если мета правил «исключения США» прилагается к правилу «включать все мужчины», и я предоставляю двигатель с правилом «исключить всех женщин», он должен быть в состоянии вывести подмножество «исключения всех женщин» эквивалентно «включать всех самцов» подмножество и как такое применение правила «исключения США» дополнительно.
Я могу во всей вероятности жить без предмета 5, но мне нужны все другие упомянутые свойства. Как мои правила, так и объекты хранятся в базе данных и могут быть обновлены на любом этапе, поэтому мне нужно будет создавать «двигатель вывода» при необходимости и уничтожения его потом.
Решение
Есть куча встроенных проловых SLLD Rolvers для Java; мой любимый подход должен использовать Мини-Каньер для Scala, Поскольку это чисто, и позволяет вам использовать Scala, чтобы лениво обрабатывать результаты запросов, но я не использовал его ни на некоторой глубине. Видеть Встроенный проинтектор / компилятор для Java Для других вариантов, а также ответ Ross.
SLLV Solvers обрабатывают все ваши критерии, при условии, что у них есть некоторые дополнительные функции, которые имеют пролог:
- Соединение правил: базовая обработка цели SLD;
- Правила могут иметь разные приоритеты: правило сокращения пролога позволяет представить отрицание, при условии, что запросы являются разрешимыми;
- Правила могут быть противоречивыми: Опять же, с разрезами Вы можете гарантировать, что более низкие приоритетные пункты не применяются, если довольны более высокими приоритетами. Есть несколько способов сделать это.
- Правила являются симметричными: с вырезом, это легко обеспечивается для удаленных предикатов.
- Правила (или точнее подмножества) могут иметь мета правил (явно определенные), связанные с ними: ваш пример, кажется, предложит, что это эквивалентно 4, поэтому я не уверен, что получаю то, что вы здесь.
Преимущества и недостатки SLLD Solvers по поводу описания логических инструментов:
- Программная мощность, гибкость: вы, как правило, находят решения для программирования для моделирования трудностей, где кажется, что логики описания могут потребовать от переосмысления ваших моделей. Но, конечно, отсутствие протоки-ленты означает, что описание логических решений заставляет вас чистить, что может быть хорошей дисциплиной.
- Уплотность: SLLD Solvers очень хорошо понятны технологии, в то время как описание логические инструменты часто не имеют большого количества шагов от рождения в докторской диссертации.
- Отсутствие семантических инструментов: Описание Логика имеет хорошие ссылки с логикой первого порядка и модельной логикой, и дает вам очень богатый набор методов для рассуждения о них. Гибкость пролога обычно делает это очень тяжело.
Если у вас нет особых опытов в описании логики, я бы порекомендовал SLLD Solver.
Другие советы
Для того, что вы описываете, я думаю, что вы захотите использовать обратную цепочку, а не плавную цепочку (печатные системы, такие как слюни, являются прядиками, в их поведении по умолчанию).
Проверить туролог. Отказ Легко связать с Java, 100% чистой Java, и, безусловно, может сделать вывод вы хотите. Вам нужно будет понять достаточно о прологе, чтобы охарактеризовать набор вашего правила.
Прова Может также сделать выводимые и обрабатывать сложные системы правил.
Это в значительной степени звучит как описание логики и базы знаний для меня. У вас есть концепции, роли и индивидуальные.
Если вы хотите развернуть свою проблему в качестве описания, основанные на логике рассуждения, вы должны быть в хорошем моделировании вашей проблемы и выполнить на нем разум.
Есть несколько бесплатных аналистов, доступных, список можно найти здесь.
Однако отметьте, что это скорее сложный, но мощный подход.
Возможно, вы захотите иметь особый взгляд на Kaon2. а также КОПАТЬ При использовании Java.
Я верю, что вы могли бы использовать вроде Алгоритм ID3 Чтобы извлечь набор правил из исходного состояния ваших объектов. Я не знаю никаких конкретных реализации Java, хотя Википедия указывает на разные реализации от Ruby до C (я не могу публиковать более одной гиперссылки :-)), но это не твердый алгоритм, чтобы учиться.
После того, как он создает дерево решений, которое можно выразить в формате правила, вы можете использовать его, чтобы увидеть, к какому классу принадлежит ваши объекты: ко всем мужчинам из США, ко всем самам от 10 до 20, ... и когда кто-то обновляет Ваши объекты в базе данных, вы можете восстановить дерево решений.
Хорошо, это может быть тупой ответ. Но я попробую все равно .... Вы могли бы использовать Beanshell, чтобы сделать такие вещи:
Создайте простой селекторную команду (что-то вроде выбора (ИНКУДЕНТАЛЬ, PALAMNAME, PAMPLAMVALUE)), которые возвращают установленные элементы, которые в Escysists и соответствуют пароду.
Создайте некоторые константы, которые могут помочь вам написать хорошие сценарии Beanshell.
Таким образом, вы можете написать свои правила как простые скрипты и правила гнезда.
Итак, это
Мне нужны соединение правил. Поэтому, когда представлены как с обоими «включают все мужчины» и «исключить всех нас людей в возрасте 10 лет», «я заинтересуюсь только у мужчин за пределами США, а мужчин в пределах США, которые находятся за пределами 10 - 20 возрастная группа.
станет сценарием, как это:
originalSet = getOriginalSet(); //Get all from DB
//elements in originalSet that have gender=male
males = select(originalSet, PARAM.GENDER, GENDER.MALE);
//elements in males that have age in [10,20]
youngMaleGuys = select(males, PARAM.AGE, AGE.10_20);
//Exclude from
males.removeAll(youngMaleGuys);
notYoungUSMaleGuys = select(males, PARAM.COUNTRY, COUNTRY.US);
males.removeAll(notYoungUSMaleGuys);
return resp;
Конечно, это отстой. Я сделал это сейчас. Но вы можете написать очень хорошие команды и найти способ сделать это более читаемым.
Не так быстро, но легко Mantain и читать (я думаю). И вам не нужно беспокоить о заказе
Вот и все. Я старался. :)
Одним из самых мощных двигателей правил производства на основе Java (Enfavence Engine) является JBOSS DROOLS.
Хотя я буду честен, если только ваше приложение не станет намного сложнее, используя двигатель правил - это накладки. С другой стороны, если вам приложение становится слишком большим и имеет слишком много противоречивых правил, то он не сможет предоставить результат.
Если вы можете лучше управлять своим клиентом или проблемным доменом, лучше вообще избежать двигателей вывода.