abstraktn í datové typy

27
Abstraktn Abstraktn í datové typy í datové typy doc. Dr. Ing. doc. Dr. Ing. Miroslav Miroslav Beneš Beneš katedra informatiky, katedra informatiky, A-1007 A-1007 59 732 59 732 4213 4213

Upload: gavin

Post on 10-Jan-2016

39 views

Category:

Documents


0 download

DESCRIPTION

Abstraktn í datové typy. doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213. Obsah p řednášky. Motivace, vlastnosti ADT Moduly v Haskellu Obecné principy návrhu ADT ADT Fronta ADT Vyhledávací strom ADT Množina ADT Relace Příklady na procvičení. Motivace. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Abstraktn í datové typy

AbstraktnAbstraktní datové typyí datové typy

doc. Dr. Ing. doc. Dr. Ing. Miroslav BenešMiroslav Beneš

katedra informatiky, A-1007katedra informatiky, A-1007

59 732 59 732 42134213

Page 2: Abstraktn í datové typy

22ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

Obsah pObsah přednáškyřednášky

Motivace, vlastnosti ADTMotivace, vlastnosti ADTModuly v HaskelluModuly v HaskelluObecné principy návrhu ADTObecné principy návrhu ADTADT FrontaADT FrontaADT Vyhledávací stromADT Vyhledávací stromADT MnožinaADT MnožinaADT RelaceADT RelacePříklady na procvičeníPříklady na procvičení

Page 3: Abstraktn í datové typy

33ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

MotivaceMotivace

Cíl: Vytvoření kalkulátoru pro číselné výrazyCíl: Vytvoření kalkulátoru pro číselné výrazy čtení a zápis hodnot proměnnýchčtení a zápis hodnot proměnných

Modely zapisovatelné paměti Modely zapisovatelné paměti seznam dvojicseznam dvojic:: [(String, Int)][(String, Int)] funkce:funkce: (String -> Int)(String -> Int)

OperaceOperace initial :: Storeinitial :: Store value :: Store -> String -> Intvalue :: Store -> String -> Int update :: Store -> String -> Int -> Storeupdate :: Store -> String -> Int -> Store

Page 4: Abstraktn í datové typy

44ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

AbstraktnAbstraktníí datov datovýý typ typ

Omezené rozhraníOmezené rozhraní type Store type Store = [(Int, Var)]= [(Int, Var)]ss1, s2:: Store1, s2:: Store -> Co je to -> Co je to s1++s2s1++s2 ??

Nezávislost rozhraní na implementaciNezávislost rozhraní na implementaci type Store type Store = Var -> Int= Var -> Ints1, s2:: Stores1, s2:: Store -> -> s1++s2s1++s2 nefunguje nefunguje

PodmPodmínky pro ADTínky pro ADT definice veřejného rozhranídefinice veřejného rozhraní implementace typu není dostupnáimplementace typu není dostupná

Page 5: Abstraktn í datové typy

55ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ModulyModuly

Definice moduluDefinice modulu module A where -- A.hs, A.lhsmodule A where -- A.hs, A.lhs......

všechny definice jsou viditelnévšechny definice jsou viditelné

Import moduluImport modulu module A wheremodule A whereimport Bimport B......

dovezou se všechny viditelné definicedovezou se všechny viditelné definice

Page 6: Abstraktn í datové typy

66ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ModulyModuly

Omezení exportuOmezení exportu module module ExprExpr ( printExpr, Expr(..) ) where( printExpr, Expr(..) ) where Expr(..)Expr(..) – exportuje i konstruktory– exportuje i konstruktoryExprExpr – pouze export jm– pouze export jména typuéna typu

Omezení dovozuOmezení dovozu import Expr hidingimport Expr hiding( printExpr )( printExpr ) import qualified Expr -- Expr.printExprimport qualified Expr -- Expr.printExpr import Expr as Vyrazimport Expr as Vyraz -- Vyraz.printExpr -- Vyraz.printExpr

Page 7: Abstraktn í datové typy

77ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT a HaskellADT a Haskell

ADT je definovADT je definován v samostatném moduluán v samostatném modulu

