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:
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:
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ł.
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
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.
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
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.
Z braku lepszego miejsca tutaj studenci wpisują komentarze natury ogólnej do tego lab.