HSG

Aktuelle Seite: HSG/Fächer/Informatik/Prolog

Globale Variablen

Aus der imperativen Programmierung hat man bei Variable die Vorstellung eines Kastens, der einen Namen (a) hat und mit einem Wert (7) gefüllt ist.
Prolog speichert sein 'Wissen' in der Wissensbasis. Die Belegung der Variablen a mit dem Wert 7 kann man nun als eine 'Beziehung' zwischen a und 7 auffassen. In Prolog z.B. als das Faktum variable(a,7). ausgedrückt. Nun ist aber eine Belegung dieser 'Variablen' nur möglich, wenn man die Wissensbasis dynamisch ändert. Das muss mit dem Systemprädikat dynamic vorbereitet werden.
% Systemaufruf ohne Folgerung
:- dynamic variable/2.

% Variable a wird mit 7 belegt
variable(a,7).

% Variable 'Var' existiert nicht, wird neu geschaffen und belegt
belege(Var,Wert):-not(variable(Var,_)),assert(variable(Var,Wert)).
% Alle Variablen 'Var' werden entfernt. Variable 'Var' wird neu geschaffen und belegt.
belege(Var,Wert):-retract(variable(Var,_)),belege(Var,Wert).

Zum Testen wird man sich mit ?-listing(variable) immer wieder alle 'Variablen' ausgeben lassen und z.B. mit belege(a,17), belege(b,42) oder belege(c,'Emil') neue Belegungen erzeugen.

Beispiel

Mit diesem Konzept hält Herr Röhner in seiner Turtle-Grafik die Turtle-Daten.
/*
  Modul  : TURTLE.PL
  Zweck  : Die Turtle als Modul
  Autor  : Gerhard Röhner
  Version: 1.0, 21.1.2000, Urfassung

  Aktivierung: ins Library-Verzeichnis spielen und "make." aufrufen.

*/

:- module(turtle,
     [ turtle_init/0    % Turtle initialisieren.
     , turtle_term/0    % Turtle beenden.
     , turtle_drawto/2  % Zu einem absoluten Punkt P(X/Y) eine Linie zeichnen.
     , turtle_draw/1    % Eine Strecke der Länge L in aktuelle Richtung zeichnen.
     , turtle_turn/1    % Um den Winkel W relativ drehen.
     , turtle_turnto/1  % Zu einem absoluten Winkel W hindrehen.
     , turtle_move/1    % Eine Strecke der Länge L in aktuelle Richtung ohne Zeichnen bewegen.
     , turtle_moveto/2  % Zu einem festen Punkt (x/y) ohne Zeichnen bewegen.
     ]).


turtle_init:-
   % alten Zustand löschen
   retractall(turtle(_,_,_)),

   % neuen Zustand setzen
   B is 400,
   H is 300,
   B1 is B /2,
   H1 is H / 2,
   W1 is 0,
   assert(turtle(B1, H1, W1)),

   % altes LOGO-Fenster schließen
   free(@logo),

   % neues LOGO-Fenster öffnen
   new(@logo, picture('LOGO', size(B, H))), send(@logo, open).

turtle_term:-
  retractall(logo/3),
  free(@logo).

turtle_drawto(X, Y):-
  retract(turtle(X1, Y1, W)),
  send(@logo, display, new(_, line(X1, Y1, X, Y))),
  assert(turtle(X, Y, W)).

turtle_draw(L):-
  retract(turtle(X1, Y1, W)),
  X2 is X1 + L*cos(W*pi/180),
  Y2 is Y1 - L*sin(W*pi/180),
  send(@logo, display, new(_, line(X1, Y1, X2, Y2))),
  assert(turtle(X2, Y2, W)).

turtle_turn(W):-
  retract(turtle(X, Y, W1)),
  W2 is W1 + W,
  assert(turtle(X, Y, W2)).

turtle_turnto(W):-
  retract(turtle(X, Y, _)),
  assert(turtle(X, Y, W)).

turtle_move(L):-
  retract(turtle(X1, Y1, W)),
  X2 is X1 + L*cos(W*pi/180),
  Y2 is Y1 - L*sin(W*pi/180),
  assert(turtle(X2, Y2, W)).

turtle_moveto(X, Y):-
  retract(turtle(_, _, W)),
  assert(turtle(X, Y, W)).