Guest User

Untitled

a guest
May 23rd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Data.List
  2. import Data.Maybe
  3.  
  4. --Het werkgeheugen bestaat uit een lijst van tuples (Pagina, hoeveel beurten niet gebruikt)
  5. type Werkgeheugen = [(Pagina, Int)]
  6.  
  7. --Een pagina wordt voorgesteld door een Int
  8. type Pagina = Int
  9.  
  10. --Een pagineringsfout is een 4-tuple ingevuld als volgt:
  11. --(tijdstip, positie, oudePagina, nieuwePagina)
  12. type Fout = (Tijdstip, Int, Pagina, Pagina)                                          
  13.  
  14. --Een tijdstip wordt voorgesteld door een Int
  15. type Tijdstip = Int
  16.  
  17. --Zie opgave
  18. --lru :: Int -> Int -> [Pagina] -> [Fout]
  19. lru m n paginas = verwerk (
  20.  
  21. leesvolgende :: Pagina -> Werkgeheugen -> [Fout] -> Tijdstip -> (Werkgeheugen, [Fout])
  22. leesvolgende pagina geheugen fouten tijdstip
  23.         |elem pagina (map fst geheugen) = (geheugen, fouten)
  24.         |otherwise = vervangPagina pagina geheugen fouten tijdstip
  25.  
  26. --Vervangt de minst gebruikte pagina in het geheugen door een meegegeven pagina
  27. --De lijst van fouten wordt ook geupdate
  28. vervangPagina :: Pagina -> Werkgeheugen -> [Fout] -> Tijdstip -> (Werkgeheugen, [Fout])
  29. vervangPagina pagina geheugen fouten tijdstip = (updatedGeheugen, fouten++[(tijdstip, positie, oudepagina, pagina)])
  30.         where   updatedGeheugen = updateGeheugen pagina geheugen
  31.                 positie = fromJust $ elemIndex pagina (map fst updatedGeheugen)
  32.                 oudepagina = head $ (map fst updatedGeheugen) \\ (map fst geheugen) --beetje vuile truuk ;)
  33.  
  34. updateGeheugen :: Pagina -> Werkgeheugen -> Werkgeheugen
  35. updateGeheugen pagina geheugen = vervangPaginaN positie pagina geheugen
  36.         where positie = vindIndexMetGebruikt (maximum (map snd geheugen)) geheugen 0
  37.  
  38. --Vervangt een pagina op de gegeven positie door een nieuwe pagina
  39. --Een nieuwe pagina is nog nooit gebruikt dus het tweede element van het tupel is 0
  40. vervangPaginaN :: Int -> Pagina -> Werkgeheugen -> Werkgeheugen
  41. vervangPaginaN positie nieuwePagina (pagina:rest)
  42.          | positie == 0 = (nieuwePagina, 0):rest
  43.          | otherwise = pagina:vervangPaginaN (positie-1) nieuwePagina rest
  44.  
  45. vindIndexMetGebruikt :: Int -> Werkgeheugen -> Int-> Int
  46. vindIndexMetGebruikt _ [] _ = error "Kan niet"
  47. vindIndexMetGebruikt keerGebruikt ((pagina, aantal):rest) positie
  48.         |keerGebruikt == aantal = positie
  49.         |otherwise = vindIndexMetGebruikt keerGebruikt rest (positie+1)
Add Comment
Please, Sign In to add comment