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)).