Otto Thiele, Jena

Eine Relationale Datenbank in Prolog


Entwerfen Sie eine relationale Datenbank "Schulprojekte" mit folgenden Tabellen:

Schüler(Vorname, Nachname)
Projekte(Thema)
Lehrer(Vorname, Nachname)
Fachbereiche(Fach)
Bewertungen(Erarbeitung, Dokumentation, Präsentation)

Beachten Sie die Festlegungen:

Implementieren Sie die relationale Datenbank in Prolog.

Übertragen Sie dafür exemplarisch folgende Daten in die Datenbank:

Geben Sie folgende Anfragen an:

  1. Welcher Schüler hat an welchem Projekt gearbeitet?
  2. Welcher Schüler hat welche Gesamtnote erzielt?
  3. Welcher Lehrer ist im Fachbereich Chemie tätig?
  4. Welche Teilnoten hat Petra Sauer in welchem Projekt erhalten?
  5. Welcher Lehrer, aus welchem Fachbereich, hat welche Schüler betreut?
  6. Welcher Schüler hat kein Projekt erarbeitet?

Ein Index ermöglicht es, die Datensätze einer Tabelle nach den Daten eines Felds zu sortieren.

Beispiel: Der Index für das Feld "Nachname" der Tabelle "Schüler".

Index

Dieser Index ermöglicht es, die Datensätze der Tabelle "Schüler" sortiert nach den Nachnamen auszugeben.

...SabineErdmann
...VeronikaErnst
...PeterFriedel
...LutzFriedrich
.........

Erweitern Sie die Datenbank um einen Index für das Feld "Nachname" der Tabelle "Schüler".

Geben Sie folgende Löschanfragen an:

  1. Der Lehrer Lutz Hiller ist aus der Datenbank zu löschen.
  2. Der Schüler Fred Sauer ist aus der Datenbank zu löschen.

Lösung: Eine Implementierung in LOGITEK-Prolog

(Hinweis: In Fix-Prolog müssen geringfügige Veränderungen vorgenommen werden.)

/* Relationale Datenbank "Schulprojekte" in Prolog */

/* Tabelle "Schueler" */
/* schueler(SNr,Vorname,Nachname) */

schueler(1,"Ina","Lange",).
schueler(2,"Petra","Kunze").
schueler(3,"Sabine","Erdmann").
schueler(4,"Peter","Friedel").
schueler(5,"Anna","Neumann").
schueler(6,"Jens","Voeller").
schueler(7,"Nadine","Winter").
schueler(8,"Petra","Sauer").
schueler(9,"Fred","Sauer").
schueler(10,"Veronika","Ernst").
schueler(11,"Achim","Wunderlich").
schueler(12,"Ralf","Mayer").
schueler(13,"Hanna","Reuter").
schueler(14,"Lutz","Friedrich").
schueler(15,"Soeren","Schmidt").

SNr ist der Primärschlüssel der Tabelle "Schueler".

/* Tabelle "Projekte" */
/* projekte(PNr,Thema) */

projekte(1,"Sprachen").
projekte(2,"Programmieren").
projekte(3,"Biochemie").
projekte(4,"Astrophysik").
projekte(5,"Computer").

PNr ist der Primärschlüssel der Tabelle "Projekte".

/* Tabelle "Bewertungen" */
/* bewertungen(SNr,PNr,Erarbeitung,Dokumentation,Praesentation) */

bewertungen(1,1,1,2,1).
bewertungen(2,1,2,3,3).
bewertungen(3,1,1,1,2).
bewertungen(4,2,2,3,2).
bewertungen(5,2,1,3,2).
bewertungen(6,3,3,2,4).
bewertungen(7,3,2,3,1).
bewertungen(8,3,4,3,2).
bewertungen(9,4,2,1,2).
bewertungen(10,4,2,2,3).
bewertungen(11,5,2,3,3).

SNr ist der Primärschlüssel der Tabelle "Bewertungen". Zwischen der Tabelle "Schueler"
und der Tabelle "Bewertungen" besteht eine 0:1-Beziehung (einige Schler haben kein Projekt
erarbeitet, kein Schüler hat an mehr als einem Projekt gearbeitet).
PNr ist Fremdschlüssel in der Tabelle "Bewertungen". Zwischen der Tabelle "Projekte" und der
Tabelle "Bewertungen" besteht eine 1:n-Beziehung (an einem Projekt hat ein oder haben mehrere
Schüler gearbeitet).

/* Berechnen der Gesamtnote */

gesamtnote(SNr,PNr,G):-bewertungen(SNr,PNr,E,D,P),G is round((E+D+P)/3).

/* Tabelle "Lehrer" */
/* lehrer(LNr,Vorname,Nachname) */

lehrer(1,"Klaus","Hunger").
lehrer(2,"Kerstin","Werner").
lehrer(3,"Gerd","Schubert").
lehrer(4,"Martin","Kummer").
lehrer(5,"Nina","Schiller").
lehrer(6,"Lutz","Hiller").
lehrer(7,"Bernd","Klein").
lehrer(8,"Doris","Ahnert").
lehrer(9,"Bert","Stoll").

