====== Środowisko prototypowania systemów regułowych. ======
Jakub Turoboś jakub.turobos@gmail.com
* implementacja refactoring dla varda/gvarda/interactive_shell
* ocena przydatności: przyklady
===== Przegląd istniejących rozwiązań =====
==== HJEd (Java) ====
* potencjalnie dobre rozwiązanie, jednak na chwilę obecną niestabilne
* konieczność zastąpienia użytej biblioteki do graficznej reprezentacji grafów (JGraph) inną \\ pomimo poszukiwań wybór jest mocno okrojony, jedyną sensowną opcją wydaje się być [[http://jung.sourceforge.net|JUNG]]
* ciężko ocenić czas potrzebny na wprowadzenie zmian, nie ma też gwarancji na to czy będzie to koniec problemów
* duża ilość klas, niejednokrotnie bardzo obszernych, jednak w większości dobrze okomentowanych
==== Varda/GVarda (Prolog) ====
* rozwiązanie gotowe do rozbudowy
* stosunkowo mniejsza ilość kodu, jednak momentami nie tak łatwa w odbiorze jak kod języka Java
Podsumowując, preferowanym rożwiązaniem na chwilę obecną jest Varda. W zależności od postępu prac, rozwijane być może będą oba rozwiązania.
==== BUGS ====
* GVARDA - błąd parsowania przy próbie finalizacji - stworzenia atrybutu o podobnej nazwie, np. dla atrybutu 'Dat' występuje błąd parsowania, gdy próbujemy stworzyć atrybut 'Data'
===== Scenariusze refaktoring'u =====
[[https://ai.ia.agh.edu.pl/wiki/hekate:ardplus#refactoring|refactoring w teorii ARD+]]
==== Finalizacja ====
=== Zmiana nazwy atrybutu ===
Niezależnie od diagramu (ARD, TPH) oraz poziomu szczegółowości istnieją dwa przypadki, w zależności od edytowanej własności:
- Complex Property (**PC**) - należy z niej wybrać jedną z zawartych w niej własności, po czym postępujemy jak w następnym przypadku
- Simple Property (**PS**) - niezależnie od tego czy własność jest conceptual czy phisical następuje algorytm zmiany nazwy atrybutu opisany [[#Algorytmy refactoring'u|poniżej]]
=== Usuwanie atrybutu ===
Podobnie jak w poprzednim przypadku, istnieją tylko dwa przypadki, w zależności od usuwanej własności, niezależne od diagramu ani poziomu szczegółowości:
- usuwanie jednego z atrybutów należących do własności (w przypadku **PC**)
- usuwanie całej własności
niezależnie od przypadku następuje algorytm usuwania atrybutu opisany [[#Algorytmy refactoring'u|poniżej]]
=== Dodawanie atrybutu ===
Przy dodawaniu nowego atrybutu na poziomie niższym niż aktualny poziom szczegółowości istnieje tylko jedno rozwiązanie - użytkownik musi wybrać (na diagramie TPH) jedną z istniejących transformacji finalizacji i tam dodać nowy atrybut, a następnie tworzyć kolejne transformacje do momentu kiedy:
* osiągnięty zostanie najwyższy poziom szczegółowości
* dodany atrybut w wyniku kolejnych transformacji rozwinięty zostanie w atrybuty fizyczne należące do **PS**, czyli niemożliwe będzie zastosowanie kolejnych transformacji
Wersja minimalna - użytkownik musi wybrać (na diagramie TPH) jedną z istniejących transformacji finalizacji i tam dodać nowy atrybut, a następnie zdefiniować zależności funkcyjne związane z dodanym atrybutem na najbardziej szczegółowym poziomie. Tak dodany atrybut może być dalej rozwijany, jeżeli nie jest on atrybutem fizycznym.
==== Podział ====
=== Modyfikacja zależności funkcyjnych ===
Zależności funkcyjne dowolnego niższego od aktualnego poziomu szczegółowości wygenerować można wykorzystując diagram TPH oraz zależności funkcyjne zdefiniowane na aktualnym poziomie szczegółowości. Proces odwrotny natomiast, czyli wygenerowanie zależności funkcyjnych przy przejściu na wyższy poziom szczegółowości wymaga w przeważającej ilości przypadków ingerencji użytkownika. Dlatego też optymalnym rozwiązaniem wydaje się pozostawienie użytkownikowi swobody modyfikacji zależności funkcyjnych jedynie na najwyższym poziomie szczegółowości diagramu ARD.
=== Modyfikacja przydziału atrybutu do własności ===
Przy modyfikacji przydziału atrybutu do własności w ramach podziału danego **PC** mogą zajść następujące warianty:
* żadna z modyfikowanych własności pochodzących z podziału nie posiada pochodnych
* modyfikowane własności pochodzące z podziału posiadają pochodne
* połączenie dwóch lub własności w pojedynczy **PC**
* rozbicie **PC** na szereg **PS**
* [[|inne...]]
opisy algorytmów powyższych modyfikacji znajdują się [[#Algorytmy refactoring'u|poniżej]].
==== Modyfikacja bieżącego poziomu ====
=== Modyfikacja zależności funkcyjnej ===
Modyfikacja zależności funkcyjnej może polegać na jej:
* usunięciu
* dodaniu
* "przepięciu"
opisy algorytmów powyższych modyfikacji znajdują się [[#Algorytmy refactoring'u|poniżej]].
=== Modyfikacja atrybutów ===
* dodanie/usunięcie/zmiana nazwy - pokryte przez [[#..Finalizacja|finalizację]]
===== Algorytmy refactoring'u ======
==== Finalizacja ====
=== Zmiana nazwy atrybutu ===
- rekurencyjne przeszukanie zbiorów P, D, V dla zadanej nazwy atrybutu
- zmiana nazwy każdego ze znalezionych atrybutów; przerwanie w przeciwnym przypadku
=== Usuwanie atrybutu ===
- utworzenie kolejki/listy lub kilku list własności/atrybutów, zależności oraz pochodnych do usunięcia lub akcji do wykonania (FILO)
- znalezienie takiej pochodnej V = [P1, P2] w zbiorze V, gdzie usuwany atrybut X należy do P2 i nie należy do P1, czyli szukana jest finalizacja, z której pochodzi usuwany atrybut; przerwanie w przeciwnym przypadku
- dopisanie atrybutu X z własności P2 do listy
- znalezienie takiej pochodnej VX = [P2, PX] w zbiorze V, gdzie PX jest PS, czyli szukana jest transformacja podziału dla własności P2 i atrybutu X; przerwanie w przeciwnym przypadku
- dopisanie własności PX oraz pochodnej VX do listy
- znalezienie pochodnych VN = [PX, PN] w zbiorze V
- jeżeli w poprzednim kroku znaleziono pochodne, to dla każdej z nich:
- dopisać PN oraz VN do listy
- zastąpić własność PX własnością PN
- wrócić do kroku 6.
* czy jeżeli istnieją zależności funkcyjne DN,X oraz DX,M, to czy można przy usuwaniu własności X stworzyć zależność DN,M?
- dla każdej z własności/atrybutu X znajdującego się na liście do usunięcia znaleźć w zbiorze D zależności fukcyjne \\ DN,X = [PN, PX] oraz DX,M = [PX, PM], gdzie PX zawiera X
=== Dodawanie atrybutu ===
Analiza istniejących rozwiązań - ewentualne ich wykorzystanie/modyfikacja
==== Podział ====
=== Modyfikacja przydziału atrybutu do własności ===
* żadna z modyfikowanych własności pochodzących z podziału nie posiada pochodnych - prosta edycja transformacji podziału, może być wykonana poprzez usunięcie edytowanej transformacji z zachowaniem atrybutów, a następnie dodanie nowej transformacji podziału z nowym przydziałem atrybutów, po czym może nastąpić ewentualna modyfikacja zależności funkcyjnych
* modyfikowane własności pochodzące z podziału posiadają pochodne
* połączenie dwóch lub własności w pojedynczy **PC** (z wyłączeniem możliwości połączenia wszystkich) - wygenerowanie nowego **PC**, będącego sumą atrybutów własności łączonych, oraz transformacji podziału
* [[|rozbicie **PC** na szereg **PS**]]
* [[|inne...]]
==== Modyfikacja bieżącego poziomu ====
=== Modyfikacja zależności funkcyjnej ===
* usunięcie zależności funkcyjnej:
- przeszukanie zbioru D
- usunięcie znalezionej zależności; przerwanie w przeciwnym przypadku
* dodanie zależności funkcyjnej - wykorzystanie istniejącego rozwiązania
* "przepięcie" zależności funkcyjnej:
- przeszukanie zbioru D
- zastąpienie pierwszego lub drugiego atrybutu znalezionej zależności; przerwanie w przeciwnym przypadku \\ alternatywnie :
- usunięcie modyfikowanej zależności
- dodanie nowej, już zmodyfikowanej zależności
====== Todo ======
* HJED - czy przydatny? na 2.12.2009, decyzja ktore oprogramowanie rozwijac (gvarda/varda, czy hjed), JUNG -- krotki raport, docelowo rozdzial/podrozdzial pracy, opis na 9/12/2009
* przeczytać: http://home.agh.edu.pl/~wojnicki/didactic/mgr-howto.txt
* bardziej szczegolowo scenariusze, przemyslec algorytmy modyfikacji bazy wiedzy odnosnie rafaktoringu 20.01.2010, on hold
* wstep i podst. teoretyczne: 10.02.2010
====== Spis treści ======
- wstep (zgodnie z Howto [[pl:jak_pisac_prace_dyplomowa]]
- Podstawy teoretyczne
- atrybutowe systemy regułowe (prof.Ligeza, Logical Foundations for Rule-Based Systems)
- projektowanie syst. reg. (Mulawka, Systemy Ekspertowe)
- ARD http://winntbg.bg.agh.edu.pl/csl/csltr-1-2009.pdf
- Projekt
- specyfikacja wymagań:
* głóny cel,
* porównanie technlogii (hjed, varda, gvarda),
* przypadki użycia (scenariusze do każdego rodzaju refaktoringu)
- Projekt
* Jakie technologie i dla czego (uzasadnienie wyboru, na podstawie analizay varda/gvarda/hjed)
* predykaty
* GUI
- Implementacja
* co zostało zaimplementowane: predykaty, GUI
* Szczegóły implementacyjne
* Problemy z implementacją
* jak zostały spełnione wymagania.
- Użycie/Testy
* realizacja przypadkow użycia, zastosowanie predykatow, GUI w akcji, diagramy.
- Podsumowanie
Termin obrony: czerwiec.