Informatik/Jahrgangsstufe Q/001 Klausuren/Q2/2002-2003-1

Transcrição

Informatik/Jahrgangsstufe Q/001 Klausuren/Q2/2002-2003-1
1. INFORMATIK-KLAUSUR
Name:
Bearbeitungszeit: 180 min
Info 13 LK (GA)
23.09.2002
− Seite 1 −
Aufgabe 1: Du kennst vielleicht diese russischen Holzpüppchen, in
denen immer noch eine kleinere drin steckt. Rechts ist
eine schematische Abbildung von solchen
ineinandersteckenden russischen Puppen:
katarina
olga
natasha
a) Stelle die drei direkten Lagebeziehungen in Form von
Fakten in Prolog dar: direktin(... , ...).
b) Definiere ein Prädikat in/2 (d. h. ein Prädikat mit zwei
Parametern), dass uns sagt welche Puppe (direkt oder
indirekt) in welcher anderen Puppe steckt. Die Anfrage
in(katarina,natasha) z.B. sollte wahr sein,
während in(olga,katarina) fehlschlagen sollte.
Hinweis: Nutze dabei auch das Prädikat aus Teilaufg. a).
c) Welche Ausgabe erhältst du bei der Anfrage in(X,katarina)?
d) Welche Ausgabe erhältst du bei der Anfrage in(X,Y), wenn alle Lösungen
angefordert werden?
e) Stelle das Backtracking beim Aufruf in(katarina,irina) grafisch dar.
irina
Aufgabe 2: Folgende Reisemöglichkeiten stehen zur Auswahl:
byCar(auckland,hamilton). /*
byCar(hamilton,raglan).
byCar(valmont,saarbruecken).
byCar(valmont,metz).
←
/*
/*
/*
Dies bedeutet: Man kommt mit dem
Auto von Auckland nach Hamilton.
Die anderen Prädikate sind ebenfalls so zu lesen.
byTrain(metz,frankfurt).
byTrain(saarbruecken,frankfurt).
byTrain(metz,paris).
byTrain(saarbruecken,paris).
*/
*/
*/
*/
byPlane(frankfurt,bangkok).
byPlane(frankfurt,singapore).
byPlane(paris,losAngeles).
byPlane(bangkok,auckland).
byPlane(losAngeles,auckland).
a) Schreibe ein Prädikat travel/2, welches herausfindet, ob es möglich ist, von
einer Stadt zu einer anderen Stadt zu reisen. Die Wahl des Verkehrsmittels soll
dabei keine Rolle spielen.
Beispiel: Dein Programm sollte die Anfrage travel(valmont,raglan)
mit ‘yes’ beantworten.
b) Plant man seine Reise etwas genauer, so ist es interessant zu wissen, über welche
Stadt man zum Ziel gelangt. Schreibe deshalb ein Prädikat travel/3, welches
dir ausgibt, über welche Zwischenpunkte du von der einen Stadt zur anderen
gekommen bist.
Beispiel: Dein Programm sollte bei der Anfrage
travel(valmont,paris,go(valmont,metz,go(metz,paris))) die Antwort
‘yes’ ausgeben. Fragt man dein Programm nach
travel(valmont,losAngeles,X) so sollte es
X = go(valmont,metz,go(metz,paris,go(paris,losAngeles))) ausgeben.
c) Zur noch besseren Routenplanung ist auch eine Ausgabe des Verkehrsmittels
zweckmäßig. Erweitere dein Prädikat travel/3, so dass es dir nicht nur mitteilt,
über welche Zwischenpunkte die Reise geht, sondern auch sagt, mit welchem
Verkehrsmittel die einzelnen Teilstücke zurückgelegt wurden.
Beispiel: die Anfrage travel(valmont,losAngeles,X) sollte
X = car(valmont, metz, train(metz, paris, plane(paris, losAngeles)))
ausgeben.
Bitte wenden
Name:
1. INFORMATIK-KLAUSUR
23.09.2002
Info 13 LK (GA)
Bearbeitungszeit: 180 min
− Seite 2 −
Aufgabe 3: Im Zusammenhang mit Listen haben wir im Unterricht bereits einige Prädikate
kennen gelernt. Hier sollen nun neue Prädikate entwickelt und analysiert
werden:
a) Betrachte das folgende Prädikat wti/4:
wti(_, _, [], []).
wti(X, Y, [X | Rest], [Y | Rest]).
wti(Z1, Z2, [X | Rest], [X | NeuerRest]):Z1 \= X,
wti(Z1, Z2, Rest, NeuerRest).
I) Welche Ausgabe wird bei der Anfrage wti(3,9,[1,2,3,4,5],X)
produziert?
II) Notiere die Ausgabe zur Anfrage wti(1,2,[0,1,1,0,0,0,1,0],Y).
III) Beschreibe allgemein die Wirkung des Prädikats wti/4.
b) Erweitere das oben angegebene Prädikat, so dass die unter a.III) beschriebene
Aktion auf die ganze Liste ausgeweitet wird.
c) Schreibe ein Prädikat restliste/3, welches von einer Liste die Restliste
nach dem ersten Auftreten eines Elements zurück gibt.
Beispiel: restliste([1,2,3,4,5],3,X) wird mit X = [4,5] beantwortet.
d) Gegeben ist das folgende Programm:
wti( [], Liste, Liste ).
wti([Head|Tail], SListe, X ) :split( Head, Tail, Kleiner, Groesser),
wti(Groesser, Rest, X ),
wti(Kleiner, SListe, [Head|Rest]).
/* split(X,Liste,Kleine,Grosse) teilt die Liste
*/
/* bezüglich des Vergleichselements X in die zwei */
/* Listen Kleine und Grosse.
*/
Im ersten Aufruf sollte das dritte Argument immer eine leere Liste sein.
Beispiel: wti([4,3,8,7,1,5,4,8],Ergebnis,[]).
I) Welche Ausgabe wird bei obigem Beispiel getätigt?
II) Gib dem Prädikat einen aus Informatikersicht sinnvollen Namen.
III) Beschreibe die Unterschiede zu dem aus dem Unterricht bekannten
ähnlichen Verfahren.
e) In der folgenden Routine split/4 aus obigen Programm haben sich Fehler
eingeschlichen. Kommentiere jeden Fehler, indem du angibst, inwiefern sich
dieser Fehler äußert (Compilerfehler, Laufzeitfehler). Korrigiere jeden Fehler
einzeln oder gib das gesamte Teilprogramm in korrekter Form an.
split(_, [], K, G).
split(Element, [Head|Tail], Kleiner, Groesser):Head <= Element,
split(Element, Tail, hilfKleiner, Groesser),
append(Head, hilfKleiner, Kleiner).
split(Element, [Head|Tail], Kleiner, Groesser):=
Head > Element,
split(Element, Tail, Kleiner, Groesser),
append(Head, Groesser, Groesser).
Bitte wenden
Name:
Info 13 LK (GA)
1. INFORMATIK-KLAUSUR
Bearbeitungszeit: 180 min
23.09.2002
− Seite 3 −
Aufgabe 4: Aus dem Unterricht kennst du die Baumstruktur. Ein Baum konnte
6
entweder leer (nil) oder eine Wurzel mit zwei Teilbäumen
(baum(W,L,R)) sein.
3
9
a) Stelle den rechts abgebildeten Baum mit Hilfe des Prädikats baum/3
dar.
4
7
10
b) Zeichne den zum folgenden Ausdruck zugehörigen Baum:
baum(2, baum(1, nil, nil), baum(7, baum(3, nil,
8
baum(6, nil, nil)), baum(8, nil, nil)))
c) Implementiere ein Prädikat knotenanzahl/2, welches als Input einen Baum und als
Output die Anzahl der Knoten des Baumes enthält.
Beispiel: knotenanzahl(baum(3,baum(2,nil,nil),baum(5,baum(4,nil,nil),nil)),X)
würde X = 4 ausgeben.
d) Implementiere ein Prädikat baumhoehe/2, welches die Anzahl der Ebenen − also
die Baumhöhe − eines Baumes ausgibt.
Hinweis: Der Baum aus Teilaufgabe a) hat übrigens die Höhe 4!
Ich wünsche dir viel Erfolg!
Name:
1. INFORMATIK-KLAUSUR
23.09.2002
− Seite 4 −
Bearbeitungszeit: 180 min
Info 13 LK (GA)
LÖSUNGEN:
Aufgabe 1: a) Eine Möglichkeit ist die folgende:
direktin(katarina,olga).
direktin(olga,natasha).
direktin(natasha,irina).
b) in(X,Y):- direktin(X,Y).
in(X,Y):- direktin(Z,Y), in(X,Z).
c) Ausgabe ‚no’
d) Ausgabe: X = katarina Y = olga ;
X = olga Y = natasha ;
X = natasha Y = irina ;
X = katarina Y = natasha ;
X = olga Y = irina ;
X = katarina Y = irina
e)
in(katarina, irina)
direktin(katarina, irina)
schlägt fehl
direktin(natascha, irina),
ist erfüllt
in(katarina,natasha)
direktin(katarina, natasha)
schlägt fehl
direktin(olga, natasha),
ist erfüllt
in(katarina,olga)
direktin(katarina, olga)
ist erfüllt
Aufgabe 2: a) Eine Möglichkeit ist:
traveldirekt(X,Y):- byCar(X,Y); byTrain(X,Y); byPlane(X,Y).
travel(X,Y):- traveldirekt(X,Y).
travel(X,Y):- traveldirekt(X,Z),travel(Z,Y).
b) Die Erweiterung könnte wie folgt aussehen:
traveldirekt(X,Y):- byCar(X,Y); byTrain(X,Y); byPlane(X,Y).
travel(X,Y,go(X,Y)):- traveldirekt(X,Y).
travel(X,Y,go(X,Z,F)):- traveldirekt(X,Z),travel(Z,Y,F).
c) Mit Fahrzeugangabe:
travel(X,Y,car(X,Y)):- byCar(X,Y).
travel(X,Y,train(X,Y)):- byTrain(X,Y).
travel(X,Y,plane(X,Y)):- byPlane(X,Y).
travel(X,Y,car(X,Z,F)):- byCar(X,Z),travel(Z,Y,F).
travel(X,Y,train(X,Z,F)):- byTrain(X,Z),travel(Z,Y,F).
travel(X,Y,plane(X,Z,F)):- byPlane(X,Z),travel(Z,Y,F).
Aufgabe 3: a) I) X = [1,2,9,4,5]
II) X = [0,2,1,0,0,0,1,0]
III) Das erste vorkommende Element der Liste, welches mit dem ersten
Argument des Prädikats wti übereinstimmt, wird durch das zweite
Argument ersetzt. Die so gewonnene Liste wird im 4. Argument
zurückgegeben.
1. INFORMATIK-KLAUSUR
Name:
Bearbeitungszeit: 180 min
Info 13 LK (GA)
23.09.2002
− Seite 5 −
b) wti(_, _, [], []).
wti(X, Y, [X | Rest], [Y | NeuerRest]):wti(X,Y,Rest,NeuerRest).
wti(Z1, Z2, [X | Rest], [X | NeuerRest]):Z1 \= X,
wti(Z1, Z2, Rest, NeuerRest).
c) restliste([X | Rest], X, Rest).
restliste([_ | End], X, Rest):restliste(End, X, Rest).
d) I) Ergebnis = [1,3,4,4,5,7,8,8]
II) Ein sinnvoller Name wäre Quicksort.
III) Der wesentliche Unterschied ist der, dass das Prädikat keinen appendBefehl benötigt. Dies gelingt, indem immer eine Liste „mitgeschleppt“
wird, in der sofort die Vereinigung der beiden Teillisten gespeichert
wird. Deshalb muss allerdings auch am Anfang eine leere Liste
mitgegeben werden, da diese am Schluss wieder hinten angefügt wird.
e) Die richtige Prozedur müsste wie folgt aussehen:
split(_, [], [], []).
split(Element, [Head|Tail], Kleiner, Groesser):Head =< Element,
split(Element, Tail, Kleiner1, Groesser),
append([Head],Kleiner1,Kleiner).
split(Element, [Head|Tail], Kleiner, Groesser):Head > Element,
split(Element, Tail, Kleiner, Groesser1),
append([Head],Groesser1,Groesser).
Die Fehler im einzelnen:
1. Zeile: bei einer leeren Liste sollte sowohl die Kleiner- als auch die
Groesser-Liste leer sein. In der falschen Version sind K und G
undefiniert. (Laufzeitfehler).
3. Zeile: <= ist falsch. Richtig: =< (Compilerfehler)
4. Zeile: hilfKleiner muss HilfKleiner heißen, da eine Variable
benötigt wird. (Compilerfehler)
5. Zeile: append benötigt 3 Listen. Head ist aber nur ein Element.
Besser: [Head]. (Compilerfehler).
6. Zeile: := ist falsch. Richtig :- (Compilerfehler).
9. Zeile: Groesser ist sowohl Input- als auch Outputvariable.
(Laufzeitfehler).
Aufgabe 4: a) baum(6,baum(3,nil,baum(4,nil,nil)),
baum(9,baum(7,nil,baum(8,nil,nil)),
baum(10,nil,nil)))
2
1
b) Wie rechts abgebildet.
c)
knotenanzahl(nil,0).
knotenanzahl(baum(W,L,R),Anz):knotenanzahl(L,AnzL), knotenanzahl(R,AnzR), Anz is 1+AnzL+AnzR.
d) baumhoehe(nil,0).
baumhoehe(baum(W,L,R),H):baumhoehe(L,H1), baumhoehe(R,H2), H1>H2, H is H1+1.
baumhoehe(baum(W,L,R),H):baumhoehe(L,H1), baumhoehe(R,H2), H1=<H2, H is H2+1.
7
3
8
6

Documentos relacionados