Declaratieve Talen/Oplossing haskell buurgraden

Uit Wina Examenwiki
Versie door 10.91.91.236 (overleg) op 27 jun 2006 om 15:15 (DT haskell oplossing buurgraden)
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Naar navigatie springen Naar zoeken springen

--een mogelijke oplossing (zeker niet de beste!)

import List

data Edge a = Boog a a deriving Show data Graph a = Graaf [a][Edge a] deriving Show


geefBoog :: Graph a -> Edge a


geefBoog(Graaf x (s:y)) = s


geefBuren :: (Eq a) => Graph a -> a -> [a]


geefBuren (Graaf x y) knoop = [b | b <- x, (heeftBoog knoop b y)];


heeftBoog :: (Eq a) => a -> a -> [Edge a] -> Bool


heeftBoog a b [] = False

heeftBoog a b ((Boog x y):rest) = if ((a == x && b == y) || (b == x && a == y)) then True else heeftBoog a b rest


geefGraad :: (Eq a) => Graph a -> a -> Int


geefGraad (Graaf x y) a = telgraden y a


telgraden :: (Eq a) => [Edge a] -> a -> Int


telgraden [] a = 0 telgraden ((Boog p q):rest) x = if(p == x || q == x) then 1 + telgraden rest x else telgraden rest x


buurgraadVanKnoop :: (Eq a) => Graph a -> a -> [Int]


buurgraadVanKnoop x y = reverse (sort (buurgraadVanBuren x (geefBuren x y)))


buurgraadVanBuren :: (Eq a) => Graph a -> [a] -> [Int]


buurgraadVanBuren x [] = [] buurgraadVanBuren x (buur:rest) = ((geefGraad x buur):(buurgraadVanBuren x rest))


buurgraad :: (Eq a) => Graph a -> [([Int], [a])]


buurgraad (Graaf x y) = voegsamen (geefBuurGraden (Graaf x y) x)


geefBuurGraden :: (Eq a) => Graph a -> [a] -> [([Int],[a])]


geefBuurGraden a [] = [] geefBuurGraden a (knoop:rest) = (((buurgraadVanKnoop a knoop),[knoop]):(geefBuurGraden a rest))


voegsamen :: [([Int], [a])] -> [([Int], [a])]


voegsamen [] = [] voegsamen ( (x, y) : rest) = ((voegbij (x,y) rest) : voegsamen (verwijder (x,y) rest rest))


voegbij :: ([Int], [a]) -> [([Int], [a])] -> ([Int], [a])


voegbij a [] = a voegbij (x, y) ((a,[b]):rest) = if(x == a) then voegbij (x,(b:y)) rest else voegbij (x,y) rest


verwijder :: ([Int], [a]) -> [([Int], [a])] -> [([Int], [a])] -> [([Int], [a])]


verwijder a [] b = b verwijder (x, y) ((a,[b]):rest) ((i,j):rij) = if(x == a) then verwijder (x,y) rest rij else verwijder (x,y) rest ((i,j):rij)