Drools II

Diagram Drools Flow

Diagram DroolsFlow dodany na poprzednich zajęciach jest bardzo prosty i nie jest połączony w żaden sposób z regułami. Uruchom diagram Drools Flow analogicznie jak poprzednio uruchamialiśmy przykład HelloWorld i prześledź jego działanie.

Następnie zbuduj diagram, który będzie wyglądał tak jak ten poniżej (zmodyfikuj diagram z przykładu):

Cashpoint

Aby połączyc diagram z regułami nalezy wykonać dwa kroki:

  1. podzielić reguły na grupy (atrybut ruleflow-group w definicji reguły)
  2. przypisać grupy do bloczków na diagramie (pole RuleFlowGroup we właściwościach bloczka)

ruleflow-group i RuleFlowGroup

Każda reguła może zostać przypisana do grupy dzięki atrybutowi ruleflow-group:

rule "NazwaReguły"
  ruleflow-group "NazwaGrupy"
when
  // Część warunkowa
then
  // Operacje wykonywane w przypadku gdy część warunkowa jest prawdziwa
end

Każda grupa reguł jest reprezentowana ana diagramie przez bloczek o nazwie RuleFlowGroup. Po kliknięciu na bloczek w zakładce Properties znajdującej się wo dolnej części ekranu należy uzupełnić dwie wartości:

  • Name - nazwa bloczka wyświetlana na diagramie. Nie ma ona żadnego funkcjonalnego znaczenia
  • RuleFlowGroup - nazwa grupy, którą bloczek reprezentuje. Musi ona być identyczna jak nazwa atrybutu ruleflow-group w pliku reguł.

Ćwiczenie

Przypisz reguły do grup (ruleflow-group) oraz przypisz bloczki do reguł (RuleFlowGroup ) w następujący sposób:

Nazwa regułyGrupa
InvalidPINUnauthorized
BlockAccountBlockAccount
AuthGrantedAuthorized
PayOutAction
CahspointLimitAction
AccountLimitAction
BalanceAction
UnauthorizedBlockAccount

W związku z tym, że teraz sterowanie wnioskowaniem będzie wykonywane na innym poziomie, można usunąć atrybuty salience z definicji reguł.

Split i Join

Bloki Split i Join pełnią funkcję analogiczną do multiplekserów i demultiplekserów. Każdy bloczek musi mieć ustalony typ. Typy bloków różnią się w zależności od tego czy jest to blok Split czy Join. Aby dowiedzieć się więcej na temat typów dla Split i Join przeczytaj to.

Zwróć uwagę na bloczek typu Split o nazwie PIN Correct?. Na połączeniach wychodzących z niego znajdują się etykiety. Oznaczają one warunki jakie muszą być spełnione aby została przetworzona część diagramu znajdująca się za danym połączeniem.

Aby edytować warunki należy kliknąć na bloczek i w oknie Properties znajdującego się na dole ekranu kliknąć na guzik edycji w wierszu Constraints. Do zapisu warunków używamy tego samego języka co w przypadku reguł. Uzupełnij warunki na połączeniach bloczka PIN Correct? w budowanym przez siebie diagramie

Ćwiczenie

Ustal typy bloków Join i Split znajdujących się na diagramie.

Po zbudowaniu diagramu, zmodyfikuj metodę readKnowledgeBase w RuleFlowTest.java w katalogu stc/main/java dodaj±c pliki reguł do bazy wiedzy

kbuilder.add(ResourceFactory.newClassPathResource("NazwaPlikuZRegulami.drl"), ResourceType.DRL);

Analogicznie jak na poprzednich laboratoriach dodaj obiekty klas Bankomat i Konto a następnie uruchom wnioskowanie.

Interakcja z użytkownikiem

W częściach decyzyjnych reguł InvalidPIN i AuthGranted dopisz kod odpowiedzialny za pobieranie od użytkownika numeru PIN i oraz żądanej akcji (wyświetlenie salda, wybranie gotówki wraz z kwotą).

Na przykład:

rule "InvalidPIN"
  ruleflow-group "Unauthorized"
  when
    k : Konto(poprawnyPIN!=wpisanyPIN, iloscProb < 3)
  then 
    k.incProby();
 
    System.out.println("Wpisz PIN: ");
    Scanner s = new Scanner(System.in);
    int pin = s.nextInt();
 
    k.setWpisanyPIN(pin);
    update(k);
end

Uwaga!!!

Zwróć uwagę, że dzięki zastosowaniu sterowania wnioskowaniem, można pominać niektóre warunki w LHS reguł. Które? Dlaczego?

Dodatkowo jeśli chcemy, aby możliwe było potrójne wpisywanie wartości PIN, musimy usunąć atrybut no-loop z reguł w grupie Unauthorized.

Komentarze

Z braku lepszego miejsca tutaj studenci wpisują komentarze natury ogólnej do tego lab. 8-)

  • Żeby zobaczyć właściwości bloczka, należy otworzyć perspektywę Drools (Window→Open Perspective→Other…→Drools)
pl/dydaktyka/piw/2010/systemy_ekspertowe/drools_ii.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0