====== Opis ====== __**Projekt zakończony**__ Tomasz Pałosz - translacja XTTML -> R2ML 8-) XTTML - format, który ma powstać na bazie XTT. [[https://ai.ia.agh.edu.pl/wiki/hekate:hekate_concepts?s=xtt#xtt | XTT]] jest tabelarycznym sposobem reprezentacji wiedzy. R2ML - jest obszernym i wygodnym zestawem zasad XMLowych pozwalającym na * wymianę zasad pomiędzy różnymi systemami i programami. * wzbogacanie ontologi za pomocą zasad. ====== Spotkania ====== [[https://ai.ia.agh.edu.pl/wiki/pl:miw:miw08_xtt_r2ml:spotkania|Spotkania]] ====== Projekt ====== ====== Sprawozdanie ====== XTTML - format, który ma powstać na bazie XTT. XTT jest tabelarycznym sposobem reprezentacji wiedzy. R2ML - jest obszernym i wygodnym zestawem zasad XMLowych pozwalającym na * wymianę zasad pomiędzy różnymi systemami i programami. * wzbogacanie ontologi za pomocą zasad. ===== Przykład ===== Rule 1: (AE_PTC04): If all of the following are true, then the car's Potential Theft Rating is moderate: * car's price is between $20000 and $45000. * car model is not on the list of "High Theft probability Auto". Kod opisujący słownik dla podanej reguły: Kod opisujący podaną //regułę// (R2ML): Źródło przykładu: [[http://oxygen.informatik.tu-cottbus.de/rewerse-i1/?q=node/33]] [[http://code.google.com/p/take/source/diff?r=523&format=side&path=/trunk/R2MLAdapter/testsrc/test/nz/org/take/r2ml/f/rules.r2ml | Spory przykład USserv Derby]] ===== Metamodel ===== [[http://oxygen.informatik.tu-cottbus.de/R2ML/0.5/metamodel/R2MLv0.5.htm]] ===== Production Rule definition ===== A production rule is a statement of programming logic that specifies the execution of one or more actions in the case that its conditions are satisfied. Production rules therefore have an operational semantic (formalizing state changes, e.g., on the basis of a state transition system formalism). The effect of executing production rules may depend on the ordering of the rules, irrespective of whether such ordering is defined by the rule execution mechanism or the ordered representation of the rules. The production rule is typically represented as: if [condition] then [action-list] Some implementations extend this definition to include an "else" construct as follows: if [condition] then [action-list] else [alternative-action-list] although this form is not considered for PRR; all rules that contain an "else" statement can be reduced to the first form without an "else", and the semantics for interpreting when "else" actions are executed may be complex in some Inferencing schemes. Note that this implies that a conversion from a PSM to a PIM might be complete but not reversible. Rules with "else" statements in a PSM would result in multiple PIM rules which could not then be translated back into the original rules. The new rules would be functionally equivalent, however. ===== Translacje do innych formatów ===== Dostępne są następujące translacje z użyciem języka R2ML: [[http://oxygen.informatik.tu-cottbus.de/rewerse-i1/?q=node/15]] * R2ML to F-Logic * F-LogicXML to R2ML * R2ML to Jess * R2ML to RuleML * RuleML to R2ML * R2ML to JenaRules * JenaRules to R2ML * [[http://oxygen.informatik.tu-cottbus.de/translator/R2MLtoJBossRules/ | R2ML to JBoss Rules]] * SWRL to R2ML * R2ML to SWRL * R2ML to XMI * R2ML to OCL * OCL to R2ML Translacja do RIF: W planach jest taki translator, ale w tej chwili nie ma go jeszcze zaimplementowanego. Atrybuty, z których korzystają oba formaty (RIF i R2ML) w podstawowej wersji są takie same tj. zgodne z rdf oraz xsd. ===== Thermostat ===== Każdą z poniższych reguł można sprawdzić za pomocą: * [[http://oxygen.informatik.tu-cottbus.de/verbalization/index.jsp | werbalizera]] * [[http://oxygen.informatik.tu-cottbus.de/visualization/v3/ | wizualizera]] === Thermostat === [[hekate:hekate_case_thermostat | Reguły termostatu]] [[https://ai.ia.agh.edu.pl/wiki/pl:miw:miw08_xtt_r2ml:thermostat | thermostat in R2ML]] === Dodatki === Możliwe rozszerzenia powyższego kodu: 1. znalazłem typ zmiennych r2mlv:dayOfWeek, który można wykorzystać źródło: [[http://oxygen.informatik.tu-cottbus.de/R2ML/0.5/r2mlv.xsd]] 2. time (czas) można określać jak wartość integer (określając czas jako parametr z przedziału 0-24): 3. Podobnie jak z czasem można postąpić z thermostat_setting: ===== Drools ===== * {{:hekate:2005_product_derby.pdf|wersja lokalna}} * [[http://labs.jboss.com/drools/documentation.html]] * [[http://docs.codehaus.org/display/DROOLS/Home]] [[drools_uzycie|Dostęp do systemu Drools w IA.]] Istnieje problem z translacją słowników (Vocabulary). Translator ucina wpisy . Poza tym translator działa tylko na regułach typu "ProductionRule". W mailu od dr Adriana Giurca otrzymałem potwierdzenie tej informacji. Cały translator oparty jest na wersji 0.4 R2ML'a i stąd moje problemy z nim. Otrzymałem także informację, że klasy napisane w javie powinny rozwiązać problem. I jeszcze konkluzja: "However, testing your example I found some other errors in the translation :) I will come back with a new email soon." Przypuszczałem, że translacja nie jest poprawna, ale bez dobrej znajomości JBOSS'a nie byłem w stanie tego uargumentować. Przeglądnąłem przykład z biletami, zamiast Vocabulary klasy napisane są w JAVIE pod Eclipsem. Spróbuję na podstawie projektu example stworzyć podobny z klasą Date mającą początkowo atrybuty: day, today, później dodam: time, month, season. Umieściłem regułę na drools. Umieściłem także na moim koncie skompilowane klasy wypisane poniżej. Nadal drools wyrzuca błąd. Przeszukałem definicji klas w tym przykładzie z biletami i nie znalazłem nigdzie problemu. Klasy potrzebne do działania reguł przekonwertowanych na JBOSS package org.drools.examples; public static class Date { private String day; private String today; private int time; private String month; private String season; public Date() { } public String getDay() { return this.day; } public void setDay(final String day) { this.day = day; } public String getToday() { return this.today; } public void setToday(final String today) { this.today = today; } public String getMonth() { return this.month; } public void setMonth(final String month) { this.month = month; } public String getSeason() { return this.season; } public void setSeason(final String season) { this.season = season; } public int getTime() { return this.time; } public void setTime(final int time) { this.time = time; } } public static class Operation { private String kind; public Operation() { } public String getKind() { return this.kind; } public void setKind(final String kind) { this.kind = kind; } } public static class Thermostat { private String thermostat_setting; public Thermostat() { } public String getThermostat_setting() { return this.thermostat_setting; } public void setThermostat_setting(final String thermostat_setting) { this.thermostat_setting = thermostat_setting; } } [[http://www.businessrulesforum.com/2005/userv | Link do przykładu kodu samochodów - dostęp wymaga hasła]] [[http://viewvc.jboss.org/cgi-bin/viewvc.cgi/labs/labs/jbossrules/trunk/drools-examples/drools-examples-drl/src/main/java/org/drools/examples/TroubleTicketExample.java?revision=15167&view=markup&pathrev=18477 | Przykład kodu klas potrzebnych do drools]] Dodałem te importy, które są w tym przykładzie i spróbowałem skompilować na borgu. Okazuje się, że borg nie posiada tych plików. Można stwierdzić na tej podstawie, że brakuje ich na serwerze. ===== Minicases ===== Zakładam, że InvokeActionExpression wywołuje reguły, które jako argument mają podany atrybut klasy. Jest jeszcze możliwość wpisania w InvokeActionExpression ID reguły, bez contextu. 1 przypadek przechodzi sprawdzenie xsd, ale 2 nie jest zgodny. Bazując na poniższych przypadkach (minicases) można stwierdzić, że da się przekonwertować XTTML do R2ML. Niestety użyte rozwiązanie wykorzystujące InvokeActionExpression nie jest zgodne w pełni z regułami R2ML. To znaczy xmlstarlet najczęściej stwierdza poprawność reguł. Jednak vizualizer i verbalizer nie pokazują poprawnie skonstruowanych reguł. ==== restrictive behavior ==== Reguła: if X > 2 then Y = X Efekt werbalizacji: If X is greater than 2 then X is equal to Y. 1 2 3 4 5 if X > 2 then Y = X ==== restrictive behavior and multiple values ==== grade || nrfail | grmean | nrgrades | ----------------------|----------------------------- =2 || =count(grade)| | | || | =mean(grade) |=count(grade)| Tej reguły najprawdopodobniej nie da się przedstawić za pomocą języka R2ML. Próbowałem wykorzystać globalną zmienną, która liczyłaby atomy/termy/obiekty, ale nie za bardzo jest możliwość iteracji po tych elementach. ==== restrictive behavior and multiple values cont ==== Reguła: if grade > 4 then grade = grade Efekt werbalizacji: If grade is greater than 4 then grade is equal to grade. Tutaj przyjmuję, że Grade jest klasa. Też nie do końca poprawne rozwiązanie. 2 3 4 5 if grade > 4 then delete grade ==== grouped attributes and multiple value operations ==== Efekt werbalizacji: If salary of employee in previous_year is less than 2000 then name of employee is a bonusname and salary of employee is equal to salary*1.1. Increase salary by 10% for these employees who earn less than 2000. And store their names in bonusname attribute. ==== grouped attributes and assert ==== Efekt werbalizacji: If ename of Emplyee is any and esalary of Emplyee is any then do assign ename to name of employee. Increase salary by 10% for these employees who earn less than 2000. And store their names in bonusname attribute. ==== parallel inference? ==== De facto InvokeActionExpression służy do wywoływania operacji, a nie do odwoływania się do innych reguł. parallel inference? ==== calculations (factorial) ==== [[https://ai.ia.agh.edu.pl/wiki/hekatedev:xtt_minicases#calculations_factorial | opis]] Nie za bardzo wiem jak skonstruować takie zapętlenie. Ustalając te 3 zmienne jako globalne i pisząc regułę, która mnoży wartość x jeśli s > 1, można by w pewien sposób zrealizować silnie. Nie jestem jednak do końca pewny czy byłoby to zgodne ze składnią R2ML. factorial //problem z tym predykatem notExist - nie ma odpowiednika factorial factorial factorial factorial ==== finding successors in a tree ==== [[https://ai.ia.agh.edu.pl/wiki/hekatedev:xtt_minicases#finding_successors_in_a_tree | opis]] finding successors in a tree ==== finding successors in a tree with a hop ==== [[https://ai.ia.agh.edu.pl/wiki/hekatedev:xtt_minicases#finding_successors_in_a_tree_with_a_hop | opis]] 2 finding successors in a tree with a hop ==== A2A ==== [[https://ai.ia.agh.edu.pl/wiki/pl:miw:miw08_ardcase_cs:biletomat#directed_conceptual_design | opis]] [[https://ai.ia.agh.edu.pl/wiki/pl:miw:miw08_xtt_r2ml:a2a | zapis za pomocą R2ML]] ===== URML ===== URML dziedziczy z R2ML. Oba formaty są w sporej części zgodne (nie w pełni - prace nad pełną zgodnością trwają). Za pomocą programu **Strelka** można uzyskać kod R2ML'a z URML. W związku z dziedziczeniem URML z R2ML mogą wystąpić problemy z przejściem w drugą stronę tj. z R2ML do URML. W szczególnym przypadku reguły ProductionRule da się przekonwertować do URML. * [[http://oxygen.informatik.tu-cottbus.de/rewerse-i1/?q=URML | URML]] * [[http://oxygen.informatik.tu-cottbus.de/strelka/URML-Metamodel.htm | Metamodel URML]] Nie znalazłem informacji odnośnie konwertowanych wersji. URML wersja 0.2. R2ML wersja 0.5. ==== XTTML do URML (XMI) ==== To rozwiązanie byłoby wygodne, bo XTTML do URML do R2ML. Sprawdzałem jak Strelka radzi sobie z wykorzystaniem InvokeActionExpression i nie da się tam zrobić wpisania w InvokeActionExpression takich formuł jak ja zaproponowałem. Invoke musi odnosić się do metody klasy. Można ominąć ten problem robiąc metodę o takiej samej nazwie jak klasa (czyli konstruktor domyślny) i odnosić się do niego w InvokeActionExpression. Znalazłem inne błędy w programie Strelka. Błędy w generowaniu kodu R2ML. Dlatego sądzę, że to przejście przez URML było błędnym pomysłem. Poniższy przykład prezentuje błąd: {{:pl:miw:miw08_xtt_r2ml:image_przykl.jpg|Przykład z błędem}} Ze schematu został wygenerowany kod. Brak wszystkich danych ze schematu. Program zgubił wartość 1, brak wniosku (producedAction). ==== R2ML do URML (XMI) ==== Jest wykonalne. Niestety nie znalazłem żadnego translatora. Nawet zespół, który pracuje nad regułami R2ML nie pisał ich ręcznie tylko generował za pomocą Strelki. Opisują to w swoim postępowaniu przy tworzeniu reguł dla projektu Derby2005. Możliwe jest jednak stworzenie takiego translatora. Sądzę, że byłoby wygodniejsze konwertowanie do URML (XMI dla Strelki) niż konwertowanie do R2ML, gdyż ze Strelki można potem wygenerować R2ML. Reguły nie są skomplikowane. Poniżej zamieszczam najbardziej okrojone reguły jakie udało mi się uzyskać dla prostego przykładu. Przy tak upakowanym kodzie istnieje problem odczytu takiego schematu w programie Strelka. Problem leży w zredukowanym fragmencie "notation:Diagram". Efekt widoczny poniżej. {{:pl:miw:miw08_xtt_r2ml:myrental_good.jpg|przykład poprawny}} {{:pl:miw:miw08_xtt_r2ml:myrental_bad.jpg|przykład bez rozmieszczeń}} Tutaj kod R2ML wygenerowany na za pomocą Strelki z powyższego diagramu. Oczywiście kod w obu przypadkach jest identyczny. ===== Odwzorowanie połączeń ===== Moja propozycja to dopisanie na końcu reguły, z której przechodzimy InvokeActionExpression. Przykład 1: "Go to today of date": Przykład 2: "Calculate the total payment of the purchase order": ===== Translator ===== Efektem powyższych etapów prac oraz rozważań jest translator. [[https://ai.ia.agh.edu.pl/wiki/pl:miw:miw08_xtt_r2ml:translator | translator]] ===== REWERSE I1 issues ===== * R2ML->JBOSS - Translator is XSLT based on and uses R2ML version 0.4. - The Drools vocabulary is not generated. - Only Production Rules are translated to Drools. - "some other errors" (dr A. Giurca) * Translator R2ML to RIF doesn't exist. * Strelka - [[https://ai.ia.agh.edu.pl/wiki/pl:miw:miw08_xtt_r2ml#xttml_do_urml_xmi|loosing conditions and bad production rules]] - Button "Save R2ML" doesn't work. Button "Preview R2ML" works. - Group of buttons "Translate to..." doesn't work. - Generating R2ML doesn't work with advanced logical expressions. ===== Pliki z regułami ===== {{:pl:miw:miw08_xtt_r2ml:thermostat.txt|thermostat.txt}} {{:pl:miw:miw08_xtt_r2ml:minicases_01.txt|minicases_01.txt}} {{:pl:miw:miw08_xtt_r2ml:minicases_02.txt|minicases_02.txt}} {{:pl:miw:miw08_xtt_r2ml:minicases_03.txt|minicases_03.txt}} {{:pl:miw:miw08_xtt_r2ml:minicases_04.txt|minicases_04.txt}} {{:pl:miw:miw08_xtt_r2ml:minicases_05.txt|minicases_05.txt}} {{:pl:miw:miw08_xtt_r2ml:minicases_06.txt|minicases_06.txt}} {{:pl:miw:miw08_xtt_r2ml:minicases_07.txt|minicases_07.txt}} {{:pl:miw:miw08_xtt_r2ml:minicases_08.txt|minicases_08.txt}} {{:pl:miw:miw08_xtt_r2ml:minicases_09.txt|minicases_09.txt}} ====== Materiały ====== - Linki * [[http://oxygen.informatik.tu-cottbus.de/rewerse-i1/?q=R2ML | Główna strona projektu R2ML]] * [[http://oxygen.informatik.tu-cottbus.de/rewerse-i1/?q=node/15 | Translatory R2ML->...]] * [[http://www.w3.org/Style/XSL/ | Style XSL]] * [[http://zvon.org/xxl/XSLTutorial/Output/index.html | Tutorial XSLT]] * [[http://oxygen.informatik.tu-cottbus.de/publications/giurca/ | Publikacje Lukichev oraz Giurca]] * [[http://en.wikipedia.org/wiki/Production_Rule_Representation | Production Rule Representation (PRR) - en.wikipedia]] * [[http://www.edmblog.com/weblog/2007/06/production_rule.html | Trochę więcej o PRR]] * [[http://oxygen.informatik.tu-cottbus.de/userv/ | USserv Product Derby]] - Typy zmiennych * [[http://www.w3.org/Submission/2004/SUBM-SWRL-20040521/#8 | SWRL]] - pdfy dostępne pod [[http://oxygen.informatik.tu-cottbus.de/publications/giurca/ | Publikacje Lukichev oraz Giurca]] * "A General Markup Framework for Integrity and Derivation Rules" - G.Wagner, A.Giurca, S. Lukichev * "Verification and Validation of R2ML Rule Bases" - S. Lukichev * "Submission to Production Rule Representation" : PRR-Core