• Keine Ergebnisse gefunden

Praktische Informatik 3: Einführung in die Funktionale Programmierung

N/A
N/A
Protected

Academic year: 2022

Aktie "Praktische Informatik 3: Einführung in die Funktionale Programmierung"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Praktische Informatik 3: Einführung in die Funktionale Programmierung

Vorlesung vom 05.01.2011: Signaturen und Eigenschaften

Christoph Lüth & Dennis Walter Universität Bremen Wintersemester 2010/11

Rev. 1312 1 [26]

Fahrplan

I Teil I: Funktionale Programmierung im Kleinen I Teil II: Funktionale Programmierung im Großen

IAbstrakte Datentypen

ISignaturen und Eigenschaften

IAktionen und Zustände

I Teil III: Funktionale Programmierung im richtigen Leben

2 [26]

Abstrakte Datentypen

ILetzte Vorlesung:Abstrakte Datentypen

ITypplusOperationen

IIn Haskell:Module

IHeute:SignaturenundEigenschaften

3 [26]

Signaturen

Definition (Signatur)

DieSignatureines abstrakten Datentyps besteht aus den Typen, und der Signatur der darüber definierten Funktionen.

I Keine direkte Repräsentation in Haskell

I Signatur:Typeines Moduls

4 [26]

Zur Erinnerung: Endliche Abbildungen

IEndliche Abbildung(FiniteMap)

ITypen: die AbbildungS, Adressena, Werteb IOperationen (Auszug)

IleereAbbildung:S

IAbbildung an einer Stelleschreiben:SabS

IAbbildung an einer Stellelesen:Sa*b(partiell)

5 [26]

Endliche Abbildung: Signatur

I AdressenundWertesindParameter type Map α β

I Leere Abbildung:

empty :: Map α β

I An eine Stelle einen Wertschreiben:

i n s e r t :: Map α βαβ→ Map α β I An einer Stelle einen Wertlesen:

l o o k u p :: Map α βα → Maybe β

6 [26]

Signatur und Eigenschaften

ISignatur genug, um ADTtypkorrektzu benutzen

IInsbesondereAnwendbarkeitundReihenfolge

ISignatur nicht genug, umBedeutung(Semantik) zu beschreiben:

IWaswirdgelesen?

IWieverhältsich die Abbildung?

7 [26]

Beschreibung von Eigenschaften

Definition (Axiome)

AxiomesindPrädikateüber denOperationender Signatur I ElementarePrädikateP:

IGleichheits==t

IOrdnungs<t

ISelbstdefinierte Prädikate I ZusammengesetztePrädikate

INegationnot p

IKonjunktionp && q

IDisjunktionp| | q

IImplikationp=⇒q

8 [26]

(2)

Beobachtbare und Abstrakte Typen

IBeobachtbareTypen: interne Struktur bekannt

IVordefinierte Typen (Zahlen,Zeichen), algebraische Datentypen (Listen)

IViele Eigenschaften und Prädikate bekannt IAbstrakteTypen: interne Struktur unbekannt

IWenig Eigenschaft bekannt, Gleichheit nur wenn definiert IBeispielMap:

Ibeobachtbar: Adressen und Werte

Iabstrakt: Speicher

9 [26]

Axiome für Map

I Lesenaus leerer Abbildung undefiniert:

l o o k u p empty a == N o t h i n g

I Lesenan vorher geschriebener Stelle liefert geschriebenen Wert:

l o o k u p ( i n s e r t m a b ) a == J u s t b I Lesenan anderer Stelle liefert alten Wert:

a1 /= a2 =⇒ l o o k u p ( i n s e r t m a1 b ) a2 ==

l o o k u p m a2

I Schreibenan dieselbe Stelle überschreibt alten Wert:

i n s e r t (m a b1 ) a b2 == i n s e r t m a b2 I Schreibenüber verschiedene Stellen kommutiert:

a1 /= a2 =⇒ i n s e r t ( i n s e r t m a1 b1 ) a2 b2 ==

i n s e r t ( i n s e r t m a2 b2 ) a1 b1

10 [26]

Axiome als Interface

IAxiome müssengelten

IfüralleWerte der freien Variablen zuTrueauswerten IAxiomespezifizieren:

Inach außen dasVerhalten

Inach innen dieImplementation ISignatur+Axiome=Spezifikation

Nutzer Spezifikation Implementation

IImplementation kanngetestetwerden IAxiome können (sollten?)bewiesenwerden

11 [26]