Explicitní export operacíExplicitní export operací

Export pouze jména typu bez konstruktorůExport pouze jména typu bez konstruktorů

module Store module Store

(Store, (Store,

initial, initial, -- Store-- Store

value, value, -- Store -> String -> Int-- Store -> String -> Int

update update -- Store -> String -> Int -> Store-- Store -> String -> Int -> Store

) where) where

Page 8: Abstraktn í datové typy

88ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

Implementace - seznamImplementace - seznam

Definice typuDefinice typudata Store = Sto [(String, Int)]data Store = Sto [(String, Int)]newtype Store = Sto [(String,newtype Store = Sto [(String, Int)]Int)]

Definice operacDefinice operacííinitial initial :: Store:: Storeinitial = Sto []initial = Sto []

value :: Store -> String -> Intvalue :: Store -> String -> Intvalue (Sto []) _ = 0value (Sto []) _ = 0value (Sto ((w,n):sto)) v value (Sto ((w,n):sto)) v | v == w = n| v == w = n | otherwise = value (Sto sto) v| otherwise = value (Sto sto) v

update :: Store -> String -> Int -> Storeupdate :: Store -> String -> Int -> Storeupdate (Sto sto) v n = Sto ((v,n):sto)update (Sto sto) v n = Sto ((v,n):sto)

Page 9: Abstraktn í datové typy

99ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

Implementace - funkceImplementace - funkce

Definice typuDefinice typunewtype Store = Sto (String -> Int)newtype Store = Sto (String -> Int)

Definice operacDefinice operacííinitial initial :: Store:: Storeinitial = Sto (\v -> 0)initial = Sto (\v -> 0)

value :: Store -> String -> Intvalue :: Store -> String -> Intvalue (Sto sto) v = sto vvalue (Sto sto) v = sto v

update :: Store -> String -> Int -> Storeupdate :: Store -> String -> Int -> Storeupdate (Sto sto) v n update (Sto sto) v n = Sto (\w -> if v==w then n else sto w)= Sto (\w -> if v==w then n else sto w)

Page 10: Abstraktn í datové typy

1010ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ObecnObecné principy návrhu ADTé principy návrhu ADT

Identifikace a pojmenování typůIdentifikace a pojmenování typůNeformální popis typůNeformální popis typůSignatury typůSignatury typů Jak vytvořit objekt daného typu?Jak vytvořit objekt daného typu? Jak zjistit, o jaký druh objektu jde?Jak zjistit, o jaký druh objektu jde? Jak se dostaneme ke složkám typu?Jak se dostaneme ke složkám typu? Můžeme provádět transformace objektů?Můžeme provádět transformace objektů? Jak můžeme objekty kombinovat?Jak můžeme objekty kombinovat? Můžeme objekty agregovat?Můžeme objekty agregovat?

Page 11: Abstraktn í datové typy

1111ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT ADT FrontaFronta

inicializace: emptyQinicializace: emptyQtest prtest prázdné fronty: isEmptyQázdné fronty: isEmptyQvložení na konec fronty: addQvložení na konec fronty: addQvýběr prvku ze začátku fronty: remQvýběr prvku ze začátku fronty: remQ

module Queuemodule Queue( Queue,( Queue, emptyQ, emptyQ, -- Queue a-- Queue a isEmptyQ, isEmptyQ, -- Queue a -> Bool-- Queue a -> Bool addQ, addQ, -- a -> Queue a -> Queue a-- a -> Queue a -> Queue a remQ remQ -- Queue q -> (a, Queue a)-- Queue q -> (a, Queue a)) where) where

Page 12: Abstraktn í datové typy

1212ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

Implementace fronty 1Implementace fronty 1

-- -- vklvkládáme na konec, vybíráme ze začátku seznamuádáme na konec, vybíráme ze začátku seznamu

newtype Queue a newtype Queue a = Qu [a]= Qu [a]

emptyQ = Qu []emptyQ = Qu []

isEmptyQ (Qu q) = empty qisEmptyQ (Qu q) = empty q

