Technische Universität München WiSe 2014/15 Fakultät für Informatik Lösungsblatt 2 Prof. Dr. A. Pretschner Ausgabe: 14. Oktober 2014 F. Kelbert, Dr. A. Malkis Besprechung: 21. Oktober 2014 Abgabe: 21. Oktober 2014, 13:00 Uhr Übungen zu den Grundlagen der Programm- und Systementwicklung Bitte geben Sie Ihre Lösung vor der Übung in Papierform ab. Notieren Sie auf Ihrer Lösung Ihren Namen und Ihre Matrikelnummer und lassen Sie einen ca. 4 5 cm breiten Rand. You can hand in your solutions in English, if you wish. In any case, the handing in should be written in one single language. Aufgabe 1 Modellierung (11 Punkte) (a) (2 Punkte) Erklären Sie die Begriffe Sorte, Konstante (bei Signaturen) und Signatur sowie deren Zusammenhänge. (b) (7 Punkte) Modellieren Sie das unten beschriebene Szenario. Geben Sie hierzu Sorten, Funktionsbezeichnungen und Signaturen an. (c) (2 Punkte) Erklären Sie an Hand des unten stehenden Szenarios die Begriffe Implementierungssicht (Glass Box View) und Zugriffssicht (Black Box View). Szenario: Einer der bekanntesten Online-Marktplätze der Welt ist ebay. Dort finden täglich im Minuten-Takt verschiedene Transaktionen statt. Eine Klasse dieser Transaktionen besteht aus Auktionen (auch Versteigerungen genannt), welche zur Preisermittlung eingesetzt werden. Beispielsweise werden die von ebay-verkäufern angebotenen Artikel in Auktionen ersteigert. Dabei werden von potentiellen Käufern Gebote abgegeben. Die Auktionsmechanismen bestimmen welches der abgegebenen Gebote den Zuschlag erhält und definieren die Zahlungsströme zwischen den beteiligten Parteien. Zur Identifikation bei einer Auktion benötigt jeder ebay-kunde (Käufer oder Verkäufer) einen eindeutigen Benutzernamen sowie das zugehörige Passwort. Lösung der Aufgabe 1 (a) Eine Sorte ist eine Bezeichnung für eine Menge, die entweder Grundsorte wie etwa Int oder Funktionssorte wie etwa Int, Int Int sein darf. Eine Konstante ist eine Bezeichnung für eine (null-, eins-, oder mehrstellige) Funktion, zusammen mit ihrer Sorte, wie etwa epq : Pq oder enq : Pq, Item Pq. Eine Signatur Seite 1 von 9
ist ein Tripel aus einer Menge von Sorten, einer Menge von Konstanten und einer Abbildung, die den Konstanten ihre Sorten zuordnet. In dieser Vorlesung wird die dritte Komponente zur Vereinfachung immer versteckt, so dass wir Signaturen als Paare aufschreiben und die Sortenfunktion vom Kontext bestimmen lassen. (b) Wir beschreiben hier die Black Box View auf das Portal. Sorten: EbayPortal, Nutzername, Passwort, Kunde, Ware, Auktion, Betrag,.... Funktionsbezeichnungen mit Sorten: anmelden: EbayPortal, Nutzername, Portal Kunde auktionnachwareanbieten: EbayPortal, Kunde, Ware Auktion portalnachwareanbieten: EbayPortal, Kunde, Ware EbayPortal portalnachgebotabgeben: EbayPortal, Kunde, Auktion, Betrag EbayPortal kundederauktiongewann: EbayPortal, Auktion Kunde alsbezahltmarkieren: EbayPortal, Kunde, Auktion EbayPortal... Signatur: EBAY = ({EbayPortal, Nutzername, Passwort, Kunde, Ware, Auktion, Betrag,... }, {anmelden, auktionnachwareanbieten, portalnachwareanbieten, portalnachgebotabgeben, kundederauktiongewann, alsbezahltmarkieren,... }). (c) EBAY beschreibt einen Teil der Zugriffssicht. Zusätzlich würde man durch Formeln beschreiben, was die o.g. Funktionen tun. Der innere Aufbau des Portals ist in dieser Sicht nicht sichtbar. Für eine Implementierungssicht haben wir mehrere Abstraktionsstufen zur Auswahl. Man kann z.b. eine Algebra für EBAY nehmen oder eine weitere Signatur, in der die Menge EbayPortal in Bestandteile zerlegt ist und die Funktionsnamen enthält, die auf diesen Teilen operieren. Aufgabe 2 Signaturen und Rechenstrukturen (4 Punkte) Diese Aufgabe klärt nochmals den Zusammenhang bzw. den Unterschied zwischen einer Signatur Σ und einer darauf spezifizierten Σ Algebra. (a) Geben Sie dazu zuerst die allgemeine Definition einer Σ Algebra an. (b) Welche zusätzlichen Informationen liefert eine Σ Algebra im Vergleich zu einer Signatur? Seite 2 von 9
(c) Welche Art von Information bzw. welche Sicht wird somit durch eine Signatur dargestellt, welche durch eine Σ Algebra? (d) Geben Sie eine geeignete Signatur für die natürlichen Zahlen an. Welche Axiome wären über dieser Signatur sinnvoll? Lösung der Aufgabe 2 (a) Gegeben eine Signatur Σ = (S, F ), eine Σ-Algebra ist ein Paar A = ((M A ) M S, (f A ) f F ) von Familien, so dass M A eine Menge ist (M S) und für f F gilt: für nullstellige f ist f A (sort(f)) A, für n-stellige f ist f A (M A 1... M A n M A n+1), falls sort(f) = (M 1,..., M n M n+1 ) ist (n 1). Meistens wird unter einer Algebra stillschweigend eine totale Algebra verstanden, d.h. eine Algebra, deren alle Funktionen total sind. (b) Eine Σ-Algebra enthält die tatsächlichen Mengen und n-stelligen Funktionen auf diesen Mengen (n 0), wobei eine Signatur lediglich die Bezeichnungen von diesen Mengen und Funktionen bestimmt. (c) Vergleicht man eine Signatur und eine Algebra dieser Signatur, so beschreibt die Signatur die Zugriffssicht, und die Algebra die Implementierungssicht. Jedoch gibt es bei großen Systemen mehrere Abstraktionsstufen, so dass eine Signatur, für sich alleine genommen, so viele Details durch Namensgebung und Funktionssorten wiederspiegeln kann, dass sie somit eine Implementierung beschreibt. Analog kann eine Algebra, für sich alleine genommen, zu abstrakte Mengen verwenden und somit die Zugriffssicht beschreiben. (d) Als Signatur wählen wir ({Nat}, {0 : Nat, succ : Nat Nat}). Sinnvoll sind etwa die übrigen Peano-Axiome: n Nat: succ(n) 0 m, n Nat: succ(n) = succ(m) m = n Für jede Formel ϕ und jede freie Variable x : Nat von ϕ: (freie Variablen von ϕ außer x) ((ϕ(0) ( n Nat: ϕ(n) ϕ(succ(n)))) n Nat: ϕ(n)). Seite 3 von 9
Aufgabe 3 Anforderungsspezifikation mit formalen Mitteln (6 Punkte) Eine Anforderungsspezifikation beschreibt, was ein zu entwickelndes System leisten muss. Im Softwareentwicklungsprozess wird die Anforderungsspezifikation in der Regel nach der informellen Problembeschreibung und vor der Implementierung erstellt. Problembeschreibung Gegeben ist ein Plan mit direkten Flugverbindungen zwischen verschiedenen Städten Europas. Für jede Verbindung ist der entsprechende Flugpreis angegeben. Wer von der Stadt S zur Stadt T fliegen möchte, wüsste gern: (a) Gibt es einen Flugweg (gegebenenfalls mit Umsteigen) von S nach T? (b) Wenn es mehrere Flugwege gibt, welcher ist der billigste? Aufgabe Geben Sie eine Anforderungsspezifikation dieses Problems an. Modellieren Sie dazu das Problem möglichst formal. Geben Sie dazu Folgendes an: eine Signatur, Formeln über dieser Signatur, die die obige Forderungen beschreiben. Lösung der Aufgabe 3 Signatur Σ = ({Bool, Nat, Stadt, Flugplan, Verbindung, Verbindungsmenge}, {direkteverbindungmoeglich: Flugplan,Stadt,Stadt Bool, direktverbindskosten : Flugplan, Stadt, Stadt Nat, fluege : Flugplan,Stadt,Stadt Verbindungsmenge, billigsteverbindung : Flugplan,Stadt,Stadt Verbindung, verbindungmöglich : Flugplan, Stadt, Stadt Bool, elemssv : Stadt,Stadt,Verbindung Bool, elemvvm : Verbindung, Verbindungsmenge Bool, verbindungskosten : Flugplan, Verbindung Nat, true : Bool, false : Bool, : Bool, Bool Bool, Null : Nat, succ : Nat Nat, : Nat, Nat Bool}). Die Forderungen sind die Konjunktion der folgenden Teilforderungen: Eine übliche Charakterisierung der booleschen Werte Bool, der natürlichen Zahlen Nat und der entsprechenden Konstantenbezeichnungen (false, true,, Null, succ, ). direkteverbindungmöglich(f, s, t) = true verbindungmöglich(f, s, t) = true (elemvvm(billigsteverbindung(f, s, t), fluege(f, s, t))). elemssv, elemvvm, wie üblich spezifiziert (normalerweise unter Einführung von Hilfsprädikaten). Seite 4 von 9
v Verbindung : elemssv(s,t,v) direktverbindungskosten(f, s, t) = verbindungskosten(f, v). ( x, y Verbindungen: x y elemvvm(x, fluege(f, s, t)) elemvvm(y, fluege(f, s, t))) x Verbindungen: elemvvm(x, fluege(f, s, t)) verbindungskosten(f, billigsteverbindung(f, s, t)) verbindungskosten(f, x). Aufgabe 4 Prioritätskeller (39 Punkte) Lege eine beliebige Menge fest. Ein Prioritätskeller über dieser Menge ist, informell gesprochen, ein Behälter für Elemente der Menge, der die folgenden Eigenschaften erfüllt. Man kann die Einträge des Prioritätskellers untereinander vergleichen. Es gibt genau einen leeren Prioritätskeller. Man kann jedem Keller ein Element hinzufügen. Man kann einen größten Eintrag eines nichtleeren Kellers ausgeben, und man kann aus einem nichtleeren Keller einen größten Eintrag löschen. Größere Einträge haben also eine größere Priorität beim Ausgeben bzw. Löschen. Sind mehrere größte Elemente vorhanden, werden die jeweils zuletzt eingefügten Elemente nach dem Kellerprinzip zuerst ausgegeben bzw. gelöscht. Im Folgenden entwerfen wir Rechenstrukturen für Prioritätskeller und üben an diesem Beispiel einige Grundbegriffe ein. (a) (8 Punkte) Geben Sie eine passende Signatur Σ für Prioritätskeller an. (b) (1 Punkt) Geben Sie zwei Terme der Signatur mit ihren Sorten an, und zwar einen Grundterm und einen Term, der kein Grundterm ist. (c) (1 Punkt) Überlegen Sie sich, wie man die Einträge mit Prioritäten genau darstellt, und führen Sie Bezeichnungen für die Einträge mit Prioritäten ein. (d) (16 Punkte) Geben Sie zwei Rechenstrukturen an, in denen jeder Keller eine Sequenz über der Menge der Einträge ist, so dass in der ersten Rechenstruktur die Sequenzen immer geordnet sind, und in der zweiten Struktur die Sequenzen beliebig sein dürfen. (e) Für jede Ihrer Rechenstrukturen: i) (5 Punkte) Geben Sie an, ob die Rechenstruktur termerzeugt, homogen, heterogen, total, partiell ist. ii) (6 Punkte) Beschreiben Sie die Nutzungssicht und die Realisierungssicht auf Ihre Rechenstrukturen. iii) (2 Punkte) Definieren Sie für die Zugriffs- und Implementierungssicht getrennt, wann zwei Prioritätskeller äquivalent sind. Seite 5 von 9
Lösung der Aufgabe 4 (a) Eine Signatur für Prioritätsschlangen ist in Beispiel 2.4 im Skript gegeben. Interessanterweise kann man dieselbe Signatur für Prioritätskeller wie für Prioritätsschlangen benutzen. Um aber die Kellerstruktur zu betonen, haben wir im Folgenden die Namen aus dem Beispiel etwas angepasst: Σ = (S, F ) S = { Bool, Ps, Item } F = { R : Item,Item Bool, eps : Ps, push : Ps, Item Ps, top : Ps Item, pop : Ps Ps } Die Sorte Ps ist dabei die Sorte der Prioritätskeller, Item die Sorte der Einträge, R das Funktionssymbol des Vergleichsoperators, eps das Funktionssymbol des leeren Kellers, push das Funktionssymbol des Hinzufügen-Operators, top das Funktionssymbol für die Ausgabe, und pop das Funktionssymbol des Entfernen- Operators. (b) Ein Grundterm wäre etwa pop(eps). Ein Term, der kein Grundterm ist, wäre etwa push(eps, x), wobei x : Item ein Identifikator (logische Variable) ist. (c) Sei D die Menge der Einträge und sei eine totale Quasiordnung 1 auf D, die wir in Infixnotation schreiben. (d) Es gibt natürlich viele verschiedene Arten einen Prioritätskeller zu realisieren. Eine mögliche Unterscheidung dabei ist, ob die Trägermenge der Sorte Ps aus geordneten oder ungeordneten Sequenzen besteht. Im Folgenden werden wir jeweils ein mögliches Modell für beide Arten angeben (für beide Arten gibt es jedoch mehrere mögliche Modelle). Im Folgenden arbeiten wir mit Sequenzen. Dabei wird mit ε die leere Sequenz bezeichnet und mit s 1 s 2 die Konkatenation der Sequenzen s 1 und s 2. Legen wir außerdem ein Element / (D D ) fest. i) Eine Algebra P für Prioritätsschlangen in dem die Trägermenge geordnet ist, ist in Beispiel 2.6 im Skript angegeben. Eine Algebra für Prioritätskeller ähnelt dieser mit ein paar Unterschieden. Wir definieren zuerst 1 Eine Quasiordnung auf einer Menge X ist eine binäre Relation auf X, die reflexiv auf X und transitiv ist. Ein größtes Element einer Quasiordnung R auf X ist ein x X mit y X : R(y, x). Seite 6 von 9
Trägermengen für die Sorten in S wie folgt: Bool P = B Ps P = {s D x,y D m,n D : s = x m n y n m} { } Item P = D { } Nun können wir den Funktionsbezeichnern aus F Funktionen zuordnen: (m n), wenn m, n D, R P (m, n) = L, wenn m =, O, wenn m n =. eps P = ε falls s = m = push P (s, m) = s m, falls m D (s=ε s,n:(s = s n n m)), push P (s,m) n, falls m D s, n: (s = s n n m). { top P, falls s = ε s =, (s) = n, falls s : s = n s. { pop P, falls s = ε s = (s) = s, falls n: s = n s ii) Eine Algebra Q für Prioritätsschlangen, in der die Trägermenge nicht geordnet ist, ist in Beispiel 2.11 angegeben. Eine Algebra für Prioritätskeller ähnelt dieser mit ein paar Unterschieden. Wir definieren zuerst Trägermengen für die Sorten in S wie folgt: Bool Q = B Ps Q = D { } Item Q = D { } Nun können wir den Funktionssymbolen aus F Funktionen zuordnen: (m n), wenn m, n D, R Q (m, n) = L, wenn m =, O, sonst. eps Q = ε Seite 7 von 9
{ push Q s m, falls s m, (s, m) =, falls s = m =. m, falls s :(s = m s (s =ε m top Q (s ))), top Q (s) = top Q (s ), falls m: (s = m s m top Q (s )),, falls s = ε s =. s, falls m:(s = m s (s =ε m top Q (s ))), pop Q (s) = m pop Q (s ), falls s : (s = m s m top Q (s )),, falls s = ε s =. (e) i) Sowohl P als auch Q sind termerzeugt nicht homogen heterogen total nicht partiell ii) Die Nutzungssicht ist für P und Q gleich, da wir Laufzeitfragen nicht betrachten. Sie ist erstens durch die Signatur und zweitens durch eine Eigenschaft gegeben, die wir gleich einführen werden. Dazu sei Gleichheit ein polymorphes Prädikatensymbol = : α, α Bool mit Standardinterpretation. Ferner sei! x X : ϕ die Aussage es gibt genau ein Element in X, das ϕ erfüllt, also eine Abkürzung für x X : (ϕ y X : (ϕ[y/x] y=x)), wobei y keine freie Variable von ϕ ist. Hier ist eine Eigenschaft, die rechenstrukturunabhängig ist, gültig in beiden Modellen P, Q ist und die Zugriffssicht recht vollständig beschreibt: (! s Ps : pop(s) = s) (! d Item : pop(push(eps, d)) = push(eps, d)) d Item, s Ps : (pop(s) s pop(push(eps, d)) push(eps, d)) (R(top(s), d) top(push(s, d)) = d) ( R(top(s), d) top(push(s, d)) = top(s)) (R(top(s), d) pop(push(s, d)) = s) ( R(top(s), d) pop(push(s, d)) = push(pop(s), d)). (pop(s) ( = s (push(s,d) = s pop(push(eps,top(s))) ( = push(eps,top(s)))) )) t Ps : pop(push(s,d))=push(t,d) pop(push(eps,d)) = push(eps,d) top(push(s, d)) = d Seite 8 von 9
Die Realisierungssicht besteht gerade in der Definition der Trägermengen und der Funktionen darauf. iii) Um Äquivalenz zu definieren, betrachte erneut die Gleichheit als polymorphes Prädikatensymbol = : α, α Bool mit üblicher Interpretation für jede Sorte α. Zugriffssicht. Prioritätskeller s, t Ps sind genau dann äquivalent, wenn in der betrachteten Rechenstruktur die Aussage i N: top ( pop i (s) ) = top ( pop i (t) ) gilt, wobei pop i = pop... pop die i-fache Nacheinanderausführung }{{} i mal von pop ist (i N). Die Äquivalenz zweier Prioritätskeller kann also durch eine rechenstrukturunabhängige Formel (zweiter Stufe; man kann sie auch als abzählbar viele Formeln erster Stufe sehen) definiert werden. Implementierungssicht. (i) Prioritätskeller s, t Ps P sind genau dann in der Algebra mit geordneten Sequenzen äquivalent, wenn s und t als Sequenzen genau gleich sind, d.h. wenn s = t. (ii) Prioritätskeller s, t Ps Q sind genau dann in der Algebra mit beliebigen Sequenzen äquivalent, wenn alle Daten gleicher Priorität in s in derselben Reihenfolge wie in t stehen. Formal, sei p: D D D mit p(d, ε) = ε und p(d, f s) = { f p(d, s), wenn d f f d, p(d, s), sonst. Dann sind s, t Ps Q genau dann im Modell mit beliebigen Sequenzen äquivalent, wenn d D : p(d, s) = p(d, t). Seite 9 von 9