Signatur und Semantik

Stacks Typ:Stα Initialwert:

empty :: S t α Wert ein/auslesen:

p u s h :: α→ S t α→ S t α t o p :: S t α→ α pop :: S t α→ S t α Test auf Leer:

i s E m p t y :: S t α→ B o o l Last in first out (LIFO).

Queues Typ:Quα Initialwert:

empty :: Qu α Wert ein/auslesen:

enq :: α→ Quα→ Quα

f i r s t :: Qu α→ α

deq :: Qu α→ Qu α

Test auf Leer:

i s E m p t y :: Quα→ B o o l First in first out (FIFO) GleicheSignatur, unterscheidlicheSemantik.

12 [26]

Eigenschaften von Stack

Last in first out (LIFO):

t o p ( p u s h a s ) == a pop ( p u s h a s ) == s i s E m p t y empty

n o t ( i s E m p t y ( p u s h a s ) ) p u s h a s /= empty

13 [26]

Eigenschaften von Queue

First in first out (FIFO):

f i r s t ( enq a empty ) == a

n o t ( i s E m p t y q ) =⇒ f i r s t ( enq a q ) == f i r s t q deq ( enq a empty ) == empty

n o t ( i s E m p t y q ) =⇒ deq ( enq a q ) = enq a ( deq q ) i s E m p t y ( empty )

n o t ( i s E m p t y ( enq a q ) ) enq a q /= empty

14 [26]

Implementation von Stack: Liste

Sehr einfach: ein Stack ist eine Liste

data S t a c k a= S t a c k [ a ] d e r i v i n g ( Show , Eq ) empty = S t a c k [ ]

p u s h a ( S t a c k s ) = S t a c k ( a : s )

t o p ( S t a c k [ ] ) = e r r o r " S t a c k : t o p on empty s t a c k "

pop :: S t a c k a→ S t a c k a

15 [26]

Implementation von Queue

I Mit einerListe?

IProblem: am Ende anfügen oder abnehmen ist teuer.

I DeshalbzweiListen:

IErste Liste: zuentnehmendeElemente

IZweite Liste:hinzugefügteElementerückwärts

IInvariante: erste Liste leer gdw. Queue leer

16 [26]

(3)

Repräsentation von Queue

Operation Resultat Queue Repräsentation

empty ([], [])

enq 9 9 ([9], [])

enq 4 4→9 ([9], [4])

enq 7 7→4→9 ([9], [7, 4])

deq 9 7→4 ([4, 7], [])

enq 5 5→7→4 ([4, 7], [5])

enq 3 3→5→7→4 ([4, 7], [3, 5])

deq 4 3→5→7 ([7], [3, 5])

deq 7 3→5 ([5, 3], [])

deq 5 3 ([3], [])

deq 3 ([], [])

deq error ([], [])

17 [26]

Implementation

I Datentyp:

data Qu α=Qu [α] [α]

I Leere Schlange: alles leer empty =Qu [ ] [ ]

I Invariante: erste Liste leer gdw. Queue leer i s E m p t y (Qu x s _) = n u l l x s I Erstes Element steht vorne in erster Liste

f i r s t (Qu [ ] _) = e r r o r " Queue : f i r s t o f empty Q"

f i r s t (Qu ( x : x s ) _) = x

18 [26]

Implementation

IBeienqunddeqInvariante prüfen

enq x (Qu x s y s ) = c h e c k x s ( x : y s )

deq (Qu [ ] _ ) = e r r o r " Queue : deq o f empty Q"

deq (Qu (_ : x s ) y s ) = c h e c k x s y s

IPrüfung der Invariantenachdem Einfügen und Entnehmen IcheckgarantiertInvariante

c h e c k :: [α]→ [α]→ Qu α c h e c k [ ] y s =Qu ( r e v e r s e y s ) [ ] c h e c k x s y s =Qu x s y s

19 [26]

Axiome als Eigenschaften

I Axiome könnengetestetoderbewiesenwerden I Tests findenFehler, Beweis zeigtKorrektheit I Artenvon Tests:

IUnit tests(JUnit, HUnit)

IBlack Boxvs.White Box

IZufallsbasiertesTesten

I Funktionale Programme eignen sichsehr gutzum Testen

20 [26]

Zufallsbasiertes Testen in Haskell

IWerkzeug:QuickCheck

IZufällige Werteeinsetzen, Auswertung aufTrueprüfen IPolymorphe Variablen nichttestbar

IDeshalb Typvariableninstantiieren

