FB18 - Das Forum für Informatik

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

P1-Klausur - Prolog - Hilfe!

P1-Klausur - Prolog - Hilfe! 2003-03-05 13:05
Frischling
Hi Leute,

kann sich jemand von Euch an die Prologaufgaben im 1. Klausur-Termin erinnern, wo es um diese Binären-Listen ging.

Addition, Multiplikation usw.

Wir realisiere ich zum Beispiel in Prolog folgendes Problem:

Zwei Listen mit Binärenzahlenreihen ([1,0,1] und [1,0,0]) sollen addiert werden, sodass als Ergebniss [1,0,0,1] heraus kommt!

Hat allgemein jemand diesen Prolog-Aufgabenblock aus der 1. Klausur noch im Gedächnis und könnte einen Abriss geben??

LG Frischling

Re: P1-Klausur - Prolog - Hilfe! 2003-03-05 14:14
Anonymer User
du, diese aufgabe hab ich auch nicht, hab sonst aber zum glück bestanden, habe bloß gesehen, dass du bei beiden fragen keine antwort hast und wollte dir jetzt mal kurz was schreiben!
und, du findest bestimmt eine gut übungsgruppe.da ich selbst nur knapp durchgekommen bin und nicht so viel ahnung hab, kann ich wohl nicht behilflich sein!
liebe grüße

Re: P1-Klausur - Prolog - Hilfe! 2003-03-05 14:25
Anonymer User
Hallo Frischling,

die Klausuraufgabe bezog sich nur darauf, das Verfahren "Russische Bauernmultiplikation" mit Prolog zu schreiben, nicht aber die dafuer noetige Addidtion (die sollte als bekannt vorausgesetzt werden).
Das Verfahren kann man auf den ersten Seiten des ersten Prologskriptes nachlesen.

SK

Re: P1-Klausur - Prolog - Hilfe! 2003-03-05 14:31
Frischling
Heißt das, dass diese Binäraufgaben mit der Rusischen Bauernmultiplikation zu lösen waren, ich muss das doch auf die Binär-Rechnung umsetzen?

Ist das nicht etwas zu einfach?

LG Frischling

PS:
Wäre nett, wenn jemand hiermal eine Beispiel-Lösung definieren könnte. Ich glaube nämlich ich steig da ganz und garnicht durch.

Da ist doch soviel zu Beachten. Zum einen sind das Listen, deren Ergebnise addiert werden sollen und zum anderen sind das auch noch binäre Zahlen, deren Addition auch zu beachten ist (Dezi 1+1=2 binär 1+1=10)

Re: P1-Klausur - Prolog - Hilfe! 2003-03-05 15:03
Slater
also wenns da nicht weitere hinweise gab, oder das schon bekannt war, dann würde ich das als eine ziemlich aufwendige aufgabe bezeichen,
ich hab mal was hingebastelt und hab dafür 30 min. gebraucht (ohne kommentare),
muss wohl einen einfacheren weg geben.. [img]http://www.fb18.de/gfx/22.gif[/img]

% vergleicht länge zweier listen
kleiner(L1,L2):-length(L1,L1L),length(L2,L2L), L1L < L2L.

% dito
gleich(L1,L2):-length(L1,L1L),length(L2,L2L), L1L = L2L.


% addlist(liste1,liste2,listesumme)

% diese regel gleicht aus, wenn L2 kürzer ist als L1
% (0 vorne ranhängen)
addlist(L1,L2,LSUM):-kleiner(L2,L1),addlist(L1,[0|L2],LSUM).

% dito andersrum, L1 kleiner L2
addlist(L1,L2,LSUM):-kleiner(L1,L2),addlist([0|L1],L2,LSUM).

% die echte summenregel, erst reste addieren, dann die beiden
% listenköpfe draufaddieren
addlist([L1K|L1R],[L2K|L2R],LSUM):-gleich(L1R,L2R),
addlist(L1R,L2R,LSUMREST),addkopf(L1R,L1K,L2K,LSUMREST,LSUM).

% rekursionsabschluss
addlist([],[],[]).

%addkopf(laenge eines summanden ohne kopf, kopf list1,
kopf liste 2, bisherige summe, neue summe)

% 4 regeln wenn bisherige summe übertrag hatte
% (erkennbar daran dass bisherige summe 1 länger ist
% als laenge der summanden)
addkopf(L1R,1,1,[1|LSRR],[1|[1|LSRR]]):-gleich(L1R,LSRR).
addkopf(L1R,1,0,[1|LSRR],[1|[0|LSRR]]):-gleich(L1R,LSRR).
addkopf(L1R,0,1,[1|LSRR],[1|[0|LSRR]]):-gleich(L1R,LSRR).
addkopf(L1R,0,0,[1|LSRR], [1|LSRR] ):-gleich(L1R,LSRR).

% 4 regeln wenn bisherige summe keinen übertrag hatte
addkopf(L1R,0,0,LSR, [0|LSR] ):-gleich(L1R,LSR).
addkopf(L1R,0,1,LSR, [1|LSR] ):-gleich(L1R,LSR).
addkopf(L1R,1,0,LSR, [1|LSR] ):-gleich(L1R,LSR).
addkopf(L1R,1,1,LSR,[1|[0|LSR]]):-gleich(L1R,LSR).

