2013-11-15 3 views
1

В этом сообщении предлагается добавить некоторые классы фактов в качестве способа правил вложенности. http://drools.46999.n3.nabble.com/How-can-I-nested-rules-td4020488.html#a4020681Drools - правила вложения с использованием класса факсов

Что я хотел бы знать - существует ли гарантия того, что «Возраст и пол женщины» выполняются до «Беременные» и «Беременные» до «Беременности2»? Насколько я заметил, это всегда имеет место в моем приложении. Но документировано ли это где-то в документации по слюням или это просто карточный домик, который ждет краха?

rule "Age and gender women" 
    when 
     $p : Person(p1 >= 12 && p2 = 1) 
    then 
     insertLogical(new CouldHaveBeenPregnant($p)); 
end 

rule "Pregnant" 
    when 
     $p : Person(p3 > 1) 
     CouldHaveBeenPregnant(person == $p) 
    then 
     insertLogical(new HasBeenPregnant($p)); 
end 

rule "Pregnant2" 
    no-loop 
    when 
     $p : Person(p4 <= P3) 
     HasBeenPregnant(person == $p) 
    then 
     $p.setStatus("OK"); 
     update($p); 
end 

Спасибо за помощь заранее

EDIT: возникает Моя проблема, когда я должен добавить новое правило, говорят «не беременна», где я должен сделать что-то, когда человек не HasBeenPregnant (person == $ p). Принцип вывода не работает иногда (как и ожидалось). Потому что иногда правило «не беременных» запускается первым, и выясняется позже, что человек беременен, а потом «беременна» становится правдой. Но результат для «не беременных» уже запущен.

Итак, любое предложение о том, как преодолеть это?

+0

Насколько я знаю, порядок, в котором испытываются правила должны не имеет значения. Когда факт вставлен (или удален или изменен), который имеет отношение к некоторым другим правилам, эти правила снова проверяются. –

ответ

1

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

Первое правило будет активироваться, если в рабочей памяти есть персональный факт с соответствующими свойствами.

Второе правило не будет активироваться до тех пор, пока в рабочей памяти не появится Лицо в рабочей памяти и факт, который называется CouldHaveBeenPregnant, который ссылается на человека. CouldHaveBeenPregnant работает только в рабочей памяти, когда правило 1 активировано и вставлено.

Аналогичным образом, третье правило активируется только тогда, когда есть Лицо с соответствующими свойствами и a HasBeenPregnant факт, ссылающийся на этого человека. Факт HasBeenPregnant вводится только вторым правилом.

т.е. Правило 3 не может активировать только после правила 2, который не может активировать только после правила 1.

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

http://blog.athico.com/2009/11/what-is-inference-and-how-does-it.html

+0

Привет, Стив, Большое вам спасибо за повтор. Это статья, которую мне нужно было прочитать. Моя проблема возникает, когда мне нужно добавить новое правило, скажем, «не беременна», где я должен что-то делать, когда человек НЕ является HasBeenPregnant (person == $ p). Это правило вывода не работает (как и ожидалось). Итак, какое-либо предложение о том, как преодолеть это? – Anu

+0

Это должно быть хорошо. Я подозреваю, что ваше неожиданное поведение, вероятно, происходит, потому что есть две причины, почему HasBeenPregnant не работает в рабочей памяти. Во-первых, потому что пациент никогда не был беременным, но также, когда правило 2 еще не активировалось. Одним из вариантов было бы обеспечить, чтобы вышеприведенные правила имели более высокую «значимость», чтобы гарантировать, что они будут активированы в первую очередь. Альтернативным, вероятно, более безопасным вариантом может быть создание отдельного факта HasNeverBeenPregnant, и писать правила против этого, а не предполагать, что несуществование HasBeenPregnant подразумевает одно и то же. – Steve

+0

Спасибо Стив. Из журналов я вижу, что поведение было связано с тем, что правило еще не активировано. Мне нравится второе предложение (потому что вы не хотите вводить управление потоком с использованием значимости). Но иногда фактическое условие в правилах связано с условием «и». Отрицание всех условий удваивает мои усилия по развитию. Кроме того, как вам известно, мы должны отрицать использование условия «ИЛИ», и это приводит к исходу правила более одного раза, если более одного условия становятся истинными, что нежелательно. Любой лучший способ сделать это? Минуты × Комментарии могут быть отредактированы только за 5 минут – Anu

 Смежные вопросы

  • Нет связанных вопросов^_^