Salta ai contenuti. | Salta alla navigazione

Strumenti personali

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)