Declaratieve Talen/Oplossing haskell buurgraden

Uit Wina Examenwiki
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

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)