5 luglio 2017 - laboratorio
Linguaggi e Traduttori
Prof. Marco Gavanelli
5 luglio 2017
Esercizio 1 (punti 18)
In molti sistemi operativi (ad es. le distribuzioni Debian di Linux) i software installabili sono suddivisi in pacchetti. Ogni pacchetto disponibile può essere installato o non installato nel sistema.
Vengono forniti i seguenti file:
- un file installati.txt che fornisce i pacchetti installati nel sistema
- un file richiesti.txt che fornisce i pacchetti richiesti dall'utente (che quindi non possono essere disinstallati)
- un file dipendenze.txt che fornisce le dipendenze fra pacchetti. In ogni riga del file sono presenti i nomi di due pacchetti; il primo dipende dal secondo, ossia è necessario che il secondo sia installato perché possa essere installato il primo.
Si desidera elencare i pacchetti inutili, che potrebbero essere disinstallati senza eliminare alcun pacchetto richiesto dall'utente. In altre parole, non è possibile disinstallare i pacchetti richiesti dall'utente, né quelli da cui dipendono (ricorsivamente) i pacchetti richiesti dall'utente; si desidera visualizzare a video i pacchetti installati che non sono richiesti dall'utente e da cui i pacchetti richiesti dall'utente non dipendono.
È indispensabile fare uso di funzioni di ordine superiore nella soluzione del problema. Si usino (e, possibilmente, definiscano) funzioni di ordine superiore per risolvere il problema. Nel voto finale è inclusa una valutazione basata sull'utilizzo di funzioni di ordine superiore, list comprehension, lazy evaluation.
Esercizio 2 (Punti 2)
Un'azienda desidera che i link nelle pagine web del suo sito vengano portati dal formato relativo
<a href="pagina.html">
al formato assoluto, che contiene anche il nome del sito web dell'azienda:
<a href="http://www.sito.com/pagina.html">
Chiaramente, se un indirizzo è già nel formato assoluto, ad esempio <a href="http://www.unife.it">, <a href="mailto:gino@sito.com"> o <a href="ftp://altro.sito.com"> questo non va modificato.
Si desidera scrivere un programma Lex che converte un file html con link relativi in assoluti.
Soluzione 1
data Dipendenza = Dipendenza{ richiedente :: String, richiesto :: String } deriving Show;
converti [da,a] = Dipendenza da a
leggiFile fileName = do
inpStrInst <- readFile fileName
return (words inpStrInst)
utile dipendenze richiesti installato =
(elem installato richiesti) ||
(unoComune richiesti (dipendenti dipendenze dipendenze installato))
-- vero se le due liste hanno un elemento in comune
unoComune xs ys = any (\y -> elem y xs) ys
-- fornisce la lista di tutti i pacchetti che dipendono da p
-- dipendenti dipendenze tutte p
dipendenti [] _ _ = []
dipendenti ((Dipendenza x y):dipendenze) tutte p
| y == p = (x:(dipendenti tutte tutte x))++ric
| otherwise = ric
where ric = dipendenti dipendenze tutte p
inutili dipendenze installati richiesti =
filter (not.(utile dipendenze richiesti)) installati
main = do
inpStrDip <- readFile "dipendenze.txt"
let dipendenze = map (converti.words) (lines inpStrDip)
installati <- leggiFile "installati.txt"
richiesti <- leggiFile "richiesti.txt"
print (inutili dipendenze installati richiesti)