2. Logik Ex


Meine Beschreibung ist schoener :smiley:


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… :slight_smile:


100% agree, bei der 3. ex werd ich mir mehr mühe geben :wink:


programmierst du auch so? :smiley: Alles schön formgerecht eingerückt, aber der Code ist totaler nonsense? xD


Und wer hat die schönste Lösung?
Crypton hat ja angekündigt, seine Lösung (oder eher: seinen Lösungsversuch) hier zu posten :slight_smile:


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 :confused:

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 :wink:


oder auch:

unzip([X,Y],[X],[Y]).

Aber die leere Liste ist doch viel schöner… :wink:


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…


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 :slight_smile:


funktioniert in dieser Reihenfolge auch ohne „X = H“, da ja der einzige andere Fall schon in
der Zeile darüber verarbeitet wird.


Aber es funktioniert :smiley:

Blöderweise habe ich die Abbruchbedingung verpeilt :frowning:


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 :wink: ) 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?