LNr ist der Primärschlüssel der Tabelle "Lehrer".

/* Tabelle "Fachbereiche" */
/* fachbereiche(FNr,Fach) */

fachbereiche(1,"Deutsch").
fachbereiche(2,"Englisch").
fachbereiche(3,"Informatik").
fachbereiche(4,"Mathematik").
fachbereiche(5,"Biologie").
fachbereiche(6,"Chemie").
fachbereiche(7,"Astronomie").
fachbereiche(8,"Physik").

FNr ist der Primärschlüssel der Tabelle "Fachbereiche".

/* Tabelle "LehrerFachbereiche" */
/* lehrerfachbereiche(LNr,FNr) */

lehrerfachbereiche(1,1).
lehrerfachbereiche(1,2).
lehrerfachbereiche(2,1).
lehrerfachbereiche(2,2).
lehrerfachbereiche(3,3).
lehrerfachbereiche(4,5).
lehrerfachbereiche(4,6).
lehrerfachbereiche(5,5).
lehrerfachbereiche(5,6).
lehrerfachbereiche(6,7).
lehrerfachbereiche(6,8).
lehrerfachbereiche(7,4).
lehrerfachbereiche(7,6).
lehrerfachbereiche(8,4).
lehrerfachbereiche(8,6).
lehrerfachbereiche(9,6).

LNr und FNr bilden den Primärschlüssel der Hilfstabelle "LehrerFachbereiche". Diese Hilfstabelle realisiert zwischen
den Tabellen "Lehrer" und "Fachbereiche" eine m:n-Beziehung (jeder Lehrer ist in mindestens einem Fachbereich tätig,
in jedem Fachbereich ist mindestens ein Lehrer tätig).

/* Tabelle "LehrerProjekte" */
/* lehrerprojekte(LNr,PNr) */

lehrerprojekte(1,1).
lehrerprojekte(2,1).
lehrerprojekte(3,2).
lehrerprojekte(4,3).
lehrerprojekte(5,3).
lehrerprojekte(6,4).
lehrerprojekte(3,5).

LNr und PNr bilden den Primärschlüssel der Hilfstabelle "LehrerProjekte". Diese Hilfstabelle realisiert zwischen den
Tabellen "Lehrer" und "Projekte" eine m:n-Beziehung (einige Lehrer haben ein oder mehrere Projekte betreut, jedes
Projekt wurde von mindestens einem Lehrer betreut).

/* Anfragen 1 bis 6 */

anfrage1(V,N,T)        :-schueler(SNr,V,N),projekte(PNr,T),bewertungen(SNr,PNr,_,_,_).
             
anfrage2(V,N,G)        :-schueler(SNr,V,N),projekte(PNr,T),gesamtnote(SNr,PNr,G).

anfrage3(V,N)          :-lehrer(LNr,V,N),lehrerfachbereiche(LNr,FNr),fachbereiche(FNr,"Chemie").
               
anfrage4(E,D,P,T)      :-schueler(SNr,"Petra","Sauer"),bewertungen(SNr,PNr,E,D,P),projekte(PNr,T).
                 
anfrage5(LV,LN,F,SV,SN):-lehrer(LNr,LV,LN),
                         lehrerfachbereiche(LNr,FNr),
                         fachbereiche(FNr,F),
                         lehrerprojekte(LNr,PNr),
                         bewertungen(SNr,PNr,_,_,_,),
                         schueler(SNr,SV,SN).
                                                  
anfrage6(V,N)          :-schueler(SNr,V,N),not bewertungen(SNr,_,_,_,_,).


?-anfrage1(Vorname,Nachname,Thema).
?-anfrage2(Vorname,Nachname,Gesamtnote).
?-anfrage3(Vorname,Nachname).
?-anfrage4(B,D,P,Thema).
?-anfrage5(LVorname,LNachname,Fach,SVorname,SNachname).
?-anfrage6(Vorname,Nachname).


/* Index fuer Feld "Nachname" der Tabelle "Schueler" */
/* index(SNr) */

index(3).
index(10).
index(4).
index(14).
index(2).
index(1).
index(12).
index(5).
index(13).
index(8).
index(9).
index(15).
index(6).
index(7).
index(11).

/* Indexanfrage */

indexanfrage(V,N):-index(SNr),schueler(SNr,V,N).


?-indexanfrage(Vorname,Nachname).


/* Loeschanfragen 1 und 2 */

loeschanfrage1(LNr):-retract(lehrer(LNr,_,_)),
                     retract(lehrerfachbereiche(LNr,_)),
                     retract(lehrerprojekte(LNr,_)).

loeschanfrage2(SNr):-retract(schueler(SNr,_,_)),
                     retract(bewertungen(SNr,_,_,_,_,)),
                     retract(index(SNr)).


?-loeschanfrage1(6). 
?-loeschanfrage2(9).             


Otto Thiele
Carl-Zeiss-Gymnasium Jena
Fachbereich Informatik
Erich-Kuithan-Strae 7
07743 Jena
ottothiele@cz.j.th.schule.de