1. Position (5p) Definera en funktion som givet ett par med en lista l och ett heltal n ger tillbaka det element ur l som förekommer på position n. Huvudet i en lista finns på position 1, nästa element på position 2 osv. Korrekt angiven generell typ ger 2 poäng. 2. Matriser En lista är en n × m-matris om den innehåller n dellistor som alla har m element samtidigt som både n och m är större än noll. a) Definiera en funktion som givet en n × m-matris ger paret (n, m) som resultat. (2p) b) Definera en funktion som givet en lista (av typen [[t]]) avgör om den är en n × m-matris. (3p) 3. a) Definiera en algebraisk typ T key info för binära träd med tomma löv och noder som utöver delträd även innehåller par med komponenter av typen key och info. (2p) b) Ett träd av typen T key info är balanserat om det är ett löv eller om det är en nod med balanserade underträd vars antal löv skiljer sig åt med högst 1. Definiera en funktion mkTree :: [(key,info)] -> T key info som givet en lista med par ger som resultat ett balanserat träd innehållande listans element. (3p) Det kan vara lämpligt att först definiera en funktion som delar upp en icketom lista i ett element och två dellistor vars längder skiljer sig åt med högst 1. Du får använda funktioner ur andra uppgifter även om du inte lyckats definiera dem. (Obs! Paren i träden behöver inte vara ordnade på något sätt.) 4. Stora tal (5p) Ett sätt att implementera godtyckligt stora naturliga tal (dvs positiva heltal) är att använda heltalslistor vars element utgörs av de enskilda siffrorna i de stora talen. Talet 1 392 715 900 000 (Sveriges statsskuld vid tusenårsskiftet i kronor räknat) representeras då av listan [1,3,9,2,7,1,5,9,0,0,0,0,0]. Definiera en funktion add :: [Int] -> [Int] -> [Int] som adderar två stora tal givna som listor. Ex: add [1,7,0,6,0] [3,5,6,7] ska bli [2,0,6,2,7] :: [Int]. 5. Träd (5p) Ett binärt träd är balanserat om det är ett löv, eller om skillnaden i djup mellan vänster och höger delträd i en nod är högst 1 och båda delträden är balanserade. Definiera en typ för binära träd med heltal i noder och löv och en funktion som avgör om ett sådant träd är balanserat. Med ett träds djup menas antalet noder den längsta vägen från roten ut till ett löv innehåller. Ett träd som endast består av ett löv har djupet 0. 6. Ett polynom med en variabel, tex 2.5x3 − 3.0x2 + 42.0 är entydigt bestämt av koefficienterna framför de olika x–potenserna. Polynomet ovan bestäms av att koefficienterna i tur och ordning är 2.5, −3.0, 0.0 och 42.0. För att representera ett polynom i ML deklarerar vi en datatyp POLYNOM så här: data POLYNOM = Polynom [Int] a) Deklarera en funktion value at som tar ett polynom och ett x-värde, och ger som svar polynomets värde i den punkten. (4p) 4 2 b) Deklarera ett värde p som representerar polynomet x + x + 1. (0.5p) c) Använd på lämpligt sätt value at för att beräkna p:s värde i punkten 1.0. Det räcker med att skriva ner hur du skulle applicera funktionen på argumentet/en. (0,5p) 7. Skriv en funktion suffixlist som givet en lista l ger som resultat en lista med alla icke-tomma dellistor som avslutar l. Exempel: suffixlist [4,1,3] ger resultatet [[4,1,3],[1,3],[3]]:int list list suffixlist ["s","t","o","r"] ger resultatet [["s","t","o","r"], ["t","o","r"], ["o","r"], ["r"]]:string list list suffixlist nil ger avbruten evaluering (med abortwith) och en felutskrift, eftersom en tom lista inte innehåller någon (avslutande) icke-tom dellista. Namnet på funktionen kommer från att en avslutande dellista kallas för suffix. (5p) 8. Multiplicera mera (5p) 4:ans multiplikationstabell ser ut så här: 1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16 5 * 4 = 20 6 * 4 = 24 7 * 4 = 28 8 * 4 = 32 9 * 4 = 36 10 * 4 = 40 Vi representerar denna tabell med den 10 heltal långa listan [4,8,12,16,20,24,28,32,36,40]. På motsvarande vis representerar vi andra multiplikationstabeller. Skriv en funktion multitab :: Int -> Int -> [[Int]] som givet två heltal x och y ger som resultat listan med multiplikationstabeller från x:ans till y:ans. Exempel: multitab 4 6 ska bli [ [4,8,12,16,20,24,28,32,36,40], [5,10,15,20,25,30,35,40,45,50], [6,12,18,24,30,36,42,48,54,60] ]. 9. Delsumma (5p) Skriv en funktion f som givet ett heltal x och en lista l med heltal avgör om det finns någon delmängd av element ur l vars summa är x. Den tomma delmängden har summan 0. Exempel: f 3 [7,6,12,4,-9,8] ska vara True ty vi har exempelvis 3 = 12 + (−9). f 10 [7,-1,0,13] ska (liksom f 10 []) vara False ty det finns ingen delmängd av element ur listan vars summa blir precis 10.