addQ x (Qu xs) = Qu (xs++[x])addQ x (Qu xs) = Qu (xs++[x])

remQ q@(Qu xs)remQ q@(Qu xs)| not (isEmptyQ q) = (head xs, Qu (tail | not (isEmptyQ q) = (head xs, Qu (tail xs))xs))| otherwise = error “remQ”| otherwise = error “remQ”

Page 13: Abstraktn í datové typy

1313ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

Implementace fronty Implementace fronty 22

-- -- vklvkládáme na začátek, vybíráme z konce seznamuádáme na začátek, vybíráme z konce seznamu

addQ x (Qu xs) = Qu (addQ x (Qu xs) = Qu (x:xsx:xs))

remQ q@(Qu xs)remQ q@(Qu xs)| not (isEmptyQ q) = (last xs, Qu (init | not (isEmptyQ q) = (last xs, Qu (init xs))xs))| otherwise = error “remQ”| otherwise = error “remQ”

slosložžitostitost addQ/remQ addQ/remQ konstantní – konstantní – na začátku seznamuna začátku seznamu lineární – na konci seznamulineární – na konci seznamu

Page 14: Abstraktn í datové typy

1414ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

Implementace fronty 3Implementace fronty 3

newtype Queue a newtype Queue a = Qu [a]= Qu [a] [a][a]

emptyQ = Qu [] []emptyQ = Qu [] []

isEmptyQ (Qu [] []) = TrueisEmptyQ (Qu [] []) = True

isEmptyQ _ = FalseisEmptyQ _ = False

addQ x (Qu xs ys) = Qu xs (x:ys)addQ x (Qu xs ys) = Qu xs (x:ys)

remQ (Qu (x:xs) ys) = (x, Qu xs ys)remQ (Qu (x:xs) ys) = (x, Qu xs ys)

remQ (Qu [] ys) = remQ (Qu (reverse ys) [])remQ (Qu [] ys) = remQ (Qu (reverse ys) [])

remQ (Qu [] []) = error “remQ”remQ (Qu [] []) = error “remQ”

Page 15: Abstraktn í datové typy

1515ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT Vyhledávací stromADT Vyhledávací strom

module Treemodule Tree( Tree,( Tree, nil, nil, -- Tree a-- Tree a isNil, isNil, -- Tree a -> Bool-- Tree a -> Bool isNode, isNode, -- Tree a -> Bool-- Tree a -> Bool leftSub, leftSub,-- Tree a -> Tree a-- Tree a -> Tree a rightSub, rightSub, -- Tree a -> Tree a-- Tree a -> Tree a treeVal, treeVal,-- Tree a -> a-- Tree a -> a insTree, insTree,-- Ord a => a -> Tree a -> Tree a-- Ord a => a -> Tree a -> Tree a delete, delete, -- Ord a => a -> Tree a -> Tree a-- Ord a => a -> Tree a -> Tree a minTree minTree -- Ord a => Tree a -> Maybe a-- Ord a => Tree a -> Maybe a) where) where

Page 16: Abstraktn í datové typy

1616ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT ADT VyhledVyhledávací stromávací strom-- definice typu-- definice typudata Tree a data Tree a = Nil | Node a (Tree a) (Tree a)= Nil | Node a (Tree a) (Tree a)-- konstrukce hodnoty-- konstrukce hodnotynil :: Tree anil :: Tree anil = nilnil = nil-- dotaz na druh objektu-- dotaz na druh objektuisNil :: Tree a -> BoolisNil :: Tree a -> BoolisNil Nil = TrueisNil Nil = TrueisNil _ = FalseisNil _ = False-- -- vvýběr složky objektuýběr složky objektuleftSub :: Tree a -> Tree aleftSub :: Tree a -> Tree aleftSub Nil leftSub Nil = error “leftSub”= error “leftSub”leftSub (Node _ t1 _) = t1leftSub (Node _ t1 _) = t1

Page 17: Abstraktn í datové typy

1717ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT Vyhledávací stromADT Vyhledávací strom

-- -- vložení prvku do stromuvložení prvku do stromuinsTree :: Ord a insTree :: Ord a => a -> => a -> Tree a Tree a -> Tree a-> Tree a