ist ziemlich verklauselt, wie gesagt, nicht abschreckenlassen,
nur als idee, gibt doch hoffentlich einfachere lösungen




Re: P1-Klausur - Prolog - Hilfe! 2003-03-05 17:36
Anonymer User
Die Addition sollten wir wirklich nicht schreiben. Da stand, man sollte ein vorgegebenes Praedikat benutzen. Alle sonst noetigen Praedikate hatte man sich in den Teilaufgaben davor schon erarbeitet, wie z.B. sub 1 von zahl wenn ungerade.

SK

Re: P1-Klausur - Prolog - Hilfe! 2003-03-05 18:15
Frischling
Deswegen suche ich auch jemanden, der sich an die Aufgaben erinnert und mir dann auch noch erklären könnte, wie er oder sie die Aufgaben bewerkstelligt hat.

Ich hab die Aufgabe nämlich nicht so richtig während der Klausur verstanden.

Das einzige woran ich mich erinnern kann, ist das aus zwei Listen, die binäre Zahlen enthalten eine addierte neue Liste aus binären Zahlen entstehen soll. Dass ganze sollte auch noch mit der russischen Bauernregelgemacht werden.

Hoffe es kann mir noch jemand helfen!

LG Frischling

Re: P1-Klausur - Prolog - Hilfe! 2003-03-05 20:27
Anonymer User
Nee, das hast du falsch verstanden, in der Klausur sollte man aus binärzahlen per russischer Bauernmultiplikation das Produkt bilden.
Dabei durfte man davon ausgehen, dass es ein Prädikat add/3 zum addieren von 2 Zahlen gibt.

Das habe ich auch erst falsch verstanden, und dann während der Klausur, das add gebaut, später ist mir dann aufgefallen, das eigentlich mult gesucht war.

Martin

Re: P1-Klausur - Prolog - Hilfe! 2003-03-05 22:32
MoKrates
Ihr Kekse:
1. Werden mit Sicherheit in der folgenden Klausur nicht genau die gleichen Aufgaben drankommen, die in der letzten dranwaren, von daher sind Diskussionen darueber, ob das nun eine Bauern oder eine Akademikermultiplikation war, sinnfrei.

@Slater: Ich denke, Du machst es tatsaechlich ein wenig zu kompliziert. Wenn man einfach mal stillschweigend davon ausgeht, dass die Listenkoepfe die Bits mit der niedrigsten Signifikanz sind, sollte es recht einfach werden…

add(X, [], X).
add([], X, X).
add([1|T1], [0|T2], [1|Y]) :- add(T1, T2, Y).
add([0|T1], [1|T2], [1|Y]) :- add(T1, T2, Y).
add([1|T1], [1|T2], [0|Y]) :- add(T1, T2, Z), add(Z, {1}, Y).

***

PS: Das {1} muss eigentlich mit eckigen Klammern geschrieben werden. Das Bloede Forum verhindert das nur :)

gerade getestet. Scheint richtig zu sein.

MoKrates

Edit & PS: Uebigens werden Rechnerintern die Bits mit niedriger Signifikanz traditionell auch zuerst dargestellt. Macht also Sinn :)


Re: P1-Klausur - Prolog - Hilfe! 2003-03-05 22:40
Slater
man eh einmal umgedreht und schon gehts so flott,
zum glück kam das im letzten jahr nicht dran ;)

Re: P1-Klausur - Prolog - Hilfe! 2003-03-05 22:42
MoKrates
Du weisst doch, wie das mit dem rekursiven Denken ist:

Um das zu lernen, muss man es entweder schon verstanden haben, oder: Man muss jemanden kennen, der es schon verstanden hat, und es einem erklaeren kann. :))

MoKrates

Re: P1-Klausur - Prolog - Hilfe! 2003-03-05 23:39
Frischling
OK! Natürlich werden die in der nächsten Klausur nicht die selben Aufgaben stellen (Wäre aber auch zu schön um wahr zu sein).

Ich will die Aufgaben aber deshalb verstehen, um zu kapieren, wie ich sowas wie Listenverarbeitung (auch in Zusammenhang mit binären Zahlen) machen muss.

Es könnte ja sein, das sowas Ähnliches wieder kommt (vielleicht ja nach dem Motto: Subtrahieren Sie zwei Listen von binären Zahlen oder Wandeln Sie eine Liste von binären Zahlen in Dezimalzahlen um o. ä.).

Ich glaube aufjedenfall, dass wieder die ersten Aufgaben dran kommen, wo man mit findall und anonymer Variable, Regeln etc. hantieren muß. Listenverarbeitung wohl auch.

Naja kurz gesagt, faast das gleiche nur etwas verändert.

LG Frischling

Re: P1-Klausur - Prolog - Hilfe! 2003-03-06 00:14
tekai
Edit & PS: Uebigens werden Rechnerintern die Bits mit niedriger Signifikanz traditionell auch zuerst dargestellt. Macht also Sinn :)

