Voici un petit fichier pour s'habituer à travailler sur les listes par compréhension suivi de quelques indications:
Haskell
module Alien where -- L I S T E S P A R C O M P R É H E N S I O N -- E T T A B L E A U X D E D O N N É E S {- On vous demande de gérer le centre d'acceuil terrestre des aliens. Vous disposez de 6 tableaux de données. Vous devez fournir les expressions qui permettent de répondre aux questions posées au bas de cette page. Par exemple, pour avoir la liste des aliments : *Main> Data.List.nub ([m | Miam (a,m) <- baseMiam]) ["Bortsch","Zoumise","Schwanstucke","Kashpir"] ce qui peut se lire : " liste des m tels que Miam(a,m) soit dans baseMiam " -} import qualified Data.List as L type NomA = String type Sexe = String type Planete = String type Aliment = String type NomE = String type Ville = String type NoCabine = Int type NoAllee = Int data Alien = Alien (NomA, Sexe, Planete, NoCabine) data Cabine = Cabine (NoCabine, NoAllee) data Miam = Miam (NomA, Aliment) data Agent = Agent (NomE, Ville) data Responsable = Responsable (NoAllee, NomE) data Gardien = Gardien (NomE, NoCabine) baseAlien = [ Alien ( "Zorglub", "M", "Trantor", 1 ), Alien ( "Blorx", "M", "Euterpe", 2 ), Alien ( "Urxiz", "F", "Aurora", 3 ), Alien ( "ZBleurdite", "F", "Trantor", 4 ), Alien ( "Darneurane","M", "Trantor", 5 ), Alien ( "Mulzo", "M", "Helicon", 6 ), Alien ( "Zzzzz", "F", "Aurora", 7 ), Alien ( "Arggh", "M", "Nexon", 8 ), Alien ( "Joranum", "F", "Euterpe", 9 ) ] baseCabine = [ Cabine ( 1 , 1), Cabine ( 2 , 1), Cabine ( 3 , 1), Cabine ( 4 , 1), Cabine ( 5 , 1), Cabine ( 6 , 2), Cabine ( 7 , 2), Cabine ( 8 , 2), Cabine ( 9 , 2) ] baseMiam = [ Miam ( "Zorglub", "Bortsch"), Miam ( "Blorx", "Bortsch"), Miam ( "Urxiz", "Zoumise"), Miam ( "ZBleurdite", "Bortsch"), Miam ( "Darneurane", "Schwanstucke"), Miam ( "Mulzo", "Kashpir"), Miam ( "Zzzzz", "Kashpir"), Miam ( "Arggh", "Zoumise"), Miam ( "Joranum", "Bortsch") ] baseAgent = [ Agent ( "Branno", "Terminus"), Agent ( "Darell", "Terminus"), Agent ( "Demerzel", "Reze"), Agent ( "Seldon", "Terminus"), Agent ( "Dornick", "Kalgan"), Agent ( "Hardin", "Terminus"), Agent ( "Trevize", "Hesperos"), Agent ( "Pelorat", "Kalgan"), Agent ( "Riose", "Terminus") ] baseResponsable = [ Responsable ( 1, "Seldon"), Responsable ( 2, "Pelorat") ] baseGardien = [ Gardien ( "Branno", 1), Gardien ( "Darell", 2), Gardien ( "Demerzel", 3), Gardien ( "Seldon", 4), Gardien ( "Dornick", 5), Gardien ( "Hardin", 6), Gardien ( "Trevize", 7), Gardien ( "Pelorat", 8), Gardien ( "Riose", 9) ] {- Formez -1 la liste des gardiens ; -2 la liste des villes où habitent les agents ; -3 la liste des triplets (no de cabine,alien,gardien) pour chaque cabine ; -4 la liste des couples (alien,allée) pour chaque alien ; -5 la liste de tous les aliens de l'allée 2 ; -6 la liste de toutes les planètes dont sont originaires les aliens habitant une cellule de numéro pair ; -7 la liste des aliens dont les gardiens sont originaires de Terminus ; -8 la liste des gardiens des aliens féminins qui mangent du bortsch ; -9 la liste des cabines dont les gardiens sont originaires de Terminus ou dont les aliens sont des filles Y a-t-il -10 des aliments qui commencent par la même lettre que le nom du gardien qui surveille l'alien qui les mange ? -11 des aliens originaires d'Euterpe ? Est-ce que -12 tous les aliens ont un 'x' dans leur nom ? -13 tous les aliens qui ont un 'x' dans leur nom ont un gardien qui vient de Terminus ? -14 il existe un alien masculin originaire de Trantor qui mange du Bortsch ou dont le gardien vient de Terminus -} --Formez --1 la liste des gardiens ; lesGardiens = [g | Gardien (g,c) <- baseGardien] --2 la liste des villes où habitent les agents ; lesVilles = L.nub [v | Agent (a,v) <- baseAgent] --3 la liste des couples (alien,gardien) pour chaque cabine ; lesAlienGarde = [(a,g) | Alien (a,s,p,c) <- baseAlien, Gardien (g,cc) <- baseGardien, cc == c ] --4 la liste des couples (alien,allée) pour chaque alien ; lesAlienAllee = [(a,aa) | Alien(a,s,p,c) <- baseAlien, Cabine(cc,aa) <- baseCabine, cc == c] --5 la liste de tous les aliens de l'allée 2 ; lesAlien2 = [a | Alien (a,s,p,c) <- baseAlien, Cabine (cc,aa) <- baseCabine, cc == c, aa == 2] --6 la liste de toutes les planètes dont sont originaires les aliens habitant une cellule de numéro pair ; lesPlanetePair = L.nub [p | Alien (n,s,p,c) <- baseAlien, mod c 2 == 0] --7 la liste des aliens dont les gardiens sont originaires de Terminus ; lesAlienTerminus = [n | Alien (n,s,p,c) <- baseAlien, Gardien (g,cc) <- baseGardien, Agent (gg,"Terminus") <- baseAgent, c == cc, g == gg ] --8 la liste des gardiens des aliens féminins qui mangent du bortsch ; lesGardienFB = [g | Gardien (g,c) <- baseGardien, Alien (n,"F",p,cc) <- baseAlien, Miam (nn,"Bortsch") <- baseMiam, c == cc, n == nn ] --9 la liste des cabines dont les gardiens sont originaires de Terminus ou dont les aliens sont des filles lesCabineGTouAF = [c | Gardien (g,c) <- baseGardien, Agent (gg,v) <- baseAgent, Alien (n,s,p,cc) <- baseAlien, g == gg, c == cc, (v == "Terminus") || (s == "F") ] --Y a--t--il --10 des aliments qui commencent par la même lettre que le nom du gardien qui surveille l'alien qui les mange ? lesAlimGard = [(a,g) | Miam (n,a) <- baseMiam, Alien (nn,s,p,c) <- baseAlien, Gardien (g,cc) <- baseGardien, n == nn, c == cc ] testAG = any (\(a,g) -> head a == head g) lesAlimGard --11 des aliens originaires d'Euterpe ? testEu = any (\x -> x == "Euterpe") [p | Alien (n,s,p,c) <- baseAlien] --Est--ce que --12 tous les aliens ont un 'x' dans leur nom ? testX = all (\nom -> elem 'x' nom) [n | Alien (n,s,p,c) <- baseAlien] --13 tous les aliens qui ont un 'x' dans leur nom ont un gardien qui vient de Terminus ? testXT = all (\v -> v == "Terminus" ) [v | Alien (n,s,p,c) <- baseAlien, Gardien (g,cc) <- baseGardien, Agent (gg,v) <- baseAgent, c == cc, g == gg, elem 'x' n ] --14 il existe un alien masculin originaire de Trantor qui mange du Bortsch ou dont le gardien vient de Terminus ? lesAlienMTBouT = [n | Gardien (g,c) <- baseGardien, Agent (gg,v) <- baseAgent, Alien (n,"M","Trantor",cc) <- baseAlien, Miam (nn,m) <- baseMiam, g == gg, c == cc, n == nn, (v == "Terminus") || (m == "Bortsch") ] testMTBouT = lesAlienMTBouT == [] {- λ> lesGardiens ["Branno","Darell","Demerzel","Seldon","Dornick","Hardin","Trevize","Pelorat","Riose"] λ> lesVilles ["Terminus","Reze","Kalgan","Hesperos"] λ> lesAlienGarde [("Zorglub","Branno"),("Blorx","Darell"),("Urxiz","Demerzel"),("ZBleurdite","Seldon"),("Darneurane","Dornick"),("Mulzo","Hardin"),("Zzzzz","Trevize"),("Arggh","Pelorat"),("Joranum","Riose")] λ> lesAlienAllee [("Zorglub",1),("Blorx",1),("Urxiz",1),("ZBleurdite",1),("Darneurane",1),("Mulzo",2),("Zzzzz",2),("Arggh",2),("Joranum",2)] λ> lesAlien2 ["Mulzo","Zzzzz","Arggh","Joranum"] λ> lesPlanetePair ["Euterpe","Trantor","Helicon","Nexon"] λ> lesAlienTerminus ["Zorglub","Blorx","ZBleurdite","Mulzo","Joranum"] λ> lesGardienFB ["Seldon","Riose"] λ> lesCabineGTouAF [1,2,3,4,6,7,9] λ> lesAlimGard [("Bortsch","Branno"),("Bortsch","Darell"),("Zoumise","Demerzel"),("Bortsch","Seldon"),("Schwanstucke","Dornick"),("Kashpir","Hardin"),("Kashpir","Trevize"),("Zoumise","Pelorat"),("Bortsch","Riose")] λ> testAG True λ> testEu True λ> testX False λ> testXT False λ> lesAlienMTBouT ["Zorglub"] λ> testMTBouT False λ> -}