FB18 - Das Forum für Informatik

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

P1 Aufgabenblatt 4 Aufgabe 2

P1 Aufgabenblatt 4 Aufgabe 2 2002-11-15 16:35
Ksireau
Ja ich bins mal wieder =)
Da ist man froh, gerade mal die letzte Aufgabe verstanden zu haben und dann kommt eigentlich fast das gleiche nochmal aber ich schnall es wieder nich =(
Aufgabe lautet:
Definieren Sie für die in der Datei haeuser2.pl gegebene Datenbasis ein Prädikat vorbesitzer(Person,Objektnummer), das wahr ist für alle Personen, die jemals Eigentümer der Immobilie mit der Eintragung Objektnummer registriert waren.

haeuser2.pl:
:- dynamic(obj/5). % ermoeglicht dynamisches Erweitern
:- dynamic(bew/6). % ermoeglicht dynamisches Erweitern

% obj(Objektnummer, Objekttyp, Strassenname, Hausnummer, Baujahr).
obj(1,efh,gaertnerstr,15,1965).
obj(2,efh,bahnhofsstr,27,1943).
obj(3,efh,bahnhofsstr,29,1955).
obj(4,mfh,bahnhofsstr,28,1991).
obj(5,bahnhof,bahnhofsstr,30,1901).
obj(6,kaufhaus,bahnhofsstr,26,1997).
obj(7,efh,gaertnerstr,17,1982).

% bew(Vorgangsnr, Objektnr, Verkaeufer, Kaeufer, Preis, Verkaufsdatum)
% d(Tag,Monat,Jahr)
bew(1,1,mueller,meier,450000,d(1,1,1997)).
bew(2,3,schulze,schneider,560000,d(13,12,1988)).
bew(3,3,schneider,mueller,615000,d(1,12,1996)).
bew(4,5,bund,piepenbrink,3500000,d(1,6,1990)).
bew(5,6,schulze,schneider,23000000,d(3,5,1998)).
bew(6,1,meier,schroeder,560000,d(15,3,1998)).
bew(7,6,schneider,brauer,31000000,d(7,2,1999)).
bew(8,2,soellner,mueller,370000,d(16,9,1992)).
bew(9,5,piepenbrink,weidner,2300000,d(22,7,1997)).
bew(10,3,mueller,haase,590000,d(30,8,1999)).
—————————————————-

Erstmal allgemeine Frage. Heisst jemals registriert, dass auch der jetzige Besitzer aufgelistet werden soll?
Dann das eigentliche Problem: Soweit klappt das alles, aber bei zyklischen Immobilienverkäufen is dann Ende im Gelände. Ich weiß nicht, was ich mit dem Datum anfangen soll…wieso kann es da nicht auch einfach 30.08.1999 heissen. Jetzt kann man die Datumsangaben garnich so schön vergleichen.
Bislang hab ich das folgendermaßen:
vorbesitzer(Person,Objektnummer) :- bew(_,Objektnummer,Person,_,_,_).
vorbesitzer(Person,Objektnummer) :- bew(_,Objektnummer,_,Person,_,_), not(bew(_,Objektnummer,Person,_,_,_)).
Aber wie ich jetzt herausfinden soll, ob jemand ein Haus gekauft, dann wieder verkauft und dann wieder gekauft hat, hab ich kein Plan.

Re: P1 Aufgabenblatt 4 Aufgabe 2 2002-11-16 11:08
Faleiro
Vielleicht uebersehe ich etwas, aber eigentlich verstehe ich die Aufgabe so, dass das Praedikat fuer alle Personen und Objektnummern, die jemals miteinander im Bett waren, gelingen soll.

War das die ganze Aufgabenstellung oder nur ein Teil?

Da steht jedenfalls nicht, dass man aktuelle Besitzer ausfiltern soll.
vorbesitzer(Person,Objektnummer) :- bew(_,Objektnummer,Person,_,_,_). vorbesitzer(Person,Objektnummer) :- bew(_,Objektnummer,_,Person,_,_).

Re: P1 Aufgabenblatt 4 Aufgabe 2 2002-11-16 13:04
Slater
Erstmal allgemeine Frage. Heisst jemals registriert,
dass auch der jetzige Besitzer aufgelistet werden soll?
nun ja das ist nicht prlog sondern deutsch,
"vorbesitzer" klingt für mich eindeutig nach: die aktuellen
besitzer nicht,
"registriert …" klingt eventuell nach: aktuelle besitzer doch dazu,

ich tendiere zusammen zu: nö, nur die früheren,

Dann das eigentliche Problem: Soweit klappt das alles,
aber bei zyklischen Immobilienverkäufen is dann Ende im Gelände.
das war bei besitzt() doch genauso, da hat dich das nicht
gestört ;)
Ich weiß nicht, was ich mit dem Datum anfangen soll…
wieso kann es da nicht auch einfach 30.08.1999 heissen.
Jetzt kann man die Datumsangaben garnich so schön vergleichen.
da heisst es sich flott selber aushelfen, das sind
doch schöne zahlen, auf die man einzelnd zugreifen und
vergleichen kann, und nach welchen regeln ist auch bekannt,

