Механизм логического вывода для вычисления набора соответствия в соответствии с внутренними правилами - PullRequest
7 голосов
/ 24 мая 2010

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

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

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

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

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

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

  4. Правила симметричны.Таким образом, «включить всех мужчин» эквивалентно «исключить всех женщин».

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

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

Ответы [ 6 ]

3 голосов
/ 22 октября 2010

Существует множество встроенных Prolog-подобных решений для SLD для Java; Мой любимый подход - использовать mini-Kanren для Scala , поскольку он чистый и позволяет использовать Scala для ленивой обработки результатов запросов, но я не использовал его подробно. См. Embedded Prolog Interpreter / Compiler для Java для других опций, а также ответ Росса.

Решатели SLD отвечают всем вашим критериям при условии, что у них есть некоторые дополнительные функции, которыми обладает Prolog:

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

Преимущества и недостатки решателей SLD по сравнению с инструментами на основе логики описания:

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

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

2 голосов
/ 19 октября 2010

В случае, который вы описываете, я думаю, что вы захотите использовать цепочку в обратном направлении, а не цепочку в прямом направлении (RETE-системы, такие как Drools, используют цепочку в прямом направлении в своем поведении по умолчанию).

Выезд tuProlog . Легко связывается с Java, 100% чистой Java, и, безусловно, может сделать вывод, который вы хотите. Вам нужно будет понять достаточно о Прологе, чтобы охарактеризовать ваш набор правил.

Prova также может выполнять вывод и обрабатывать сложные системы правил.

0 голосов
/ 23 сентября 2010

Одним из самых мощных механизмов правил производства на основе Java (механизмом логического вывода) является JBoss DROOLS.

http://jboss.org/drools

Я буду честен, хотя, если ваше приложение не станет намного более сложным, использование движка правил ВАЖНО излишне. С другой стороны, если ваше приложение становится слишком большим и имеет слишком много конфликтующих правил, то оно не сможет обеспечить результат.

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

0 голосов
/ 16 сентября 2010

Хорошо, это может быть глупый ответ.Но я все равно попробую .... Вы можете использовать BeanShell для создания таких вещей:

  • Создать простую команду селектора (что-то вроде select (inicialSet, paramName, paramValue)), которая возвращаетнабор элементов, который находится в inicialSet и соответствует вашим параметрам.

  • Создайте несколько констант, которые могут помочь вам написать хорошие сценарии BeanShell.

Таким образомВы можете написать свои правила в виде простых сценариев и вложенных правил.

Итак, это

Мне нужно сочетание правил.Поэтому, когда представлены оба слова «включают всех мужчин» и «исключают всех лиц США в возрастной группе 10–20 лет», «меня интересуют только мужчины за пределами США и мужчины в США, которые находятся за пределами 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;

Конечно, это отстой.Я сделал это сейчас.Но вы можете написать очень хорошие команды и найти способ сделать это более читабельным.

Не так быстро, но легко поддерживать и читать (я думаю).И вам не нужно беспокоиться о заказе

Вот и все.Я старался.:)

0 голосов
/ 23 июня 2010

Я полагаю, что вы могли бы использовать алгоритм ID3 для извлечения набора правил из начального состояния ваших объектов. Я не знаю какой-либо конкретной реализации Java, хотя Википедия указывает на различные реализации от Ruby до C (я не могу опубликовать более одной гиперссылки :-)), но это не сложный алгоритм для изучения.

Как только оно построит дерево решений, которое может быть выражено в формате правила, вы можете использовать его, чтобы увидеть, к какому классу принадлежат ваши объекты: всем мужчинам из США, всем женщинам от 10 до 20 лет ... когда кто-то обновляет ваши объекты в базе данных, вы можете перестроить дерево решений.

0 голосов
/ 24 мая 2010

Для меня это звучит как логика описания и базы знаний.У вас есть понятия, роли и индивидуумы.

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

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

Обратите внимание, что это довольно сложный, но мощный подход.

При использовании Java вам может понадобиться особый взгляд на KAON2 и DIG .

...