next up previous contents
Nächste Seite: Der mobile Roboter CARL Aufwärts: Die Planungsebene Vorherige Seite: Die Programmiersprache indiGOLOG   Inhalt


Beispiel eines indiGOLOG-Programms

In [31] wird eine reaktive Fahrstuhl-Kontrollstruktur vorgestellt. Dieses Beispiel spiegelt die volle Ausdrucksstärke der Sprache GOLOG und seiner Erweiterungen zu indiGOLOG wider. Die im folgenden verwendete Variable \( e \) steht für einen Aufzug. Zunächst müssen Aktionen, Fluenten, die Vorbedingungen, Nachfolgeaxiome und der Anfangszustand definiert werden.

1) Term-Definitionen:

  goDown(e) Aufzug \( e \) fährt eine Etage runter
  goUp(e) Aufzug \( e \) fährt eine Etage rauf
  buttonReset(n) Rufknopf der Etage \( n \) wird deaktiviert
  toggleFan(e) Status des Ventilators umstellen (on/off)
  ringAlarm Alarm auslösen

reqElevator(n) Rufknopf der Etage \( n \) aktivieren
changeTemp(e) Temperatur im Aufzug \( e \) verändert sich
detectSmoke Rauchsensor bemerkt Rauch
resetAlarm Zurücksetzen des Rauch-Alarms

floor(e, s) = n Aufzug ist in Etage \( n \), mit \( 1\leq n\leq 6 \)
temp(e, s) = t Temperatur des Aufzugs \( e \) ist \( t \)
FanOn(e, s) Ventilator in \( e \) ist an
ButtonOn(n, s) Rufknopf der \( n \)-ten Etage ist aktiviert
Smoke(s) Es wurde Rauch bemerkt

  TooHot(e, s) := temp(e, s) > 1
  TooCold(e, s) := temp(e, s) < -1

2) Umsetzung einer Aktionstheorie mit obigen Termen:

floor(e, \( S_{0} \)) = 1 \( \neg FanOn(S_{0}) \)  
temp(e, \( S_{0} \)) = 0 \( ButtonOn(3,S_{0}) \) \( ButtonOn(6,S_{0}) \)

\( \forall a.Exo(a)\equiv \) \( a=detectSmoke\vee a=resetAlarm\vee \)
\( a=changeTemp(e)\vee \exists n.a=reqElevator(n) \)

\( Poss(goDown(e),s) \) \( \equiv \) \( floor(e,s)\neq 1 \)
\( Poss(goUp(e),s) \) \( \equiv \) \( floor(e,s)\neq 6 \)
\( Poss(buttonReset(n),s) \) \( \equiv \) \( True \)
\( Poss(toggleFan(e),s) \) \( \equiv \) \( True \)
  \( Poss(ringAlarm,s) \) \( \equiv \) \( True \)
  \( Poss(reqElevator(n),s) \) \( \equiv \) \( 1\leq n\leq 6\wedge \neg ButtonOn(n,s) \)
  \( Poss(changeTemp,s) \) \( \equiv \) \( True \)
  \( Poss(detectSmoke,s) \) \( \equiv \) \( \neg Smoke(s) \)
\( Poss(resetAlarm,s) \) \( \equiv \) \( Smoke(s) \)

\( Poss(a,s) \) \( \supset \) \( [floor(e,do(a,s))=n\equiv {} \)
  \( (a=goDown(e)\wedge n=floor(e,s)-1)\vee {} \)
  \( (a=goUp(e)\wedge n=floor(e,s)+1)\vee {} \)
  \( (n=floor(e,s)\wedge a\neq goDown(e)\wedge a\neq goUp(e))] \)

