Fachrichtung 6.2 — Informatik Universität des Saarlandes Tutorenteam der Vorlesung Programmierung 1 Programmierung 1 (Wintersemester 2015/16) kNobelaufgabe: 4 Hinweis: Dieses Übungsblatt enthält von den Tutoren für die Übungsgruppe erstellte Aufgaben. Die Aufgaben und die damit abgedeckten Themenbereiche sind für die Klausur weder relevant noch irrelevant. Schicken Sie ihre Lösung bis Dienstag, 17.11., 14:00 an [email protected] Aufgabe: natürliche Zahlen und Listen revisited Nachdem Sie Dieter glücklich aus den Fängen von Dark Dieter befreien konnten, hat sich Ihre Aufregung gelegt und etwas Alltag ist eingekehrt. Sie möchten sich endlich wieder in aller Ruhe dem Programmierung I - Stoff widmen. Doch was ist das? Offenbar hat Dieter letzte Woche mehr zerstört, als Sie dachten. Denn Ihr Interpreter kennt keine int-Werte mehr. Zum Glück haben Sie schon mal von einer Idee gehört, natürliche Zahlen mit Abstraktionen darzustellen (negative Zahlen sind uns nicht so wichtig). Nach etwas Nachdenken schreiben Sie die folgende Gleichung für die Darstellung natürlicher Zahlen auf: n := λ f a. f n a Das heißt, die Zahlen 0, 1 und 2 ließen sich folgendermaßen darstellen: 0 := λ f a. a 1 := λ f a. f a 2 := λ f a. f (f a) Aufgabe 4.1 (a) Geben Sie die Prozeduren intCod und codInt an, die für eine natürliche Zahl ihre neue Darstellung liefern, bzw. diese zurückübersetzen. (b) Geben Sie die folgenden nicht-rekursiven Prozeduren an, ohne Hilfprozeduren zu verwenden (also auch nicht intCod und codInt) (n, m ∈ N): (i) succ, die für n n + 1 liefert. (ii) add, die für n und m n + m liefert. (iii) mul, die für n und m n ∗ m liefert. Nachdem Sie und Dieter nun endlich wieder mit Zahlen rechnen können, bahnt sich schon das nächste Problem an. Auch Listen, die Sie gerade erst lieb gewonnen haben, sind dank Dieter verschwunden. Doch da fällt Ihnen ein, dass man für diese eine ähnliche Darstellung wie für natürliche Zahlen verwenden kann. Aufgabe 4.2 (a) Beschreiben Sie, wie Sie Listen mit Abstraktionen darstellen können. Geben Sie dazu erneut die Prozeduren listCod und codList an, die zwischen Listen und ihrer Darstellung konvertieren. Ihre Darstellungsart soll für jeden Listentyp funktionieren, ausgenommen verschachtelte Listen. Der Einfachheit halber nehmen wir an, dass Ihr Interpreter normale ints nun wieder beherrscht. (b) Geben Sie die folgenden nicht-rekursiven Prozeduren an, ohne Hilfsprozeduren zu verwenden (also auch nicht listCod und codList): (i) app, die für zwei Listen xs und ys xs@ys liefert. (ii) forall, die prüft, ob ein Prädikat p für alle Elemente einer Liste xs gilt. 1