FB18 - Das Forum für Informatik

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

P1 Übung 7

P1 Übung 7 2002-12-07 10:56
RaggaDee
http://kogs-www.informatik.uni-hamburg.de/~klug/p1/Aufgabenblatt07.pdf

wenn ich in aufg 1 ne liste kreiert hab, was mach ich denn damit. habe 3 wochen keine p lösungen mehr gemacht, wieß irgendwie überhaupt keinen anafng :-(

Re: P1 Übung 7 2002-12-07 12:01
Slater
was ist denn deine genaue frage?
ja die aufgabe ist irgendwie ungenau gestellt,
wahrscheinlich soll so eine art prädikat geschrieben werden:

?- ueber([der,hund,schlaeft],X).

X = [the, dog, sleeps] ;

No

oder sowas in der art



dazu brauchst das wörterbuch, z.B.

wb([[hund,dog],…..]).

und dann das übersetzungsprädikat,
hast dazu fragen wie das aufgebaut ist oder wie?

eine möglichkeit im groben:
liste übersetzen: eingabeliste zerteilen, kopf übersetzen, restliste rekursiv übersetzen,

kopf übersetzen: kopf mit kopf des wb vergleichen, wenn nicht gefunden, dann kopf rekursiv mit restliste des wb vergleichen


Re: P1 Übung 7 2002-12-07 12:52
Anonymer User
mog-gen!

Warum funktioniert dies hier nicht?

%Ein-Wort-Uebersetzung uebersetze(Transferliste,deutsches Wort, englisches Wort)

uebersetze([[H,T]|_],Ger,Eng):-H = Ger,Eng is T.
uebersetze([[H,_]|Tail],Ger,Eng):-H \= Ger,uebersetze(Tail,Ger,Eng).

?- uebersetze([[a,b],[c,d]],a,Eng).
ERROR: Arithmetic: `b/0' is not a function
Exception: (7) uebersetze([[a, b], [c, d]], a, _G174) ? abort
% Execution Aborted
?-

Und das ist ja noch nichtmal ne Uebersetzung einer ganzen Liste.

danke!
kernelpanic

Re: P1 Übung 7 2002-12-07 13:00
Slater
huhu
uebersetze([[H,T]|_],Ger,Eng):-H = Ger,Eng is T.
da hat das 'is' nix zu suchen, das wird nur für mathematische berechnungen verwendet,
stattdessen soll ja unifiziert werden, also
uebersetze([[H,T]|_],Ger,Eng):-H = Ger,Eng = T.

oder kürzer

uebersetze([[H,T]|_],H,T).

uebersetze([[H,_]|Tail],Ger,Eng):-H \= Ger,uebersetze(Tail,Ger,Eng).
weiss nicht, ob dass '\=' ein erlaubter operator ist, werd ich mal testen, funktionieren tut sonst auch 'not(H = Ger)'
sonst gehts so hoff ich mal


edit
jo bei \= kann der compiler nicht meckern, das prädikat ist dann so schon ok

Re: P1 Übung 7 2002-12-07 22:06
Ksireau
eine möglichkeit im groben:
liste übersetzen: eingabeliste zerteilen, kopf übersetzen, restliste rekursiv übersetzen,

kopf übersetzen: kopf mit kopf des wb vergleichen, wenn nicht gefunden, dann kopf rekursiv mit restliste des wb vergleichen
Das hört sich total logisch an, aber wieso schnall ich Idiot nicht, wie man daran gehen soll?
Wie soll das Wörterbuch überhaupt vorliegen? Als Liste oder als Datenbasis? Wenn als Liste, wie vergleicht man dann den Kopf aus der Eingabe-Liste mit dem Kopf aus der vordefinierten Liste… brain overflow, echtma!

Re: P1 Übung 7 2002-12-07 22:09
Slater
tja was soll ich sagen,

die listen-darstellung und die übersetzung eines wortes stehen doch schon im originalcode da [img]http://www.sternenvolk.de/symb/24.gif[/img] [img]http://www.sternenvolk.de/symb/24.gif[/img]

Re: P1 Übung 7 2002-12-07 22:17
Ksireau
Also die Liste kommt jetzt als
wb([[hund,dog],[katze,cat],…])
in den Quelltext oben, hab ich das richtig verstanden?
Die soll ja laut Aufgabenstellung implementiert (oh man 4 mal vertippt bei dem Wort =) ) werden. Da verstehe ich drunter, dass man die nicht immer eingeben soll.
So jetzt weiß ich aber nicht, wie ich bei einem Aufruf wie:

translate([Katze, schläft, mit, Hund],X).

den Kopf von der Eingabeliste mit dem Kopf von 'wb' vergleiche. Einfach wb([X|_]) oder wie?


Re: P1 Übung 7 2002-12-07 22:27
Slater
für das wörterbuch gibts vielleicht noch andere darstellungen,
die fiel mir grad ein und klappt doch super

tja und dann translaten (tranSLATERn ;) ):
ich zieh das mal nicht ewig hinaus:

%woerterbuch
wb([[hund,dog],[katze,cat],[mann,man],[frau,woman],[der,the],[die,the],[schlaeft,sleeps]]).

%einzeluebersetzung: wortueber(wort,uebersetztes wort, woerterbuch)
wortueber(X,UEX,[[X,UEX]|_]).
wortueber(X,UEX,[[WBAD,_]|WBR]) :- X \= WBAD,wortueber(X,UEX,WBR).
wortueber(_,unbekannt,[]).

%satzuebersetzung: ueber([satzkopf|satzrest],[uebersetztersatkopf|uebersetzersatzrest])
ueber([X|R],[UEX|UER]) :- wb(WB),wortueber(X,UEX,WB),ueber(R,UER).
ueber([],[]).

wie man darauf kommen soll?, vorlesung, skript, denken..

Re: P1 Übung 7 2002-12-07 22:34
Ksireau
Vorlesung……done
Skript………done
denken………failed

Ich danke dir!
Ich hab die ganze Zeit versucht das zweistellig zu machen das Prädikat. Ich werde das Prädikat jetzt auf meiner Lösung translater nennen. =)

Re: P1 Übung 7 2002-12-08 18:06
Anonymer User
helou!

So, ich hab mal in eigenentwicklung dieses hier zusammengebastelt, und haette gerne einen Hinweis, warum ich immer "No" rausbekomme.

% Listenlaenge (Liste, Laenge)
listenLaenge([],0).
listenLaenge([_|T],Laenge):-listenLaenge(T,UnterLaenge),Laenge is UnterLaenge+1.

%Ein-Wort-Uebersetzung uebersetze(Transferliste,deutsches Wort, englisches Wort)
uebersetze([[H,T]|_],Ger,Eng):-H = Ger,Eng = T.
uebersetze([[H,_]|Tail],Ger,Eng):-H \= Ger,uebersetze(Tail,Ger,Eng).

% Listenuebersetzung
uebersetzeListe(_,X,Y,Y):-listenLaenge(X,0),writeln(Y).
uebersetzeListe([WBuch],[IHead|ITail],[OList],[OList2]):-not(listenLaenge([IHead,ITail],0)),uebersetze(WBuch,IHead,OWort),OList = [OList|OWort],uebersetzeListe([WBuch],[ITail],[OList],[OList2]).

Ich habe zwei Ergebnislisten (Olist und Olist2), weil ich mir nicht sicher bin, dass die erste Ergebnisliste beim Ruecklauf der Rekursion nicht wieder geloescht werden wuerde. Ich tippe mal eher auf ne, aber hab das zur sicherheit eingebaut.

danke!
kernelpanic

Re: P1 Übung 7 2002-12-08 19:16
Slater
puh da hab ich ja zu tun dran ;)

mal sehen, erst mal grob aussortieren ;) :

% Listenlaenge (Liste, Laenge)
listenLaenge([],0).
listenLaenge([_|T],Laenge):-listenLaenge(T,UnterLaenge),Laenge is UnterLaenge+1.
zwar unnötig, aber sollte doch laufen
%Ein-Wort-Uebersetzung uebersetze(Transferliste,deutsches Wort, englisches Wort)
uebersetze([[H,T]|_],Ger,Eng):-H = Ger,Eng = T.
uebersetze([[H,_]|Tail],Ger,Eng):-H \= Ger,uebersetze(Tail,Ger,Eng).
wie gesagt,
'uebersetze([[H,T]|_],H,T).'
ist glaub ich eleganter/ logischer/ verständlicher/ schneller,
aber das andere tuts auch
% Listenuebersetzung
uebersetzeListe(_,X,Y,Y):-listenLaenge(X,0),writeln(Y).
write_ln heisst das bei mir, sonst ok in angesicht des aufbaus

uebersetzeListe([WBuch],[IHead|ITail],[OList],[OList2]):-not(listenLaenge([IHead,ITail],0)),uebersetze(WBuch,IHead,OWort),OList = [OList|OWort],uebersetzeListe([WBuch],[ITail],[OList],[OList2]).
hier ist nun das grosse desaster,
1.
wieso nimmst du beim 1. parameter das WBuch aus den klammern raus?,
ist der parameter eine liste, wie z.b [[der,the],[hund,dog]] kommt es hier schon zum No, denn WBuch und [der,the],[hund,dog] unifizieren nicht,
der aufruf funktioniert dann nur mit dem parameter [[[der,the],[hund,dog]]], das ist doch unnötig, schreib WBuch statt [WBuch]
2.
der aufruf wird nur bearbeitet, wenn auch der 2. paramteter mit [IHead|ITail] unifiziert (sonst gibt es bereits No), also muss die liste mindestens die länge 1 haben,
der teil 'not(listenLaenge([IHead,ITail],0))' ist also IMMER wahr, wenn er denn bearbeitet wird, damit eigentlich überflüssig,
zumal du wahrscheinlich 'not(listenLaenge([IHead|ITail],0))' schreiben wolltest,
(es steht sogar im aufruf 'not(listenLaenge([IHead,ITail],0))', dass die liste in IHead und ITail zerfallen soll, damit wird sie doch nie die länge 0 haben)
2.b.
'[OList],[OList2]' bei den parametern kann man auch wieder nicht machen,
die listen sind die listen, nicht der inhalt der listen, die klammern müssen dazugehören, also nicht hinschreiben
3.
der teil 'uebersetze(WBuch,IHead,OWort)' könnte funktionieren, wenn das WBuch wie bei 1. beschrieben richtig unifiziert
4.
'OList = [OList|OWort]' wird dagegen nie funktionieren, aus verschiedenen gründen ( ;) ):
eine variable steht links und rechts -> Unifikations-SuperGau
selbst wenn die rechte OList anders benannt wäre, sie ist noch gar nicht bestimmt..,
der listenaufbau ist wort|liste nicht andersrum, usw,
wahrscheinlich meinst du 'OList = [OWort|OAndereList]',
der aufruf ist durchaus nett, aber erst muss die andere liste bestimmt werden (z.b. durch rekursiven aufruf), also die listenzusammensetzung danach,
wenn du die liste von vorne aufbauen wolltest, hmm ok könnte auch gehen, müsstest mit einer leeren liste anfangen, und bei jedem rekursionsschritt das aktuelle übersetzte wort vorne ranhängen, dann hast du halt ne falsche reihenfolge..,
aber die listen haben dennoch verschiedene namen
5.
'uebersetzeListe([WBuch],[ITail],[OList],[OList2])'
hmm ja, OList2 wird also immer nur durchgereicht, und vielleicht am ende mit der fertigen OList unifiziert?, ui kompliziert kompliziert,
falsche listendarstellung für alle 4 parameter noch,
z.b ITail ist schon eine Liste, auch hier keine [ ] drumherum,

es fällt insgesammt noch der entscheidene punkt auf, dass
es keinen rekursionsanfang gibt,
die OList wird immer aus dem aktuell übersetzten wort und einer anderen liste (aus der gleichen geht nicht wirklich) zusammengesetzt,
ah, wenn man den aufruf mit einer leeren liste als 3. parameter startet dann könnte es gehen, das musst du doch sagen!
werd mal ne lauffähige version basteln..




Re: P1 Übung 7 2002-12-08 19:27
Slater
ok so geht es, allerdings in umgekehrter reihenfolge.., weil ja die liste jeweils vor den rekursionsaufruf erweitert wird

% Listenlaenge (Liste, Laenge)
ll([],0).
ll([_|T],Laenge):-ll(T,UnterLaenge),Laenge is UnterLaenge+1.

%Ein-Wort-Uebersetzung uebersetze(Transferliste,deutsches Wort, englisches Wort)
ue([[H,T]|_],Ger,Eng):-H = Ger,Eng = T.
ue([[H,_]|Tail],Ger,Eng):-H \= Ger,ue(Tail,Ger,Eng).

% Listenuebersetzung
uel(_,X,Y,Y):-ll(X,0),write_ln(Y).
uel(WBuch,[IHead|ITail],OList,OList2):- ue(WBuch,IHead,OWort),OListNeu = [OWort|OList],uel(WBuch,ITail,OListNeu,OList2).


erfolgreicher aufruf z.b.:
?- uel([[hund,dog],[der,the]],[der,hund],[],X).
[dog, the]

X = [dog, the] ;

No
?-


Re: P1 Übung 7 2002-12-08 19:32
Anonymer User
hi!


bin in zwei stunden wieder da und probiere es dann nochmal su.

VIELEN DANK erstmal!

kernelpanic