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..