Programmierparadigmen Fachgebiet Telematik/Rechnernetze Prof. Dr.-Ing. Günter Schäfer SS 2017 Übungsblatt 6 Aufgabe 1 Auswertungsstrategien in Erlang In der Vorlesung haben Sie bereits verschiedene Auswertungsstrategien und Möglichkeiten zur Parameterbehandlung in Programmiersprachen kennengelernt. a) Implementieren Sie bitte zunächst in der Programmiersprache Erlang eine unendliche Liste, welche die Reihe der natürlichen Zahlen nachbildet. b) Versuchen Sie nun bitte, alle geraden Zahlen auszugeben, welche in dieser Liste enthalten sind. Hinweis: Denken Sie zunächst über die Auswertungsstrategien von Erlang nach. Was ist bei der Implementierung unendlicher Listen zu beachten? Aufgabe 2 Sieb des Eratosthenes Ein einfacher Algorithmus zur Bestimmung aller Primzahlen aus der Reihe der natürlichen Zahlen wird als Sieb des Eratosthenes bezeichnet. Der Begriff Sieb weist bereits auf das zugrundeliegende Prinzip hin: Die gesuchten Primzahlen werden nicht gezielt konstruiert, sondern alle Nichtprimzahlen werden stattdessen aussortiert. Dazu sei folgender Algorithmus im Pseudocode gegeben: Algorithm 1 Eratosthenes Schreibe alle Zahlen√von 2 bis n in eine Liste für alle i := 2 . . . b nc in der Liste tue für alle j := i . . . bn/i c tue Streiche die Zahl i × k aus der Liste Implementieren Sie einen Algorithmus zur Bestimmung der ersten k Primzahlen aus der (unendlichen) Reihe der natürlichen Zahlen in der Programmiersprache Erlang. Aufgabe 3 * Integration: Java und Erlang In der Vorlesung haben Sie ein einfaches Client-Server-Beispiel für eine bidirektionale Kommunikation zwischen Erlang und Java kennengelernt. Aufbauend auf diesem Beispiel soll mit der Programmiersprache Java eine einfache GUI-Applikation für ein Übertragungsprotokoll entwickelt werden. Dabei wird auf die – bereits in Übung 3 gelöste – Übungsaufgabe zum Alternating-Bit-Protokoll zurückgegriffen. Die Java-Applikation soll lediglich graphisch den Status einer Übertragung prozentual wiedergeben. Als Basis für die Java-Implementierung können Sie Ihre Lösung aus der Übung 3 und das ProgressBar-Beispiel von Oracle verwenden, welches Sie unter http: uebung6˙pparadigmen.tex @ 15. Mai 2017 : 9:17 Abbildung 1: Beispiel: Progress Bar //bit.ly/2pMMotu (oder https://docs.oracle.com/javase/tutorial/uiswing/ components/progress.html) erhalten. Es müssen beide Teile verknüpft werden, in dem Sie: a) die Erlang-Übungsaufgabe zum Alternating-Bit-Protokoll um eine Funktion ergänzen, welche den aktuellen Übertragungszustand vorhält und diesen geeignet an das Java-Programm übergibt. b) Sie den Code des Java-Threads erweitern, welcher so den Übetragungszustand entgegennimmt und mit einer Nachricht an die Erlang-Umgebung quittiert. Aufgabe 4 Wiederholung: Rekursion und natürliche Zahlen Bereits in Übungsblatt 3 wurde der Euklidische Algorithmus zur Berechnung des größten gemeinsamen Teilers zweier Ganzzahlen verwendet. In dieser Aufgabe soll eine klassische rekursive Variante dieses Algorithmus zur Berechnung des ggT zweier natürlicher Zahlen im λ-Kalkül formuliert werden: wenn a = b a ggT (a, b) = ggT (b − a, a) wenn a < b ggT (a − b, b) sonst. a) Definieren Sie bitte zunächst die nötigen Vergleichsoperatoren im LambdaKalkül. Zeigen Sie die Funktion der definierten Operatoren an einem kleinen Beispiel. Hinweis: Um die angegebene Rekursion sinngemäß umzusetzen, benötigen Sie mindestens einen Vergleichsoperator less. Beachten Sie, dass im Rahmen der Arithmetik über Church-Numeralen pred (c0 ) = c0 gilt. Dementsprechend ist das Ergebnis von Subtraktionen immer im Bereich der natürlichen Zahlen (allerdings mathematisch möglicherweise nicht korrekt). 2 b) Formulieren Sie nun einen Ausdruck zur Berechnung des ggT zweier natürlicher Zahlen im λ-Kalkül. c) Berechnen Sie anschließend unter Verwendung des angebenen Ausdrucks den ggT von 6 und 9. Aufgabe 5 Wiederholung: Rekursion und natürliche Zahlen Formulieren Sie bitte einen Ausdruck zur Berechnung der Summe der ersten n natürlichen Zahlen im λ-Kalkül. Verwenden Sie den entsprechenden Ausdruck anschließend, um die Summe der ersten 3 natürlichen Zahlen rekursiv zu berechnen. 3