Declaratieve Talen/Oplossing haskell buurgraden: verschil tussen versies
Naar navigatie springen
Naar zoeken springen
(6 tussenliggende versies door dezelfde gebruiker niet weergegeven) | |||
Regel 122: | Regel 122: | ||
[(buurgraad knoop (Graaf knopen bogen)) | knoop <- knopen] | [(buurgraad knoop (Graaf knopen bogen)) | knoop <- knopen] | ||
</pre> | </pre> | ||
== Nog een alternatief == | |||
-- beide deelvragen | |||
<pre> | |||
import Data.List | |||
data Graaf t = Graaf [t] [Boog t] | |||
data Boog t = Boog t t | |||
buurgraadGraaf :: (Eq t, Ord t) => Graaf t -> [([Int],[t])] | |||
buurgraadGraaf graaf@(Graaf knopen bogen) = res | |||
where buurgraadparen = map (buurgraadKnoop graaf) knopen | |||
buurgraden = sortBy buurgraadCompare (nub [ buurgraad | (buurgraad,v) <- buurgraadparen ]) | |||
res = [ (buurgraad, nub [vertex | vertex <- knopen, (buurgraad,vertex) `elem` buurgraadparen]) | buurgraad <- buurgraden ] | |||
nooit_isomorf :: (Eq t, Ord t) => Graaf t -> Graaf t -> Bool | |||
nooit_isomorf graaf1 graaf2 = not $ graadLengte1 == graadLengte2 | |||
where graadgraaf1 = buurgraadGraaf graaf1 | |||
graadgraaf2 = buurgraadGraaf graaf2 | |||
graadLengte1 = knopenNaarLengte graadgraaf1 | |||
graadLengte2 = knopenNaarLengte graadgraaf2 | |||
knopenNaarLengte :: [([Int],[t])] -> [([Int],Int)] | |||
knopenNaarLengte [] = [] | |||
knopenNaarLengte ((buurgraad,knopen):xs) = (buurgraad,length knopen) : knopenNaarLengte xs | |||
buurgraadKnoop :: (Eq t) => Graaf t -> t -> ([Int],t) | |||
buurgraadKnoop graaf knoop = (graden,knoop) | |||
where buren = alleBuren graaf knoop | |||
graden = sortBy intDesc [ n | buur <- buren, let n = graad graaf buur ] | |||
graad :: (Eq t) => Graaf t -> t -> Int | |||
graad (Graaf knopen bogen) knoop = graad' bogen knoop 0 | |||
graad' :: (Eq t) => [Boog t] -> t -> Int -> Int | |||
graad' [] _ num = num | |||
graad' ((Boog a b):xs) knoop num | a == knoop || b == knoop = graad' xs knoop (num + 1) | |||
| otherwise = graad' xs knoop num | |||
alleBuren :: (Eq t) => Graaf t -> t -> [t] | |||
alleBuren (Graaf knopen bogen) knoop = alleBuren' bogen knoop [] | |||
alleBuren' :: (Eq t) => [Boog t] -> t -> [t] -> [t] | |||
alleBuren' [] _ list = list | |||
alleBuren' (Boog a b:xs) knoop alGezien | a == knoop && b `notElem` alGezien = alleBuren' xs knoop (b:alGezien) | |||
| b == knoop && a `notElem` alGezien = alleBuren' xs knoop (a:alGezien) | |||
| otherwise = alleBuren' xs knoop alGezien | |||
maakOngericht :: [(t,t)] -> [(t,t)] | |||
maakOngericht [] = [] | |||
maakOngericht ((a,b):xs) = (a,b):(b,a):maakOngericht xs | |||
buurgraadCompare :: (Eq t, Ord t) => [t] -> [t] -> Ordering | |||
buurgraadCompare a b | length a > length b = LT | |||
| length a < length b = GT | |||
| head a > head b = LT | |||
| head a < head b = GT | |||
| head a == head b = EQ | |||
intDesc :: Int -> Int -> Ordering | |||
intDesc a b | a < b = GT | |||
| a > b = LT | |||
| a == b = EQ | |||
</pre> | |||
--[[Gebruiker:Thomas Vochten|Thomas Vochten]] |
Huidige versie van 13 jan 2014 19:33
--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)
Een alternatief
Merk op dat deze oplossing de uitkomst niet sorteert ...
import List -- Graaf ['a','b','c','d','e','f','g','h'] [Boog 'a' 'b', Boog 'b' 'c', Boog 'e' 'f', Boog 'f' 'g', Boog 'g' 'h', Boog 'h' 'a', Boog 'd' 'g', -- Boog 'c' 'd', Boog 'd' 'e', Boog 'a' 'd'] data Graaf a = Graaf [a] [Boog a] deriving Show data Boog a = Boog a a deriving Show geef_buren::(Eq a)=>a->Graaf a->[a] geef_buren knoop (Graaf _ bogen) = [y | (Boog y z) <- bogen, z==knoop] ++ [y | (Boog z y) <- bogen, z==knoop] graad_knopen::(Eq a)=>[a]->Graaf a->[Int] graad_knopen [] graaf = [] graad_knopen (knoop:xs) graaf = length (geef_buren knoop graaf) : (graad_knopen xs graaf) buurgraad::(Eq a)=>a->Graaf a->([Int],[a]) buurgraad knoop graaf = let buren = geef_buren knoop graaf in (reverse (sort (graad_knopen buren graaf)) , [knoop]) buurgraad_graaf::(Eq a)=>Graaf a->[([Int],[a])] buurgraad_graaf (Graaf knopen bogen) = [(buurgraad knoop (Graaf knopen bogen)) | knoop <- knopen]
Nog een alternatief
-- beide deelvragen
import Data.List data Graaf t = Graaf [t] [Boog t] data Boog t = Boog t t buurgraadGraaf :: (Eq t, Ord t) => Graaf t -> [([Int],[t])] buurgraadGraaf graaf@(Graaf knopen bogen) = res where buurgraadparen = map (buurgraadKnoop graaf) knopen buurgraden = sortBy buurgraadCompare (nub [ buurgraad | (buurgraad,v) <- buurgraadparen ]) res = [ (buurgraad, nub [vertex | vertex <- knopen, (buurgraad,vertex) `elem` buurgraadparen]) | buurgraad <- buurgraden ] nooit_isomorf :: (Eq t, Ord t) => Graaf t -> Graaf t -> Bool nooit_isomorf graaf1 graaf2 = not $ graadLengte1 == graadLengte2 where graadgraaf1 = buurgraadGraaf graaf1 graadgraaf2 = buurgraadGraaf graaf2 graadLengte1 = knopenNaarLengte graadgraaf1 graadLengte2 = knopenNaarLengte graadgraaf2 knopenNaarLengte :: [([Int],[t])] -> [([Int],Int)] knopenNaarLengte [] = [] knopenNaarLengte ((buurgraad,knopen):xs) = (buurgraad,length knopen) : knopenNaarLengte xs buurgraadKnoop :: (Eq t) => Graaf t -> t -> ([Int],t) buurgraadKnoop graaf knoop = (graden,knoop) where buren = alleBuren graaf knoop graden = sortBy intDesc [ n | buur <- buren, let n = graad graaf buur ] graad :: (Eq t) => Graaf t -> t -> Int graad (Graaf knopen bogen) knoop = graad' bogen knoop 0 graad' :: (Eq t) => [Boog t] -> t -> Int -> Int graad' [] _ num = num graad' ((Boog a b):xs) knoop num | a == knoop || b == knoop = graad' xs knoop (num + 1) | otherwise = graad' xs knoop num alleBuren :: (Eq t) => Graaf t -> t -> [t] alleBuren (Graaf knopen bogen) knoop = alleBuren' bogen knoop [] alleBuren' :: (Eq t) => [Boog t] -> t -> [t] -> [t] alleBuren' [] _ list = list alleBuren' (Boog a b:xs) knoop alGezien | a == knoop && b `notElem` alGezien = alleBuren' xs knoop (b:alGezien) | b == knoop && a `notElem` alGezien = alleBuren' xs knoop (a:alGezien) | otherwise = alleBuren' xs knoop alGezien maakOngericht :: [(t,t)] -> [(t,t)] maakOngericht [] = [] maakOngericht ((a,b):xs) = (a,b):(b,a):maakOngericht xs buurgraadCompare :: (Eq t, Ord t) => [t] -> [t] -> Ordering buurgraadCompare a b | length a > length b = LT | length a < length b = GT | head a > head b = LT | head a < head b = GT | head a == head b = EQ intDesc :: Int -> Int -> Ordering intDesc a b | a < b = GT | a > b = LT | a == b = EQ