![]() |
|
![]() |
|||
|---|---|---|---|---|---|
KURE-JavaIn Zusammenarbeit mit der Arbeitsgruppe von Prof. R. Berghammer, Institut für Informatik und Praktische Mathematik der Universität Kiel, haben wir die im Kieler System RelView mechanisierte Relationenalgebra als Unix-C-Bibliothek KURE extrahiert. Um sie in Java-Projekten unter Windows verwenden zu können, gibt es die Java-Bibliothek KURE-Java. Sie verwendet eine modifizierte KURE-Version und kapselt diese in geeignete Java-Schnittstellen.
In KURE-Java werden Relationen als Objekte behandelt, deren Elemente durch get- und set-Methoden angesprochen werden. Relationen werden in einem sog. Relationenmanager verwaltet, der die in Funktionen und Programmen verwendbaren Relationen umfasst und diese auszuwerten erlaubt. Ein Werkzeug nutzt KURE-Java, um mit den aus einem proprietären Datenmodell erzeugten Relationen rechnen zu können. Dazu stehen im Wesentlichen die Methoden createFunction und loadProgramm zur Definition einer relationalen Funktion bzw. zum Laden eines Programmes sowie die Methode evaluateTerm zur Ausführung von Funktionen und Programmen zur Verfügung. Wir benutzen KURE-Java in unseren Werkzeugen PetRA und RelClipse.
Ansprechpartner: Prof. Dr. Ernst-Erich Doberkat Aufbau und ArbeitsweiseDie Diplomarbeit von O. Szymanski beschreibt ausführlich, wie KURE-Java aufgebaut ist und verwendet wird. Darüberhinaus zeigen einige Veröffentlichungen, wie KURE-Java verwendet wird: Veröffentlichungen mit Bezug zu KURE-Java
BeispielprogrammDas folgende KURE-Java-Programm zur Berechnung von Erreichbarkeitsgraphen in Petri-Netzen soll zeigen, wie mit KURE-Java relationale Programme behandelt werden (vgl. auch SEFM04). Sie können KURE-Java in der aktuellen Version für Windows als zip-File downloaden.
public class GetReachabilityGraph implements RelviewTask {
// Interface RelviewTasks stellt Methoden execute() und report() bereit
// execute() führt relationale Analyse durch
// report() stellt Ergebnis im Petri-Netz dar
public void execute(RelviewSession session) throws RelationException, TermException {
// richtigen Relationsmanager besorgen
RelManager manager = session.getManager();
// falls Relation "ireach" noch nicht berechnet
if (manager.containsRelation("ireach") == false) {
// relationales Programm ireach() aufrufen
Relation ireach = manager.evaluateTerm("ireach()", "ireach");
}
if (manager.containsRelation("reach") == false) {
// Transitive Hülle von ireach berechnen
Relation reach = manager.evaluateTerm("trans(ireach)", "reach");
}
// alle Knoten des Erreichbarkeitsgraphen (=Markierungen) erhalten
Relation allMarks = manager.evaluateTerm("dom(reach)", "allMarks");
// allMarks in Sequenz von Spaltenvektoren umwandeln
manager.evaluateTerm("epsi(RelToVec(M)) *inj(allMarks)^", "seqreach");
}
public void report(RelviewSession session) throws RelationException, TermException {
RelManager manager = session.getManager();
Relation ireach = manager.getRelation("ireach");
Relation reach = manager.getRelation("reach");
Relation allMarks = manager.getRelation("allMarks");
String analyseMsg = "Der Erreichbarkeitsgraph besitzt " + allMarks.getNumberOfEntries() + " Knoten (Markierungen).\n";
analyseMsg = analyseMsg + "Es gibt " + ireach.getNumberOfEntries()+ " Paare ummittelbar erreichbarer Markierungen.\n";
analyseMsg = analyseMsg + "Der Erreichbarkeitsgraph besitzt " + reach.getNumberOfEntries()+ " Kanten.";
session.showMessage("Erreichbarkeitsgraph", analyseMsg);
session.showSelector("Erreichbare Markierungen", "seqreach", RelviewSelector.TYPE_MARKINGS);
}
}
Das relationale Programm ireach() sieht dabei wie folgt aus:
IREACH(R, S, C, W_t, Wt_, M)
DECL mvec, mpoint, allMarks
BEG
mvec = RelToVec(M);
mpoint = syq(epsi(mvec), mvec);
allMarks = O(mpoint * mpoint^)
RETURN IRMARKS(M, mpoint, allMarks)
END.
IRMARKS(M, mpoint, ALL)
DECL allMarks, cnc, t, irm, irmvec, irmpoint
BEG
allMarks = ALL | mpoint * mpoint^;
cnc = CN(R, S, C, W_t, Wt_, M);
WHILE -empty(cnc) DO
t = point(cnc);
irm = IRM(R, S, W_t, Wt_, M, t);
irmvec = RelToVec(irm);
irmpoint = syq(epsi(irmvec), irmvec);
allMarks = allMarks | mpoint * irmpoint^;
IF -incl(irmpoint, dom(allMarks)) THEN
allMarks = IRMARKS(irm, irmpoint, allMarks)
FI;
cnc = cnc & -t
OD
RETURN allMarks
END.
|
||
|
© Technische Universität Dortmund, Fakultät für Informatik, Lehrstuhl für Software-Technologie Content-Management-System Typo3 |
||