insTree val Nil = (Node val Nil Nil)insTree val Nil = (Node val Nil Nil)insTree val (Node v t1 t2)insTree val (Node v t1 t2) | v == val = Node v t1 t2 | v == val = Node v t1 t2 | val > v = Node v t1 (insTree val t2) | val > v = Node v t1 (insTree val t2) | val < v = Node v (insTree val t1) t2 | val < v = Node v (insTree val t1) t2

Page 18: Abstraktn í datové typy

1818ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT ADT VVyhledyhledávací stromávací strom

-- -- vyhledání nejmenšího prvku ve stromuvyhledání nejmenšího prvku ve stromuminTree :: Ord a minTree :: Ord a => => Tree a Tree a -> -> MaybeMaybe a a

minTree tminTree t || isNil isNil t = Nothing t = Nothing | isNil t1 = Just v | isNil t1 = Just v | otherwise = minTree t1 | otherwise = minTree t1 where t1 = leftSub t where t1 = leftSub t v = treeVal t v = treeVal t

data Maybe a = Nothing | Just adata Maybe a = Nothing | Just a

Page 19: Abstraktn í datové typy

1919ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT Vyhledávací stromADT Vyhledávací strom-- odstran-- odstranění prvku ze stromuění prvku ze stromudelete :: Ord a delete :: Ord a => a -> => a -> Tree a Tree a -> Tree a-> Tree a

delete val delete val (Node v t1 t2)(Node v t1 t2) | val < v = Node v (delete val t1) t2 | val < v = Node v (delete val t1) t2 | val > v = Node v t1 (delete val t2) | val > v = Node v t1 (delete val t2) | isNil t2 = t1 | isNil t2 = t1 | isNil t1 = t2 | isNil t1 = t2 | otherwise = join t1 t2 | otherwise = join t1 t2

join :: Ord a => Tree a -> Tree a -> Tree ajoin :: Ord a => Tree a -> Tree a -> Tree ajoin t1 t2 = Node mini t1 newtjoin t1 t2 = Node mini t1 newt where (Just mini) = minTree t2 where (Just mini) = minTree t2 newt = delete mini t2 newt = delete mini t2

Page 20: Abstraktn í datové typy

2020ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT MnožinaADT Množina

Seznam – uspořádaná posloupnostSeznam – uspořádaná posloupnost

Množina – bez uspořádání, bez opakováníMnožina – bez uspořádání, bez opakovánímodule Setmodule Set

( Set,( Set, empty, empty, -- Set a-- Set a inclincl,, -- -- Eq a => Eq a => a -a -> Set a -> Set a> Set a -> Set a makeSet, makeSet, -- Eq a => [a] -> Set a-- Eq a => [a] -> Set a isEmpty, -- Set a -> Bool isEmpty, -- Set a -> Bool inSet, inSet, -- Eq a => Set a -> a -> Bool-- Eq a => Set a -> a -> Bool union, inter, diff, union, inter, diff, -- Eq a => Set a -> Set a -> Set a -- Eq a => Set a -> Set a -> Set a eqSet, subSet,-- Eq a => Set a -> Set a -> Bool eqSet, subSet,-- Eq a => Set a -> Set a -> Bool card card -- Set a -> Int-- Set a -> Int) where) where

Page 21: Abstraktn í datové typy

2121ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT ADT MMnonožinažina

ImplementaceImplementace seznam neopakujících se prvkůseznam neopakujících se prvků

newtype Set a newtype Set a = St [a]= St [a] seznam seznam uspouspořádaných prvkůřádaných prvků

lineární složitost vyhledávánílineární složitost vyhledávání vyhledávací stromvyhledávací strom

logaritmická složitost vyhledávánílogaritmická složitost vyhledávání ……

Page 22: Abstraktn í datové typy

2222ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT ADT MMnonožinažina

-- zakrytí funkce union-- zakrytí funkce union

import List hiding import List hiding ((unionunion))

-- deklarace instance t-- deklarace instance třídy Eqřídy Eq

