Meine Beschreibung ist schoener
Ah du bist also einer von diesen 2-Fach Bachelor’n in Kooperation mit der Philfak?
Eher 2-Fach Leben.
Apropos, jetzt mag ich dich wieder, wenn du so geistig bist…
Zitat von sotsoguk: wollte mal die aufgabe aus meiner Logik Ex heute posten.
Meine Beschreibung ist schoener
100% agree, bei der 3. ex werd ich mir mehr mühe geben
Extrem ausgedrückt heißt wie in der Kunst „nehm’s nicht wörtlich ernst, sondern betrachte eher die Form. Der Inhalt ist sekundär. Form ist wichtig.“.
programmierst du auch so? Alles schön formgerecht eingerückt, aber der Code ist totaler nonsense? xD
sotsoguk:wollte mal die aufgabe aus meiner Logik Ex heute posten.
Meine Beschreibung ist schoener
Und wer hat die schönste Lösung?
Crypton hat ja angekündigt, seine Lösung (oder eher: seinen Lösungsversuch) hier zu posten
Also die unzip Aufgabe könnte man z.B. folgendermaßen lösen:
unzip(Input,L,R):-
left(Input,L,R).
left([],[],[]).
left([H|T],[H|L],R):-
right(T,L,R).
right([],[],[]).
right([H|T],L,[H|R]):-
left(T,L,R).
Hier meine Lösung für die unzip Aufgabe mit Akkumulator:
accunzip([E1,E2|T],A1,A2,L,R) :- append(A1,[E1],Lneu),
append(A2,[E2],Rneu),
accunzip(T,Lneu,Rneu,L,R).
accunzip([],A1,A2,A1,A2).
unzip(X,L,R) :- accunzip(X,[],[],L,R).
Die mit dem ersten und letzten Element tauschen fand ich knackig:
tauschen([H1|T1],Y) :- rev(T1,[H2|T2]),
rev(T2,A1),
append([H2],A1,A2),
append(A2,[H1],Y).
(wobei append und rev(erse) einfach diese Standartmethoden sind, die ich mir hier jetzt mal gespart habe hinzuschreiben. Siehe http://cs.union.edu/~striegnk/learn-prolog-now/html/node45.html#lecture6 )
Nach langem Überlegen komm ich meistens drauf aber dazu werd ich wohl nachher keine Zeit haben
Unzip
Oder so:
unzip([],[],[]).
unzip([First,Second|T],[First|Odd],[Second|Even]) :-
unzip(T,Odd,Even).
Für den Abbruchfall braucht man garnicht bis zur leeren Liste gehen:
unzip([X, Y|[]], [X], [Y]).
reicht auch.
Mit der leeren Liste gehts aber natürlich auch
unzip([X, Y|], , [Y]).
reicht auch.
oder auch:
unzip([X,Y],[X],[Y]).
Aber die leere Liste ist doch viel schöner…
Und was ist mit einer Liste mit ungerader Anzahl an Elementen?
Oder war das in der Aufgabenstellung ausgeschlossen?
Und den Fall der leeren Liste würde ich mit reinnehmen, denn warum sollte man diesen Fall ausschliessen?
Laut Aufgabe muss ungerade nicht funktionieren, wäre aber auch schön, wenn es geht.
Ich habe bei der Abbruchbedingung leider einen Fehler (ich habe unzip([],L,R). aus Versehen gemacht, poste aber die korrigierte Form:
unzip([],[],[]).
unzip([],[],[],) :- unzip([],[],[]).
unzip([H|T],[H|TL],R) :- unzip(T,TL,R,).
unzip([H|T],L,[H|TR],_) :- unzip(T,L,TR).
Das funktioniert auch mit ungeraden Listen.
Für ungerade Listen ist in meiner Version nur eine zusätzliche
Abbruchbedingung nötig:
unzip([],[],[]).
unzip([X],[X],[]).
unzip([First,Second|T],[First|Odd],[Second|Even]) :-
unzip(T,Odd,Even).
So und da ich weiß, dass es auch Leute gibt die erst morgen ihre Ex schreiben, hier mal die Aufgabenstellung (sinngemäß) wie es heute bei uns dran war:
Schreiben Sie ein Prädikat, welches ein vorgegebenes Zeichen komplett aus der Liste entfernt:
entf([a,a,a,4,g,a,4],a,X).
→
X = [4,g,4]
Edit:
Und gleich mein (viel zu komplizierter, aber anscheinend korrekter) Lösungsvorschlag:
append([],L,L).
append([H|T],L2,[H|L3]) :- append(T,L2,L3).
accentf([H|T],H,X,A) :- accentf(T,H,X,A).
accentf([H|T],B,X,A) :- append(A,[H],Aneu),
accentf(T,B,X,Aneu).
accentf([],_,A,A).
entf(L,B,X) :- accentf(L,B,X,[]).
Also unser Übungsleiter hat uns gleich nach der Ex die Lösung an die Tafel geschrieben und das war nur 3 Zeilen lang. Naja was solls…
Also unser Übungsleiter hat uns gleich nach der Ex die Lösung an die Tafel geschrieben und das war nur 3 Zeilen lang. Naja was solls…
Dafür hast du Akkumulator und Endrekursion.
Hier der 3-Zeiler:
entf([], _, []).
entf([H | T], H, T2) :- entf(T, H, T2).
entf([H | T], X, [H | T2]) :- X \= H, entf(T, X, T2).
@Crono: ziemlich kreativ, die Unterscheidung, ob du in die rechte oder in die linke Liste einfügen musst, durch die Unterscheidung 3- bzw. 4-stelliges Prädikat zu machen
entf([H | T], H, T2) :- entf(T, H, T2). entf([H | T], X, [H | T2]) :- X \= H, entf(T, X, T2).
funktioniert in dieser Reihenfolge auch ohne „X = H“, da ja der einzige andere Fall schon in
der Zeile darüber verarbeitet wird.
@Crono: ziemlich kreativ, die Unterscheidung, ob du in die rechte oder in die linke Liste einfügen musst, durch die Unterscheidung 3- bzw. 4-stelliges Prädikat zu machen
Aber es funktioniert
Blöderweise habe ich die Abbruchbedingung verpeilt
Zu dem Entfernen: Das ganze funktioniert nicht ohne X = H, da er ansonsten im Backtracking noch weitere, allerdings falsche Lösungen findet.
(Man könnte stattdessen in der zweiten Zeile auch einen Cut einfügen.)
gibts eigentlich irgendnen trick, wie man relativ sicher(sicher iss natürlich nix, klar ) in den 15 minuten auf diese prädikate kommt?
die lösungen find ich danach immer ziemlich logisch, aber selber draufkommen… ohne zu testen, ist das nicht ein bisschen ne glückssache in der zeit?