Klausurvorbereitung


Jetzt mal ganz ohne Threads oder parallel in einem simplen sequentiellen Programm:

System.out.println ("Berta trinkt " + gib() + “!”);
System.out.println("Berta vergisst " + gib() + “!”);

Das würde ja bedeuten, dass das zweite gib() ausgewertet werden könnte, noch bevor es zur Ausgabe der ersten Zeile kommt. Das kann ich mir nicht wirklich vorstellen. Was sagen die JAVA Profis dazu? Also ich fände es unlogisch, aber wer weiß welchen Einfluss die Scheduler da drauf haben…

Wo wurde das mit 6 denn behauptet?


jo das was madcoma sagt wars, das hab ich auch schonmal gehört, bin nur nichtmehr draufgekommen.

Die Lösung ist natürlich aus der Vorlesung, sonst würde ich ja nicht behaupten, dass die aufjedenfall richtig ist…


Hat zufällig jemand von euch ne Lösung zum Aufgabentyp “Extrahieren Sie alle einzelnen Abstraktionen und Applikationen aus folgendem Lambda-Ausdruck” - ich weiß da nicht wirklich ob ich die richtig verstehe.


Ich bin mir selber auch nicht sicher. Aber hier mal was ich dazu gemacht habe (@ steht für lambda):

Abstraktion | Applikation
(@Ida.(@Egon.Ida Hallo Egon)) | (@Auto.Haus) Boot
(@Auto.Haus) | Boot
(@Egon.Ida) | Hallo
(@Ida.(@Egon.Ida Hallo)) | Egon

Dachte mirs so, das man links immer hinschreibt, was die Fuktion ist und recht, was auf die Funktion angewandt wird.
Sollte es jemand besser wissen, bitte Verbesserung posten. Danke!


Ok, so hätte ichs auch gemacht. Aber war mir eben nicht sicher.


Also bei der klausur die wir in der übung hatten wurde das etwas anders gemacht. 100% sicher bin ich mir jedoch auch nicht.

Applikationen
(@Ida.(@Egon.Ida Hallo Egon)) (@Auto.Haus) Boot
(@Ida.(@Egon.Ida Hallo Egon)) (@Auto.Haus)

Abstraktionen

(@Ida.(@Egon.Ida Hallo Egon))
(@Egon.Ida Hallo Egon)
(@Auto.Haus)

Eine Abstraktion besteht ja laut definition aus .
Und eine Applikation halt aus einer Funktion und etwas das eingesetzt wird.


meiner meinung nach darfst du das nicht so machen, da die applikation soweit ich weiß linksassoziativ ist, du also Boot nicht auf (\Auto.Haus) anwenden darfst


Hast recht, dass war quatsch meinerseits. Erst wird natürlich (@Autos.Haus) auf den linken Ausdruck angewendet und dann erst das Boot.

@Mago
Abstraktionen hab ich verstanden. Aber bei den Applikationen wollt ich nochmal nachfragen.
Gibt man die einmal mit und einmal ohne Boot an, weil man davor nicht weiss, ob Boot überhaupt noch angewandt wird? Oder was ist da der Hintergrund?
Müsste man das auch so machen, wenn nur ein Parameter übergeben werden kann?
Zum Beispiel bei sowas?
(@Fkt. a Fkt c) arg1 arg2


bin nicht zu 100% sicher, aber ich würde es so angeben

  1. (\Fkt. a Fkt c) arg1 arg2
  2. (\Fkt. a Fkt c) arg1

weil man es meiner Meinung nach ja auch

( (\Fkt. a Fkt c) arg1 ) arg2 klammern könnte (so gesehen lässt man dann bei 1. nur die klammern weg)


Hab noch eine Frage zur Haskell-Aufgabe der Klausur 17.02.2009. Versteh in der Aufgabe 5b) nicht ganz wie das gemeint ist und wie man sowas angeht.
Laut Aufgabe werden ja zwei Funktionen als Parameter übergeben. Und als Ergbniss soll die 2.Funktion auf den “Parameter” angewendet werden, falls die 1.Funktion auf den “Parameter” True liefert.
Werden jetzt also insgesamt 3 Parameter (Fkt1 Fkt2 Parameter) oder nur 2 Parameter (Fkt1 Fkt2) übergeben?

Und wie arbeitet man mit übergebenen Funktionen? Ich häts in etwa so gemacht, wenns doch 3 Parameter wärn:

verbinde \x \y par =
| [a | a ← \y par, \x par == True]
| par