instance Eq a instance Eq a => Eq (Set a) where=> Eq (Set a) where (==) = eqSet (==) = eqSet

-- definice typu-- definice typu

newtypenewtype SetSet a a = St [a]= St [a]

Page 23: Abstraktn í datové typy

2323ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT ADT MMnonožinažina

-- konstruktory-- konstruktory

empty :: Set aempty :: Set aemptyempty = St [] = St []

incl :: Eq a => incl :: Eq a => a -a -> Set a -> Set a> Set a -> Set a

incl x (St st) = St (incl1 x st)incl x (St st) = St (incl1 x st) where incl1 x [] = [x] where incl1 x [] = [x] incl1 x s@(y:ys) incl1 x s@(y:ys) | x == y = s | x == y = s | otherwise = y : (incl1 x ys) | otherwise = y : (incl1 x ys)

makeSet :: makeSet :: Eq a Eq a => [a] -> Set a=> [a] -> Set amakeSet [] = emptymakeSet [] = emptymakeSet (x:xs) = incl x (makeSet xs)makeSet (x:xs) = incl x (makeSet xs)

Page 24: Abstraktn í datové typy

2424ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADTADT Relace Relace

Binární relace na množině A:Binární relace na množině A:podmnožina kartézského součinu (A x A)podmnožina kartézského součinu (A x A)

MnoMnožina uspořádaných dvojic žina uspořádaných dvojic (x,y)(x,y)(AxA)(AxA)type Relation a type Relation a = Set (a,a)= Set (a,a)

11 22 33

11 XX XX

22 XX

33 XX

11

22

33

Page 25: Abstraktn í datové typy

2525ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT ADT RRelaceelace

Kompozice relacKompozice relacíí (x1, x2)(x1, x2)R1, (x2, x3)R1, (x2, x3)R2 -> (x1,x3)R2 -> (x1,x3)R2R2R1R1 compose r2 r1 =compose r2 r1 = [(x1,x3) | (x1, x2) <- r1, [(x1,x3) | (x1, x2) <- r1, (x2’,x3) <- r2, (x2’,x3) <- r2, x2 == x2’] x2 == x2’]

Mocnina relaceMocnina relace rr1 1 = r, r= r, rn+1n+1 = r = r r rnn

pow 1 r = rpow 1 r = rpow (n+1) r = compose r (pow n r)pow (n+1) r = compose r (pow n r)

Page 26: Abstraktn í datové typy

2626ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

ADT ADT RRelaceelace

Vlastnosti relace R Vlastnosti relace R U UUU reflexivita:reflexivita:

x x U . (x,x) U . (x,x) R R symetriesymetrie

x,y . (x,y) x,y . (x,y) R R (y,x) (y,x) R R tranzitivitatranzitivita

x,y,z . (x,y)x,y,z . (x,y)R R (y,z) (y,z)R R (x,z) (x,z)RR

Pozor! Pozor! isReflexive :: Eq a => Rel a => Set a => BoolisReflexive :: Eq a => Rel a => Set a => BoolisReflexive r u = and [inSet (x,x) r | x <- u]isReflexive r u = and [inSet (x,x) r | x <- u]

Page 27: Abstraktn í datové typy

2727ÚDPJ - Abstraktní datové typyÚDPJ - Abstraktní datové typy

Úkoly na procvičeníÚkoly na procvičení

Definujte abstraktní datový typ Stack Definujte abstraktní datový typ Stack reprezentující zásobník s operacemireprezentující zásobník s operacemi push push :: a -> Stack a -> Stack a:: a -> Stack a -> Stack a pop :: Stack a -> Stack apop :: Stack a -> Stack a top :: Stack a -> atop :: Stack a -> a isEmpty :: Stack a ->BoolisEmpty :: Stack a ->Bool

Definujte abstraktní datový typ Deque Definujte abstraktní datový typ Deque reprezentující oboustranně ukončenou frontu s reprezentující oboustranně ukončenou frontu s operacemioperacemi addFirst, addLastaddFirst, addLast removeFirst, removeLastremoveFirst, removeLast ……