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):
Aby połączyc diagram z regułami nalezy wykonać dwa kroki:
podzielić reguły na grupy (atrybut ruleflow-group w definicji reguły)
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ły | Grupa |
InvalidPIN | Unauthorized |
BlockAccount | BlockAccount |
AuthGranted | Authorized |
PayOut | Action |
CahspointLimit | Action |
AccountLimit | Action |
Balance | Action |
Unauthorized | BlockAccount |
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.