Anscheinend wurde die Klausur ja in der letzten VL besprochen, wär nett wenn einer die Lösung dazu posten könnte. :smiley:


ich glaub dass müsste die lösung aus der vorlesung sein:

verbinde cond f = (\x → if (cond x) then f x else x)

aber schau dir nochmal genau das mit den funktionen als parametern an, ist im skript
ganz gut erklärt


Mal ne Frage zum Lamda-Kalkül: Darf man auch andere Klammern verwenden als “(” und “)”?
Weil diese Ausdrücke doch sehr viel übersichtlicher werden, wenn man noch mit “{}” und “[]” arbeitet :wink:


Ich glaub nicht, weil z.B. die -Klammern fuer das Schreiben von (Ersatz-)Funktionen verwendet werden. Aber man kann doch einfach GROESSERE oder dickere Klammern machen. Das sollte auch die Uebersicht verbessern ;).

P.S. Ist eigentlich schon jemandem aufgefallen, dass die Folien der zweiten Haelfte der Vorlesung grosse Teile (wenn nicht gaenzlich) von anderen Quellen, ohne Quellenverweise, kopiert sind? So z.B. der Lambda-Kalkuel Teil von Das gefuerchtete Lambda-Kalkuel … Irgendwie find ich des nicht in Ordnung … aber jetzt keine Zeit mich aufzuregen.


Naja, die Methoden des Dozenten sind ja dank Prätech hinlänglich bekannt ;D
Edit.: Ok hab mir grad die Seite angekuckt, das is ja echt ne noch größere Sauerei als das Wikipedia-Copy-Paste-fest in Prätech…


jup, ist mir gleich am anfang aufgefallen, ist ja auch der erste link der bei google auftaucht. aber wie gesagt ich bins nicht anders gewohnt von pt, und nur so, die folien zu haskell sind auch 1:1 von ner anderen quelle (der text wurde immerhin +übhhersetzt) übernommen


Ehrlich gesagt: mir ists lieber gut kopiert als schlecht selbstgebastelt. Unter den Gesichtspunkten der Verständlichkeit/Übersicht und Struktur kann man über die Folien ja nicht meckern. Ein Quellverweis hätte natürlich nicht gestört, um die Arbeit der Vorlage zu würdigen, aber naja: ist doch für die Lehre und für mich kommts da weniger darauf an wer das Rad erfunden hat solange ich es benutzen kann. :wink:


Weiss jemand wie man die for-schleife in der 2009er klausur initialisieren soll? In der Vorlesung war die Rede von (feld+threads)/threads.
Aber wenn ich beispielsweise for( int x = id*(feld+thr)thr ; x < (id+1)*(feld+thr)/thr; x++) mache, dann deckt die schleife ja mehr felder ab als das array überhaupt hat → nullpointer .

bsp.: feldlänge 9, also 0-8
threads 4 → (9+4)/4 = 3

t0 von 0 bis <3 => 0-2
t1 von 3 bis 5
t2 von 6 bis 8
t3 von 9 bis 11

also würd in dem fall ja der letzte thread gar nix arbeiten weil seine daten ja gar nicht existieren.

Hab halt sonst immer nen expliziten last-thread gestartet der alles bis zum ende abarbeitet, dementsprechend komm ich da jetzt einfach ums verrecken nicht drauf.
Hab ich was in der Vorlesung missverstanden oder steh ich einfach nur aufm schlauch?


Also ich hätte es so versucht:
im ersten ±Feld definiere ich mir

int width = maxX / tCount;

und im ±Feld mache ich dann:

for(int x = id*width; x < ((id == tCount - 1)?maxX:(id+1)*width); x++) {....

D.h. ich würde im zweiten Feld für Thread Null von 0 bis width gehen, …, für den letzten von (tCount-1)*width bis maxX. Damit wäre also das ganze Feld abgedeckt und ich würde in den Arraygrenzen bleiben.

Korrigiert mich wenn ich nen Denkfehler drin hab…


ja stimmt, ne fallunterscheidung klingt logisch. ich frag mich dann trotzdem nur noch was dann in der vorlesung mit diesem feld+threads /threads gemeint war , es hiess irgendwas von wegen dass man so ein +1 mit reinkriegt, aber warum und zu welchem zweck erschliesst sich mir nicht ganz.


Aber ist das alles wegen dem catch-Block ganz unten nicht unnötig?
Selbst wenn ich über das Array rausgehe, meine Exception wird ja in jedem Fall abgefangen und das Programm kann weiterlaufen.
Ist zwar kein guter Stil, das so zu machen, aber in der Klausur juckt das ja keinen.