schwups macht man aus der sprachlichen regel, auf die man
schon durch nachdenken und anschauen ein paar ähnlicher
beispiele kommen sollte:
("datum 1 ist früher als datum 2,
wenn jahr 1 früher ist als jahr 2,
oder bei gleichen jahren monat 1 früher ist als monat 2,
oder bei gleichen jahren/ monaten tag 1 früher ist als tag 2")
ein prädikat:
frueher(d( _, _,J1),d( _, _,J2)) :- J1< J2. frueher(d( _,M1,J1),d( _,M2,J2)) :- J1=J2, M1< M2. frueher(d(T1,M1,J1),d(T2,M2,J2)) :- J1=J2, M1=M2, T1< T2. frueher() nimmt 2 (vollspezifizierte) daten und gibt
'Yes' wenn das erste frueher ist als das zweite, sonst 'No',
Bislang hab ich das folgendermaßen:
vorbesitzer(Person,Objektnummer) :- bew(_,Objektnummer,Person,_,_,_).
vorbesitzer(Person,Objektnummer) :- bew(_,Objektnummer,_,Person,_,_),
not(bew(_,Objektnummer,Person,_,_,_)).

Aber wie ich jetzt herausfinden soll, ob jemand ein Haus gekauft,
dann wieder verkauft und dann wieder gekauft hat, hab ich kein Plan.
tja, wie bei besitzt(), dabei ist das eigentlich einfach zu formulieren

für besitzt():
"gesuchte person besitzt das haus,
wenn sie das haus gekauft und danach nicht wieder verkauft hat",

fertig, alle eventualitäten drinne,
konnte ich letztens nicht hinschreiben (bis auf listenvariante),
da not() nur ein argument haben darf,
nun fiel mir aber wieder ein, einfach das komplexe argument von not als
neue regel zu definieren, macht:

verkaufnach(VK,OB,D) :- bew(_,OB,VK,_,_,_D2),not(frueher(_D2,D)).

besitzt(BE,OB) :- bew(_,OB,_,BE,_,_D),not(verkaufnach(BE,OB,_D)).

verkaufnach() gibt "Yes" wenn angegebener verkäufer das objekt
nach dem dem angegeben datum wieder verkauft hat

besitzt() gibt "Yes" wenn der besitzer das objekt besitzt..
für vorbesitzer():
"gesuchte person war vorbesitzer des hauses,
wenn sie das haus verkauft hat, davor nie verkauft hat und
jetzt nicht mehr besitzt"

der zusatz "davor nie verkauft", damit die gleiche person nicht
mehrmals ausgewählt wird,

verkaufbis(VB,OB,D) :- bew(_,OB,VB, _,_,_D2),frueher(_D2,D). vorbesitzer(VB,OB) :- bew(_,OB,VB, _,_,_D), not(verkaufbis(VB,OB,_D)), not(besitzt(VB,OB)).
verkaufbis() gibt "Yes" wenn angegebener verkäufer das objekt
vor dem dem angegeben datum schon einmal verkauft hat

vorbesitzer() gibt "Yes" für alle vorbesitzer wie oben beschrieben

der zusatz "jetzt nicht mehr besitzt",
damit die aktuellen besitzer nicht dazugezählt werden,

sollen sie doch dazugezählt werden, muss dieser zusatz weg,
und für die aktuellen besitzer, die nie verkauft haben,
(solls ja auch geben) noch eine 2. regel dazu




Re: P1 Aufgabenblatt 4 Aufgabe 2 2002-11-16 15:29
Ksireau
Boa RESPECT!
Vielen vielen Dank! Wie kann man sowas einfach mal so locker ausm Handgelenk schütteln?!? Irgendwie hab ich Schwierigkeiten so ein Problem in Prolog zu lösen.
Ich hätte vielleicht noch schreiben sollen, dass Aufgabenteil (d) explizit verlangt, dass bei zyklischen Verkäufen kein Vorbesitzer mehrmals ausgegeben wird. Das ist auch der Grund, warum mir das diesmal so wichtig war, dass es funktioniert =)
Auf jedenfall hat dieser Satz bei mir den AAAaahhh-Effekt ausgelöst:
für vorbesitzer():
"gesuchte person war vorbesitzer des hauses,
wenn sie das haus verkauft hat, davor nie verkauft hat und
jetzt nicht mehr besitzt"


Re: P1 Aufgabenblatt 4 Aufgabe 2 2002-11-17 20:09
RaggaDee
Bislang hab ich das folgendermaßen:
vorbesitzer(Person,Objektnummer) :- bew(_,Objektnummer,Person,_,_,_).
vorbesitzer(Person,Objektnummer) :- bew(_,Objektnummer,_,Person,_,_), not(bew(_,Objektnummer,Person,_,_,_)).
Diese regelgeschichte hab ich immer noch nich aufm Schirm: Schreibt man die als Anfrage rein oder in den Quelltext oder kann man beides?



Re: P1 Aufgabenblatt 4 Aufgabe 2 2002-11-17 20:27
Slater
eine regel nur im quellcode, vielleicht kriegt man sie per assert() auch über die anfrage hinein in die faktensammlung,

unabhängig davon kann man den rechten teil der regel (denn der linke teil ist ja nur die abkürzung davon) auch so an der anfrage anfragen,

geht natürlich immer nur für den rechten teil EINER regel, es sei denn, es ist ein 'oder'-zeichen definiert,

und bei rekursiven aufrufen wirds nicht klappen, da die regel nicht in den fakten gefunden wird, da sie nicht da ist..