Traditionell is das nicht und generell schon garnicht, den sehr oft ist es nämlich andersrum und auf einigen rechner immer andersherum. Intel zb. ist little-endian, d.h. kleinste stelle zuerst, und Mac und Sparc sind big-endian. AFAIK sind die meisten CPUs wohl eher big-endian. Wir werden uns wohl noch mit big-endian beschäftigen dürfen wenn Java und ASM für Sparc drankommen.

Re: P1-Klausur - Prolog - Hilfe! 2003-03-06 00:27
MoKrates
Die beruehmte Endianess :)

MoKrates

Re: P1-Klausur - Prolog - Hilfe! 2003-03-06 02:17
Anonymer User
Die beruehmte Endianess :)

oder auch bytesex genannt

Re: P1-Klausur - Prolog - Hilfe! 2003-03-07 03:14
MoKrates
Korrektur des Programms… (es *schien* zu funktionieren… ,) )

add(X, [], X).
add([], X, X).
add([1|T1], [0|T2], [1|Y]) :- add(T1, T2, Y).
add([0|T1], [1|T2], [1|Y]) :- add(T1, T2, Y).
add([1|T1], [1|T2], [0|Y]) :- add(T1, T2, Z), add(Z, {1}, Y).
add([0|T1], [0|T2], [0|Y]) :- add(T1, T2, Y).

Die letzte Zeile muss natuerlich noch dazu, wenn sich irgendjemand wundert, warum das nicht geht.

MoKrates

Re: P1-Klausur - Prolog - Hilfe! 2003-03-07 18:25
Anonymer User
Jau, und wenn die bits wirklich "richtig herum" vorliegen (also [1 0] für 2 und nicht [0 1]), dann macht man halt wrapper außenrum….

realadd(A1, A2, R) :- reverse(A1, B1), reverse(A2, B2), add(B1, B2, RR), reverse(RR, R).

Re: P1-Klausur - Prolog - Hilfe! 2003-03-07 18:39
MoKrates
nope, so einfach geht das nicht.
Denn die Bits mit der niedrigsten Signifikanz haben natuerlich beide denselben Wert, naemlich Bit*1.
Die mit der hoechsten aber nicht, da die Zahlen verschieden lang sein koennen.

Das heisst, bevor (oder nachdem) Du die beiden Zahlen umdrehst musst Du die kuerzere Liste mit Nullen fuellen. (vorne oder hinten, je nachdem ob Du erst drehst oder erst fuellst).

@Slater: Poste das doch mal, ich kann das grad nicht so aus dem Aermel schuetteln, ich kenn die ganzen Standardrelationen nicht :)

MoKrates

PS: Es geht natuerlich, wenn Du im Wrapper noch als Relationen einfuegst: length(A1, L), length(A2, L), …

Re: P1-Klausur - Prolog - Hilfe! 2003-03-08 11:48
Slater
ich seh dein problem nicht, umdrehen und gut is, unterschiedliche längen gleichst du doch auch aus,
gib mal ein beispiel wo es nicht funktionieren sollte,
aber wollen wir jetzt Frischling's topic mit dieser einen aufgabe zuspammen? ;)


add(X, [], X).
add([], X, X).
add([0|T1], [K|T2], [K|Y]) :- add(T1, T2, Y).
add([1|T1], [0|T2], [1|Y]) :- add(T1, T2, Y).
add([1|T1], [1|T2], [0|Y]) :- add(T1, T2, Z), add(Z, [1 ], Y).


Re: P1-Klausur - Prolog - Hilfe! 2003-03-08 14:22
MoKrates
hm, is was dran :)

MoKrates

Re: P1-Klausur - Prolog - Hilfe! 2003-03-08 14:28
Anonymer User
Deswegen suche ich auch jemanden, der sich an die Aufgaben erinnert und mir dann auch noch erklären könnte, wie er oder sie die Aufgaben bewerkstelligt hat.

Ich hab die Aufgabe nämlich nicht so richtig während der Klausur verstanden.

Das einzige woran ich mich erinnern kann, ist das aus zwei Listen, die binäre Zahlen enthalten eine addierte neue Liste aus binären Zahlen entstehen soll. Dass ganze sollte auch noch mit der russischen Bauernregelgemacht werden.

Hoffe es kann mir noch jemand helfen!

LG Frischling

Ey.. ich würd dir Nachhilfe geben.. 10¤/h sollten dabei aber schon rausspringen…. Ggf. mail an mich!



Re: P1-Klausur - Prolog - Hilfe! 2003-03-08 14:29
Zaphod
Und zwar an die Adresse unknown@unbekannt.de

Re: P1-Klausur - Prolog - Hilfe! 2003-03-08 15:00
hannosch
Und zwar an die Adresse unknown@unbekannt.de

Oder auch nobody@nowhere.no

Re: P1-Klausur - Prolog - Hilfe! 2003-03-08 16:56
Popcorn
Jetzt verlangt unser "Hey wer war die vorne rechts"-Mann schon 10€ die Stunden. [img]http://www.fb18.de/gfx/24.gif[/img]