Двигатель для вычисления сопоставления в соответствии с внутренними правилами

StackOverflow https://stackoverflow.com/questions/2897484

Вопрос

У меня есть набор объектов с атрибутами и куча правил, которые применительно к набору объектов обеспечивают подмножество этих объектов. Чтобы облегчить понять, что я предоставим конкретный пример.

Мои объекты являются лицами, и у каждого есть три атрибута: страна происхождения, гендерная и возрастная группа (все атрибуты дискретные). У меня есть куча правил, таких как «все самцы из США», которые соответствуют подмножеству этого большого набора объектов.

Я ищу либо существующий Java «INFERACING EQUINAFIC, или что-то подобное, которое сможет сопоставить правила к подмножеству лиц или совет о том, как пойти на создание собственного. Я прочитал двигатели правил, но этот термин, похоже, используется исключительно для экспертных систем, которые исключают бизнес-правила, и обычно не включает в себя какую-либо расширенную форму выхода. Вот несколько примеров более сложных сценариев, с которыми я должен иметь дело с:

  1. Мне нужны соединение правил. Поэтому, когда представлены как с обоими «включают все мужчины» и «исключить всех нас людей в возрасте 10 лет», «я заинтересуюсь только у мужчин за пределами США, а мужчин в пределах США, которые находятся за пределами 10 - 20 возрастная группа.

  2. Правила могут иметь разные приоритеты (явно определенные). Таким образом, правило, говорящее «исключить всех самцов», будет переопределять правило, говоря, «включать все мужчины США».

  3. Правила могут быть противоречивыми. Таким образом, я мог бы иметь как «включить все мужчины», и «исключить всех самцов», в этом случае приоритеты должны будут урегулировать проблему.

  4. Правила симметричны. Итак, «включать всех самцов» эквивалентно «исключить все самки».

  5. Правила (или точнее подмножества) могут иметь мета правил (явно определенные), связанные с ними. Эти мета правила должны будут применяться в любом случае, что исходное правило применяется, или если подмножество достигнуто через вывод. Итак, если мета правил «исключения США» прилагается к правилу «включать все мужчины», и я предоставляю двигатель с правилом «исключить всех женщин», он должен быть в состоянии вывести подмножество «исключения всех женщин» эквивалентно «включать всех самцов» подмножество и как такое применение правила «исключения США» дополнительно.

Я могу во всей вероятности жить без предмета 5, но мне нужны все другие упомянутые свойства. Как мои правила, так и объекты хранятся в базе данных и могут быть обновлены на любом этапе, поэтому мне нужно будет создавать «двигатель вывода» при необходимости и уничтожения его потом.

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

Решение

Есть куча встроенных проловых SLLD Rolvers для Java; мой любимый подход должен использовать Мини-Каньер для Scala, Поскольку это чисто, и позволяет вам использовать Scala, чтобы лениво обрабатывать результаты запросов, но я не использовал его ни на некоторой глубине. Видеть Встроенный проинтектор / компилятор для Java Для других вариантов, а также ответ Ross.

SLLV Solvers обрабатывают все ваши критерии, при условии, что у них есть некоторые дополнительные функции, которые имеют пролог:

  1. Соединение правил: базовая обработка цели SLD;
  2. Правила могут иметь разные приоритеты: правило сокращения пролога позволяет представить отрицание, при условии, что запросы являются разрешимыми;
  3. Правила могут быть противоречивыми: Опять же, с разрезами Вы можете гарантировать, что более низкие приоритетные пункты не применяются, если довольны более высокими приоритетами. Есть несколько способов сделать это.
  4. Правила являются симметричными: с вырезом, это легко обеспечивается для удаленных предикатов.
  5. Правила (или точнее подмножества) могут иметь мета правил (явно определенные), связанные с ними: ваш пример, кажется, предложит, что это эквивалентно 4, поэтому я не уверен, что получаю то, что вы здесь.

Преимущества и недостатки SLLD Solvers по поводу описания логических инструментов:

  1. Программная мощность, гибкость: вы, как правило, находят решения для программирования для моделирования трудностей, где кажется, что логики описания могут потребовать от переосмысления ваших моделей. Но, конечно, отсутствие протоки-ленты означает, что описание логических решений заставляет вас чистить, что может быть хорошей дисциплиной.
  2. Уплотность: SLLD Solvers очень хорошо понятны технологии, в то время как описание логические инструменты часто не имеют большого количества шагов от рождения в докторской диссертации.
  3. Отсутствие семантических инструментов: Описание Логика имеет хорошие ссылки с логикой первого порядка и модельной логикой, и дает вам очень богатый набор методов для рассуждения о них. Гибкость пролога обычно делает это очень тяжело.

Если у вас нет особых опытов в описании логики, я бы порекомендовал 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.

http://jboss.org/drols.

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

Если вы можете лучше управлять своим клиентом или проблемным доменом, лучше вообще избежать двигателей вывода.

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