ITyp muss genug Element haben (hierInt)

IDurch SignaturTypinstanzerzwingen

IFreie Variablender Eigenschaft werdenParameterder Testfunktion

21 [26]

Axiome mit QuickCheck testen

I Für das Lesen:

p r o p _ r e a d _ e m p t y :: I n t→ B o o l p r o p _ r e a d _ e m p t y a =

l o o k u p ( empty :: Map I n t I n t ) a == N o t h i n g p r o p _ r e a d _ w r i t e :: Map I n t I n t→ I n t→ I n t→ B o o l p r o p _ r e a d _ w r i t e s a v=

l o o k u p ( i n s e r t s a v ) a == J u s t v

I Hier: Eigenschaften direkt alsHaskell-Prädikate

I Es werdenNZufallswerte generiert und getestet (N=100)

22 [26]

Axiome mit QuickCheck testen

IBedingteEigenschaft inquickCheck:

IA=⇒BmitA,BEigenschaften

ITyp istProperty

IEs werden solange Zufallswerte generiert, bisNdie Vorbedingung erfüllende gefunden und getestet wurden, andere werden ignoriert.

p r o p _ r e a d _ w r i t e _ o t h e r ::

Map I n t I n t→ I n t→ I n t→ I n t→ P r o p e r t y p r o p _ r e a d _ w r i t e _ o t h e r s a v b=

a /= b =⇒ l o o k u p ( i n s e r t s a v ) b == l o o k u p s b

23 [26]

Axiome mit QuickCheck testen

I Schreiben:

p r o p _ w r i t e _ w r i t e :: Map I n t I n t→ I n t→ I n t→ I n t→ B o o l p r o p _ w r i t e _ w r i t e s a v w=

i n s e r t ( i n s e r t s a v ) a w== i n s e r t s a w I Schreibenan anderer Stelle:

p r o p _ w r i t e _ o t h e r ::

Map I n t I n t→ I n t→ I n t→ I n t→ I n t→ P r o p e r t y p r o p _ w r i t e _ o t h e r s a v b w=

a /= b =⇒ i n s e r t ( i n s e r t s a v ) b w==

i n s e r t ( i n s e r t s b w) a v I Test benötigtGleichheitaufMap a b

24 [26]

(4)

Zufallswerte selbst erzeugen

IProblem:ZufälligeWerte vonselbstdefiniertenDatentypen

IGleichverteiltheitnicht immer erwünscht (e.g.[a])

IKonstruktionnicht immer offensichtlich (e.g.Map) IInQuickCheck:

ITypklasseclass Arbitrary afürZufallswerte

IEigeneInstanziierungkann Verteilung und Konstruktion berücksichtigen

IE.g.KonstruktioneinerMap:

IZufällige Länge, dann aus sovielen zufälligen WertenMapkonstruieren

IZufallswerte in Haskell?

25 [26]

Zusammenfassung

I Signatur: Typ und Operationen eines ADT I Axiome: über Typen formulierteEigenschaften

I Spezifikation= Signatur + Axiome

IInterfacezwischen Implementierung und Nutzung

ITestenzur Erhöhung der Konfidenz und zum Fehlerfinden

IBeweisender Korrektheit I QuickCheck:

IFreie Variablen der Eigenschaften werdenParameterder Testfunktion

I=⇒fürbedingteEigenschaften

26 [26]

Referenzen

ÄHNLICHE DOKUMENTE

Praktische Informatik 3: Funktionale Programmierung Vorlesung 10 vom 18.12.2012: Spezifikation und Beweis.

I Vorher ankündigen, sonst null Punkte... Warum funktionale Programmierung lernen?. I Denken in Algorithmen, nicht

I Vordefinierte Typen: Listen [a] und Tupel (a,b) I Berechungsmuster über Listen: primitive Rekursion,. Listenkomprehension I Überladung

I Eigenschaften von Werten des Typen (insb. ihre innere Struktur) können nur über die bereitgestellten Operationen beobachtet werden. Zur Implementation von ADTs in

I Axiome können getestet oder bewiesen werden. I Tests finden Fehler, Beweis

Christoph Lüth &amp; Dennis Walter Universität Bremen Wintersemester

I Berechungsmuster über Listen: primitive Rekursion, Listenkomprehension. I Überladung

Signatur: Typ und Operationen eines ADT Axiome: ¨ uber Typen formulierte Eigenschaften Spezifikation = Signatur + Axiome. Interface zwischen Implementierung und Nutzung Testen zur