FB18 - Das Forum für Informatik

fb18.de / Diplom Informatik / Unterbereich Grundstudium / Praktische Informatik

P1 Probeklausur - Lösungen zu 5

P1 Probeklausur - Lösungen zu 5 2002-01-02 14:53
Popcorn
Abermals keine Musterlösung:

% Um die vorgegebene Liste Erzeugen zu können:
:- dynamic kennzeichen/2.
kennzeichen(hh-gu12-67, 1992).
kennzeichen(hh-wa34-25, 1987).
kennzeichen(hh-ig84-62, 1998).
kennzeichen(hh-ba39-29, 1983).

(a)
bestand(X) :- findall(Daten,kennzeichen(_,Daten),Bestandliste), length(Bestandliste, X).

% ?- bestand(X).
% X = ;
% No

(b)
alter(Bestandsliste, Alter)
:- Zdatum is 2001 - Alter,
findall((Kennzeichen),(kennzeichen(Kennzeichen,_Baujahr), _Baujahr< Zdatum),Bestandsliste).

% Das Leerzeichen zwischen < und Zdatum noch entfernen.
% ?- alter(X, 10).
% X = [hh-wa34-25, hh-ba39-29];
% No

©
altbaujahr(Sieger)
:- findall(Baujahr,kennzeichen(_,Baujahr), Liste), altsieg(Liste, Sieger).

altsieg([],'Keine Fahrezuge in der Liste').
altsieg([Sieger],[Sieger]).
altsieg([Kopf,Kopf2|Liste],Sieger) :- Kopf>Kopf2, altsieg([Kopf2|Liste],Sieger).
altsieg([Kopf,Kopf2|Liste],Sieger) :- Kopf=< Kopf2, altsieg([Kopf|Liste],Sieger).

% Zwischen =< und Kopf2 muss natürlich das Leerzeichen weg.
% altbaujahr(X).
% X = ;
% No


Re: P1 Probeklausur - Lösungen zu 5 2002-01-02 16:13
Zaphod
zu 5© (= 5 (d)):
Hier meine Lösung, die ich allerdings bisher nur in meinem Kopf getestet habe:
Zunächst einmal die Vorgehensweise: Ich setze einen Akkumulator ein, und betrachte immer das erste Element der Fahrzeugliste.
Ist das Auto älter, dann wird das Alter im Akkumulator gespeichert, und ich mache mit der restliste weiter. Ansonsten behalte
ich den Wert des Akku bei und mache mit der Restliste weiter. Schließlich erhalte ich eine leere Fahrzeugliste und der Akku
enthält den Wert des ältesten Autos

alt(Liste, M):- alt2(Liste,0,M)

%der benötigte Akkumulator soll den Anwender nicht
%interessieren, daher alt2

alt2([],Akku,M):- Akku\=0,
M is Akku.

%liegt eine leere Liste vor, so soll das Ergebnis M das
%Ergebnis des Akkumulators übernehmen. Allerdings soll
%natürlich bei einer leeren Autoliste auch kein Baujahr
%zurückgegeben werden, daher: Akku\=0(Startwert)

alt2([[F,B]|Restliste],Akku,M):- alt2(Restliste,B,M),
Akku=0.

%wenn der Akku den Startwert hat, so soll er auf jeden
%Fall verändert werden.

alt2([[F,B]|Restliste],Akku,M):- alt2(Restliste,Akku,M),
Akku < B,
Akku \= 0.

%aktuelles Fahrzeug ist nicht älter als der im Akku
%gespeicherte Wert, daher wird ohne Änderung mit der
%Restliste weitergemacht.

alt2([[F,B]|Restliste],Akku,M):- alt2(Restliste,B,M),
Akku >= B.

%ist das aktuelle Fahrzeug älter, wird sein Wert
%gespeichert und mit der Restliste fortgefahren.


So, dass dürfte es gewesen sein. Zögert nicht zu schreiben, wenn ihr einen Fehler entdeckt ;-) Ich habe lange überlegt, ob
es möglich ist, das M aus alt2 herauszuhalten, mir ist aber nicht ganz klar, ob dann alles klappt, also hab ich es so gelassen.


Re: P1 Probeklausur - Lösungen zu 5 2002-01-02 16:23
Anonymer User
Dein altsieg würd ich so schreiben:

%altsieg(Liste,Sieger).

altsieg([X],X).
altsieg([K1,K2|Rest],X):- K1 > K2, altsieg([K1|Rest],X).
altsieg([K1,K2|Rest],X):- K2 > K1, altsieg([K2|Rest],X).

Das klappt dann auch.

Aber mal ne andere Frage,
du hast dir ja die Aufgabe ziemlich leicht gemacht. Ich meine in der Klausur stand nur drin das eine Liste gegeben ist. Du
erschaffst aber eine eigene neue Datenbank. Meint ihr wirklich, das man das in der Klausur darf????
Ich würds cool finden, dann wäre die Aufgabe nämlich easy.

Ich habs so probiert und bin dann nicht weiter gekommen:

(5.a):
?-length([[hh-gg-323,2233],[hh-xx-2324],…],Ausgabe).

(5.b):
baujahr([[]],0).
baujahr([[_|Baujahr]|Rest],Baujahr).
baujahr([_|Rest],Baujahr):- baujahr(Rest,Baujahr).

aelter_als(X,L):- findall(Jahr,(baujahr(L,Jahr),Jahr < (2000 - x)),L).

Das wird aber derbe kopliziert, ich glaube dein weg ist besser, sagt mir einfach das ich den oberen Weg in der Klausur einschlagen
darf. Dann bin ich zufrieden [img]http://images.rapidforum.com/images/i25.gif[/img]
CU
HG




Re: P1 Probeklausur - Lösungen zu 5 2002-01-02 16:52
Popcorn
Dein altsieg würd ich so schreiben:

%altsieg(Liste,Sieger).

altsieg([X],X).
altsieg([K1,K2|Rest],X):- K1 > K2, altsieg([K1|Rest],X).
altsieg([K1,K2|Rest],X):- K2 > K1, altsieg([K2|Rest],X).

Das klappt dann auch.
Bei der speziellen Liste sicher. Aber was, wenn zwei Fahrzeuge mal das gleiche Baujahr haben oder gar keine Fahrzeuge im
Bestand sind?!

Aber mal ne andere Frage,
du hast dir ja die Aufgabe ziemlich leicht gemacht. Ich meine in der Klausur stand nur drin das eine Liste gegeben ist. Du
erschaffst aber eine eigene neue Datenbank. Meint ihr wirklich, das man das in der Klausur darf????
Ich würds cool finden, dann wäre die Aufgabe nämlich easy.
Dann tu das mal! [img]http://images.rapidforum.com/images/i23.gif[/img] Ich habe das so nur zur Veranschaulichung gemacht. Bei z.B. Altbaujahr kannst Du Dir dann sogar noch
das findall sparen und einfach für Liste im Altsieg die vorgegebene Liste einsetzen. [img]http://images.rapidforum.com/images/i23.gif[/img] Funktioniert ebenfalls wunderbar.

(5.a):
?-length([[hh-gg-323,2233],[hh-xx-2324],…],Ausgabe).
Du sollst aber ein Prädikat definieren. Hier musst Du ja jedesmal selbst die Liste eingeben! Also wenn schon, dann:
Bestand(Ausgabe) :-
length([[hh-gg-323,2233],[hh-xx-2324],…],Ausgabe).
Das ist kürzer und entspricht auch weniger dem Aufgabentyp "stellen sie eine Anfrage an". Also im Prizip, wie ich es oben
geschrieben habe, nur dass hier noch einmal die Liste per Hand geschrieben wird.
Auf dem Papier würde ich es im übrigen so handeln, dass ich der Liste einen Namen gebe (meinetwegen Bestand=) und mir dann
die Arbeit erspare.

Das wird aber derbe kopliziert, ich glaube dein weg ist besser, sagt mir einfach das ich den oberen Weg in der Klausur einschlagen
darf. Dann bin ich zufrieden [img]http://images.rapidforum.com/images/i25.gif[/img]
Also (a) und © bzw. (d) gehen meiner (bin ja auch nur Ersemester [img]http://images.rapidforum.com/images/i23.gif[/img]) Meinung nach nicht mit voller Punktzahl durch.
Für das Baujahr (Aufgabe b) tun mir jetzt schon wieder die Augen zu doll weh. Vielleicht mag ja wer anders noch einen Blick
drauf werfen oder ich tu das nachher.

So long!