\( Poss(a,s) \) \( \supset \) \( [temp(e,do(a,s))=t\equiv {} \)
      \( (a=changeTemp(e)\wedge FanOn(e,s)\wedge t=temp(e,s)-1)\vee {} \)
      \( (a=changeTemp(e)\wedge \neg FanOn(e,s)\wedge t=temp(e,s)+1)\vee {} \)
      \( (t=temp(e,s)\wedge a\neq changeTemp(e))] \)

  \( Poss(a,s) \) \( \supset \) \( [FanOn(e,do(a,s))\equiv {} \)
      \( (a=toggleFan(e)\wedge \neg FanOn(e,s))\vee {} \)
      \( (a\neq toggleFan(e)\wedge FanOn(e,s))] \)

  \( Poss(a,s) \) \( \supset \) \( [ButtonOn(n,do(a,s))\equiv {} \)
      \( a=reqElevator(n)\vee {} \)

  \( Poss(a,s) \) \( \supset \) \( [Smoke(do(a,s))\equiv {} \)
      \( a=detectSmoke\vee {} \)
      \( (Smoke(s)\wedge a\neq resetAlarm)] \)

3) Kontrollstrukturen:

Es handelt sich um eine vereinfachte Implementierung, bei der zum Beispiel die Modellierung der Fahrstuhltüren und Menschen nicht beachtet wurde.

  proc \( control(e) \)
  (1)   \( <TooHot(e)\wedge \neg FanOn(e)\rightarrow toggleFan(e)> \)
    \( \vert\vert \) \( <TooCold(e)\wedge FanOn(e)\rightarrow toggleFan(e)> \)
  (2) \( \rangle \rangle \) \( <Smoke\rightarrow ringAlarm> \)
  (3) \( \rangle \rangle \) \( <\exists n.ButtonOn(n)\rightarrow \)
             \( \pi n.\{BestButton(n)?;serveFloor(e,n)\}> \)
  (4) \( \rangle \rangle \) \( floor(e)\neq 1\rightarrow goDown(e) \)
  end
       
  proc  \( serveFloor(e,n) \)
    while \( floor(e)<n \) do \( goUp(e) \);
    while \( floor(e)>n \) do \( goDown(e) \);
    \( buttonReset(n) \)
  end

Auf der obersten Ebene (1) wird darauf geachtet, ob die Temperatur im Fahrstuhl richtig ist und dementsprechend auf die Ventilation eingewirkt. Wenn der Rauchmelder anschlägt (2), wird der Alarm angeschaltet, aber nur wenn der Ventilator nicht umgeschaltet werden muß. Wenn keine der bisherigen Ebenen aktiv ist, können die gewünschten Etagen (3) abgearbeitet werden. \( BestButton(n) \) zeichnet dabei die nach einer Strategie günstigste Etage aus. Eine solche Strategie könnte ''der am längsten gedrückte Knopf'' oder ''die nach Abstand geringste Etage'' sein. Wenn keine Rufknöpfe mehr aktiv sind, fährt der Fahrstuhl auf die unterste Etage (4). Wenn während der Fahrt nach unten ein Knopf angeschaltet wird, wird auch dieser abgearbeitet. Erst wenn der Fahrstuhl unten angekommen ist, wird \( control(e)=c_{e} \) beendet. Durch eine einfache \( while \)-Schleife mit \( control \) als Rumpf könnte der Aufzug dauerhaft betrieben werden. Würden die Bedingungen der Ebenen (3) und (4) mit \( while \)-Schleifen modelliert, so würde ein Rufknopf, der während der Fahrt nach unten gedrückt wird, nicht mehr bearbeitet werden. Wenn der Controller von einem übergeordneten Programm aus mit verschiedenen Parametern \( e \) aufgerufen wird (zum Beispiel \( c_{e_{1}}\vert\vert...\vert\vert c_{e_{n}} \)), können mehrere Aufzüge parallel betrieben werden.


next up previous contents
Nächste Seite: Der mobile Roboter CARL Aufwärts: Die Planungsebene Vorherige Seite: Die Programmiersprache indiGOLOG   Inhalt

2001-01-04