ODeLa | Sprache zur Definition von Objekten mit ihren Attributen |
RUDOLF | Sprache zur Formulierung von Regeln |
GASTON | Software zum Steuern und Überwachen von Regelinduktionsaufgaben durch den Versuchsleiter |
CARINEX | Software für die Versuchspersonen |
RuleTool | Graphisches Hilfsmittel für den Versuchsentwickler. Dient zur Erstellung von Regeln, die in RUDOLF formuliert sind. |
RIGen | Analysehilfsmittel für den Versuchsentwickler. Dient zur Bestimmung aller Objektsequenzen, die von einer RUDOLF-Regel erlaubt werden. |
Am Ende jeder Beschreibung einer Software befindet sich ein kurzer Hinweis zu interessanten Aspekten der Implementierung. Dazu gibt es Verweise auf die detaillierte Beschreibung der Java-Klassen, die den Programmen zugrundeliegen.
Dabei interessiert neben der Entwicklung der Teilhypothesen zur Schlußhypothese vor allem die Zeit, die die Versuchsperson zur Entscheidung für ein bestimmtes Objekt benötigt.
Die Regeln können auf unterschiedliche Art und Weise dargestellt werden, z.B. mit Spielkarten. Eine Spielkarte hat die Attribute Farbe (schwarz, rot) und Wert (As, 2, 3, 4, 5, 6, 7, 8, 9, 10, Bube, Dame, König). Damit lassen sich die folgenden drei Regeln (mit der Sequenzlänge 4) beschreiben:
(1. Karte: Pik, 2. Karte: Pik, 3. Karte: Kreuz, 4. Karte: Kreuz); oder kurz: (P) (P) (K) (K) (Herz Dame, Kreuz 2, Herz König, Kreuz 3); oder kurz: (H, Dame) (K, 2) (H, König) (K, 3) (Herz gerade, Herz ungerade, Pik ungerade, Pik gerade); oder kurz: (H, g) (H, u) (P, u) (P, g)
Die Objekte werden auf einem ausgezeichneten Computer ausgewählt. Diese Auswahl erscheint dann auf den Bildschirmen der anderen Gruppenmitglieder, die, nachdem jeder Einzelne seine Individualhypothese abgegeben hat, zusammen eine Gruppenhypothese formulieren. Diese Hypothesen und die einzelnen "Reaktionszeiten" werden über das Netzwerk an eine Sammelstelle, den Experimentserver, geschickt und dort, für eine spätere Auswertung, abgespeichert. Dieser Server wählt auch die zu erratenden Regeln aus einer festgelegten Liste aus. Sind alle Regeln aus dieser Liste abgearbeitet, endet das Experiment.
Viele Programmiersprachen (z.B. Java, die Implementierungssprache der computerunterstützten Regelinduktionsaufgaben), sind jedoch nicht geeignet, Regeln, wie sie in diesem Fall benötigt werden, effizient darzustellen. Aus diesem Grund wurde mit Hilfe des Parsertools JavaCC eine Regelsprache entwickelt, mit der Regeln über Objekte, die durch verschiedene Attribute definiert sind, leicht beschrieben werden können: Die Sprache RUDOLF (RUle DefinitiOn Language Format). Um nun auch unabhängig von den Objekten zu werden wurde eine weitere deskriptive Sprache entwickelt:
ODeLadatei ::= objektdef attributdef { attributdef } { makrodef }. objektdef ::= 'object :=' name. attribdef ::= name ':=' ausprägungen. ausprägungen ::= '{' wert {',' wert} '}'. macrodef ::= '#'name ':= "' ZEICHENFOLGE '"'. name ::= BUCHSTABE { ZIFFER | BUCHSTABE }. wert ::= ['#']name | ZIFFER.Der Parser für ODeLa ist mit Hilfe des JavaCC Tools implementiert. Um eine ODeLa Datei einzulesen übergibt man einfach den entsprechenden FileInputStream an den Konstruktor. Mit der Methode getAttribhash() bekommt man dann die entsprechenden Informationen in einem OdlTable Objekt.
object := karte farbe := { kreuz, pik, herz, karo, #rot, #schwarz } wert := { as, 2, 3, 4, 5, 6, 7, 8, 9, 10, bube, dame, koenig, #gerade, #ungerade } #rot := "(herz | karo)" #schwarz := "(kreuz | pik)" #gerade := "(2 | 4 | 6 | 8 | 10 | dame)" #ungerade:= "(as | 3 | 5 | 7 | 9 | bube | koenig)"
sequence
und
einer beliebig langen Liste von Objekten (durch Kommas
getrennt). Die genaue Syntax lautet folgendermaßen:
Die Syntax solcher Objekte in RUDOLF sieht folgendermaßen aus:
Dabei ist ObjektBezeichner eine beliebig lange Zeichenkette, bestehend aus Buchstaben und/oder Zahlen, die mit einem Buchstaben oder dem Zeichen "_" beginnt. Attribute werden in RUDOLF mit
dargestellt. Ein AttributBezeichner ist wie ein ObjektBezeichner aufgebaut. Der Inhalt eines Attributes ist entweder ein Wert oder eine Formel oder eine Referenz. Ein grüner, 1.2 t schwerer VW Käfer läßt sich in RUDOLF mit
beschreiben. Kaefer, Farbe und Gewicht sind Bezeichner. Die Inhalte grün und 1200 sind Werte. Diese Werte sind konstante Formeln. Die Darstellung von Referenzen und komplexeren Formeln folgen in den nächsten beiden Abschnitten.
Bemerkungen:
Syntax einer Konjunktion:
Syntax einer Disjunktion:
Ein 1,2 t schwerer VW Käfer, der rot oder grün sein kann, läßt sich in RUDOLF mit
beschreiben. Das Komma zwischen den Attributen Farbe und Gewicht hat ebenfalls die Bedeutung einer Konjunktion. Der Regelparser speichert die Attribute eines Objektes jedoch in einer Liste. Daher sind Disjunktionen, genauso wie andere komplexe Ausdrücke, auf dieser Ebene nicht erlaubt. Dies vereinfacht die Implementation, begrenzt aber die Mächtigkeit der Sprache nicht, da Disjunktionen innerhalb eines Attributes (wie oben) beschrieben werden können. Arithmetische Operatoren (+, -, *, /) werden in gleicher Weise wie "&" und "|" verwendet. Sie entfalten ihre Mächtigkeit jedoch erst mit der Verwendung von Referenzen.
Syntax von Referenzen:
Objekt muß ein bereits definiertes Objekt in der Regelsequenz sein, das das Attribut Attribut besitzt. Referenzen lassen sich mit arithmetischen und logischen Formeln kombinieren.
Beispiel:
sequence ( auto1 ( farbe ( rot ), gewicht( 1000 ) ), auto2 ( gewicht ( ^auto1.gewicht + 500 ) ); auto3 ( farbe( blau ), gewicht( ^auto2.gewicht + 500 ) ) )Das zweite Auto in der Sequenz wiegt 500 kg mehr als das erste Auto und das dritte Auto wiegt 500 kg mehr als das zweite Auto.
rule ::= 'sequence' '(' object { ',' object } ').'. object ::= identifier '(' attribute { ',' attribute } ')'. attribute ::= identifier '(' formula ')'. formula ::= ( formula atomic_formula ) | ( formula binop formula ). atomic_formula ::= number | reference | ( '(' formula ')' ). reference ::= '^' identifier '.' identifier. binop ::= arithop | boolop. arithop ::= '+' | '-' | '*' | '/'. boolop ::= '|' | '&'. identifier ::= ( '_' | string ) { number | string }.
sequence ( auto1( farbe( rot ), gewicht( 1000 ) ), auto2( farbe( gelb | blau), gewicht( ^auto1.gewicht + 500 ) ) )
sequence ( auto1( farbe( rot ), gewicht( 1000 ) ), auto2( farbe( gelb | blau) ), auto3( gewicht( auto1.gewicht * 7.5 ) ) )
sequence ( As_Schwarze_Karte( farbe( #schwarz ), wert( as ) ), Rote_Karte( farbe( #rot ) ), Alles_Karte( farbe( ^As_Schwarze_Karte.farbe | ^Rote_Karte.farbe ) ) )
sequence ( karte1( farbe( #rot | #schwarz), wert( as ) ), karte2( farbe( #rot ), wert( karte1.wert + 2 ) ), karte3( farbe( #schwarz ), wert( karte2.wert + 2 ) ), karte4( farbe( ^karte2.farbe ), wert( karte3.wert + 2 ) ) )
RIGen
Eine Teilaufgabe der Software bestand in der Analyse der erstellten Regeln. Es sollte
für eine Regel ermittelt werden wieviele mögliche Kombinationen von Karten sie
zulässig macht, bzw. wie hoch die Wahrscheinlichkeit für einen Zufallstreffer
liegt.
Was macht RIGen?
RIGen (Rule Instances Generator) erstellt zu einer Regel rekursiv
sämtliche legalen Objektsequenzen und gibt diese aus. Abschliessend wird
noch der Quotient aus legalen und möglichen Sequenzen bestimmt.
Da dieses Tool nicht für den eigentlichen Experimentablauf benötigt
wird, ist zu diesem Zeitpunkt nur eine Kommandozeilen-Version implementiert. Die
Funktionalität beschränkt sich auf die Ausgabe aller Informationen auf die
Standardausgabe. Im Programm ist die Anpassung zur Ausgabe auf einen beliebigen
OutputStream vorgesehen, so daß die Informationen leicht in zB. ein Textfenster
umgeleitet werden können. Die Erweiterung von RuleTool
um eine Analysefunktion mit eingebettetem RIGen würde sich zum Beispiel anbieten.
In der aktuellen Version können als Kommandozeilen-Parameter angegeben
werden, welche ODeLa- und RUDOLF-Dateien benutzt werden, sowie welche
Länge die zu bildende Sequenz hat. Falls keine Länge angegeben ist,
wird die Anzahl der in der RUDOLF-Datei angegebenen Objekte angenommen.
[Details zur Implementierung]
RuleTool
Um Regeln für ein Experiment möglichst leicht in
RUDOLF-Regeln umsetzen zu können wurde die graphische
Eingabehilfe RuleTool entwickelt. RuleTool zeigt sich dem Benutzer
in der für Windows-Anwendungen üblichen Weise und macht es jedem Benutzer
solcher Software so leicht, sich zurechtzufinden.
Sowohl die Steuerung per Maus als auch mit Tastatur wird für die meisten Funktionen
unterstützt. Zum einen kann jeder Benutzer so sofort mit der Erstellung einfacher
Regeln beginnen, zum anderen ist für den fortgeschrittenen Benutzer die schnelle
und effiziente Erstellung auch komplexer Regeln leicht.Features:
Die Knopfleiste ist abhängig von der zu Grunde liegenden
ODeLa-Datei für die Regeln. Für jedes Attribut
wird ein Knopf und ein Pulldown-Menü mit dessen möglichen Ausprägungen
angelegt. Als Standard wird die Datei 'cards.odl' im gleichen
Verzeichniss wie RuleTool angenommen. Es kann aber auch jede beliebige
andere ODeLa-Datei als command-line-Argument übergeben werden.
In zukünftigen Versionen wäre eine Konfigurationsdatei denkbar, die diese und
andere Informationen über eine Sitzung hinaus speichert.
Objekte werden im Hauptfenster als Rechtecke dargestellt, in denen zeilenweise die
Enschränkungen auf die Attribute geschrieben werden. Dabei steht jede Zeile für
genau ein Attribut. Wenn eine Ausprägung von der Knopfleiste auf ein Objekt fallen
gelassen wird, wird diese in die entsprechende Zeile des Objekts eingetragen. Sollte
diese Zeile bereits Ausprägungen enthalten, werden diese mit der neuen
oder-verknüpft. Um eine und-Vernüpfung zu erreichen, muß lediglich
während des Vorgangs die [Strg]-Taste gedrückt werden.
Leider unterstützt die vorliegende Java-Version 1.1 kein drag&drop. Die entsprechenden
Features mußten also von Hand implementiert werden und sind deshalb nicht sehr
ausgereift. Am besten umgeht man als Benutzer die Schwierigkeiten, indem man zwei
komplette Klicks mit der Maus durchführt anstatt mit gedrückter Taste
die Attribute zu verschieben. Drag&drop wurde so umgesetzt, daß beide
Eingabearten als gleichwertig angesehen werden.
Eine andere Möglichkeit, den Inhalt von Attributfeldern zu ändern, ist der
Objekteditor. Er ist entweder über die Menüleiste erreichbar oder man
klickt über dem entsprechenden Objekt die rechte Maustaste. Der Editor
erlaubt für alle Attribute eines Objekts beliebige Texteingaben. Auf diese
Weise kann die volle Mächtigkeit von RUDOLF-Ausdrücken
genutzt werden.
Um Referenzen auf den Laufzeitinhalt anderer (vorangehender) Objekte zu erzeugen,
kann der Benutzer mit der Maus auf des Attribut eines Objekts klicken und dieses
mit drag&drop auf ein anderes Objekt ziehen. Dabei muß die shift-Taste gedrückt
gehalten werden. Im Zielobjekt wird dann in der entsprechenden Zeile die
nötige Anweisung eingetragen.
Zur Implementierung:
Die Implementierung erfolgte ohne Entwicklungstools, da diese oft sehr langen,
unlesbaren Code erzeugen und so eine Wartung der Software sehr schwer wird. Die
Hauptanzeige arbeitet getrennt von dem umgebenden Fenster mit den Menüs und Knöpfen.
So ist es denkbar, jeweils nur eine Komponente bei Bedarf auszuwechseln.
Zusätzlich ist die Methode zur Darstellung der Objekte innerhalb der Anzeigeklasse
modular gehalten, um auch hier eine Änderung leicht zu ermöglichen.
[Details zur Implementierung]
Gaston
Für ein Experiment ist es nötig, die einzelnen Arbeitsplätze, auf denen
CARInEx läuft, zu koordinieren. Diese Aufgabe übernimmt
der Server Gaston. Als Benutzer ist lediglich der Versuchsleiter vorgesehen,
der mit Hilfe von Gaston die für dieses Experiment gültigen Parameter setzt
und die Durchführung anstößt. Nachdem Gaston gestartet wurde, wartet das
Programm zuerst auf Anmeldungen von CARInEx Clients über
das Netzwerk. Dabei können Server Port und andere fundamentalen Parameter
beim Start als command-line Argumente übergeben werden (diesbezüglich
verfügt Gaston über eine command-line Hilfe). Sobald alle gewünschten
Clients angezeigt werden, startet der Versuchsleiter die Sitzung.
Beim Start eines Experiments
Vor dem ersten Experimentdurchlauf einer Sitzung erscheint automatisch der
Properties Bildschirm. Hier können nun alle Rahmenbedingungen für das
Experiment festgelegt werden. Insbesondere welche RUDOLF
Regeldateien verwendet werden sollen, wie lange ein Einzelexperiment in
Sekunden dauern soll und wie viele Objekte gelegt werden dürfen.
Zusätzlich kann noch ein Prefix für die Datenspeicherung angegeben
werden. Sämtliche im Experiment anfallenden Daten werden dann unter diesem
Prefix mit der Erweiterung '<Client Nr.>-<Einzelexperiment Nr.>.dat'
abgelegt.
Hier kann auch entschieden werden, ob recorded sessions für die
Versuchsreihe verwendet werden sollen.
Beispiel: cards.odl
<Bildbreite> "," <Bildhöhe> "," <Gesamtbreite> "," <Attribut1> "," <Attribut2> "," ...
Bedeutung der Begriffe:
Bildbreite | Breite eines einzelnen Objektbildes |
Bildhöhe | Höhe eines einzelnen Objektbildes |
Gesamtbreite | Summe der Breiten aller Objektbilder, d.h. Bildbreite*Anzahl der Bilder |
Danach werden die Attribute in der Reihenfolge angegeben, nach der die Attribute der Objektbilder in der Bilderdatei sortiert sind.
Beispiel:
In einer Bilderdatei, in der ein Kartenspiel dargestellt ist, sind die Bilder zuerst nach der Farbe sortiert. Innerhalb jeder Farbe sind die Bilder nach ihrem Wert sortiert. Ein Bild ist 55 Pixel breit und 73 Pixel hoch. Außerdem hat die Bilderdatei eine Gesamtbreite von 2860 Pixel (52 Karten mit jeweils 55 Pixel Breite). Der Inhalt der Attribut- und Dimensionendatei sieht also folgendermaßen aus:
Die Datei muß die Endung "attr" besitzen.
host | Die IP Adresse des Computers, auf dem der Server läuft. Ist dies der Computer auf dem CARINEX laufen soll, kann "localhost" angegeben werden. |
port | Nummer der Anschlußstelle, an der der Server auf anmeldungswillige Clients wartet |
dwidth | Zahl der Objektbilder, die auf einmal angezeigt werden sollen |
type | Modus, in dem CARINEX gestartet werden soll: "passive" bedeutet, daß CARINEX im Gruppenexperiment gestartet wird und keine Objektauswahlmöglichkeit besteht. Der Alternativmodus ist "active". In diesem Modus kann der Benutzer die Objekte per Maus auswählen. |
Ein Aufruf des Applets CARINEX in einer HTML-Datei könnte also wie folgt aussehen:
<applet code="Carinex.class" height="800" width="600"> <param name="host" value="ares.cip.informatik.uni-muenchen.de"> <param name="port" value="8888"> <param name="dwith" value="13"> <param name="type" value="active"> </applet>
index.html ist eine HTML-Datei die ein Applet-Marke in der oben beschriebenen Form enthält. Wichtig ist, daß der Server GASTON auf dem in index.html angegebenen Rechner bereits läuft.
Im Ergebnisfeld wird dann angezeigt, ob diese Teilhypothese richtig oder falsch war. Im ersteren Fall positioniert CARINEX das ausgewählte Objektbild rechts neben das zuletzt gelegte Objekt. Ist die Teilhypothese falsch wird das Objektbild unter das zuletzt gelegte Objekt positioniert. Wenn mehr als fünf falsch ausgewählte Objekte im Ergebnisfeld liegen, kann der Benutzer die verdeckten Objekte mit den Knöpfen up und down ansehen.
Nach dem Auswahlvorgang erscheint das Hypothesen- und Nachrichtenfenster. Der Benutzer wird damit aufgefordert, seine Teilhypothese schriftlich zu formulieren. Durch Betätigen der Eingabetaste, wird die Teilhypothese zum Server GASTON geschickt und dort gespeichert. Im unteren Teil des Hypothesen- und Nachrichtenfensters kann der Benutzer mit anderen Versuchspersonen kommunizieren, indem er schriftliche Nachrichten verschickt. Diese Nachichten werden an alle angemeldeten Teilnehmer verschickt.
Nach der schriftlichen Eingabe der Teilhypothese kann der Benutzer, sofern das Experiment noch nicht beendet ist, ein weiteres Objekt auswählen.
Im passive-Modus fehlt die Objektbilderliste. Dieser Modus ist dazu gedacht, CARINEX im Gruppenexperiment laufen zu lassen. Dazu muß eines der Gruppenmitglieder mit einer aktiven CARINEX- Instanz, und der Rest der Gruppen mit einer passiven CARINEX- Instanz arbeiten. Der Benutzer hat in diesem Fall keine Auswahlmöglichkeit. Er kann lediglich den Verlauf des Versuchs verfolgen und nach jeder Teilhypothese seine eigene Hypothese formulieren und zum Server schicken.
[Details zur Implementierung]