Eerste herkansingstentamen ‘Structuren van de Informatica’ 28 augustus 2003 Vraag 1 Neem aan dat ⊕ staat voor het exclusieve of, ⊥ voor het falsum (de bewering die altijd onwaar is) en > voor het verum (de bewering die altijd waar is). Ga na hoe je de volgende formules zou kunnen vereenvoudigen (op de plaats van de puntjes moet je dus een eenvoudiger formule neerzetten): 1. p ⊕ ⊥ ≡ . . . 2. p ⊕ p ≡ . . . 3. p ∧ ⊥ ≡ . . . 4. p ∧ p ≡ . . . 5. p ∧ > ≡ . . . Vraag 2 Zijn de volgende beweringen waar of onwaar? In het laatste geval: geef een tegenvoorbeeld: 1. Voor elke verzameling A geldt dat A ∩ {∅} = ∅. 2. Voor elke deelverzameling X van A geldt dat X ∩ (A − X) 6= X. 3. Als A ⊇ B en f : A → B is injectief, dan is A = B. 4. Elke asymmetrische relatie R ⊆ A2 is bevat in een reflexieve, antisymmetrische relatie. Vraag 3 Beschouw de volgende Hugs sessie (prime is een implementatie van de priemgetaltest, primes is de lijst van priemgetallen): TUOLP> filter prime [ p^3 + 3 | p <- primes ] [11 Dit suggereert dat 11 het enige priemgetal is van de vorm p3 +3, met p ook een priemgetal. Kun je bewijzen dat er geen andere priemgetallen van die vorm zijn? Met andere woorden: laat zien dat 2 het enige priemgetal p is met de eigenschap dat p3 + 3 priem is. Vraag 4 Laat A en B verzamelingen zijn met |A| = m en |B| = n. 1. Hoeveel injecties f : A → B zijn er als m > n? 2. Hoeveel injecties f : A → B zijn er als m = n? 1 Vraag 5 Bewijs: als R een symmetrische en transitieve relatie is op A, en er is voor elke x ∈ A een y ∈ A met xRy, dan is R een equivalentie op A. Vraag 6 Smullyan’s balletjes-spel is een spelletje voor één persoon. In de versie die wij beschouwen begin je met een bak met één balletje erin, met een nummer n erop, en gaan de zetten als volgt: (i) neem een balletje met een nummer k > 1 uit de bak, en vervang het door drie balletjes met nummer k − 1, (ii) het spelletje is afgelopen als alle balletjes in de bak nummer 1 hebben. Als we de balletjes-bak representeren als een lijst van type [Int], en afspreken dat we steeds het eerste getal groter dan 1 vervangen, dan kunnen we dit als volgt implementeren: ballgame :: [Int] -> [[Int]] ballgame xs | all (==1) xs = [xs] | otherwise = xs : ballgame (reduce xs) where reduce (1 : ys) = 1 : reduce ys reduce (n : ys) = (n-1) : (n-1) : (n-1) : ys Beantwoord de volgende vragen: 1. Hoeveel enen bevat de laatste lijst van getallen in de uitvoer van ballgame [1]? De laatste lijst van getallen in de uitvoer van ballgame [2]? De laatste lijst van getallen in de uitvoer van ballgame [3]? De laatste lijst van getallen in de uitvoer van ballgame [4]? 2. Nu algemeen: hoeveel enen bevat de laatste lijst van getallen in de uitvoer van ballgame [n]? Geef een formule in de variabele n, en bewijs die formule met inductie. 3. Geef een schatting van hoe lang het duurt voor de aanroep ballgame [8] termineert. Seconden? Minuten? Uren? Dagen? Motiveer je antwoord. Vraag 7 Beschouw de volgende code: bittest bittest bittest bittest bittest bittest :: [Int] [] [0] (1:xs) (0:1:xs) _ -> Bool = True = True = bittest xs = bittest xs = False 2 1. Noem een lijst van nullen en enen een bitlijst. Hoeveel bitlijsten van lengte 0 voldoen aan bittest? Hoeveel bitlijsten van lengte 1 voldoen aan bittest? Hoeveel bitlijsten van lengte 2 voldoen aan bittest? Hoeveel bitlijsten van lengte 3 voldoen aan bittest? 2. bittest selecteert de bitlijsten die geen opeenvolgende nullen bevatten. Laat a n het aantal bitlijsten zijn van lengte n zonder opeenvolgende nullen. Laat met een inductiebewijs zien dat voor elke n ≥ 0 geldt dat an = Fn+2 , waarbij Fn het n-de Fibonacci getal is. Let op: je hebt twee basisgevallen nodig (n = 0, n = 1), en een inductiehypothese van de vorm: “stel dat de formule geldt voor n en voor n + 1”. Nog een aanwijzing: de code voor bittest wijst de weg naar de oplossing. Vraag 8 Binaire bomen met informatie op de interne knopen kunnen in Haskell worden gedeclareerd met het volgende datatype: data Tr a = Nil | T a (Tr a) (Tr a) deriving (Eq,Show) Een geordende boom is een boom met de informatie zo aan de knopen dat de items van links naar rechts in de boom groter worden. Zoeken in geordende binaire bomen kan alleen efficient gebeuren als die bomen in balans zijn: de linkertak en de rechtertak moeten even diep zijn en allebei zelf in balans. Geef code buildTree :: [a] -> Tr a die een geordende lijst omzet in een geordende binaire boom die in balans is. Je kunt de volgende hulpfunctie gebruiken voor het splitsen van een niet-lege lijst in twee (ongeveer) even lange delen: split :: [a] -> ([a],a,[a]) split xs = (ys1,y,ys2) where ys1 = take n xs (y:ys2) = drop n xs n = length xs ‘div‘ 2 De aanroep split [1,2,3,4,5] geeft bij voorbeeld het resultaat ([1,2],3,[4,5]). Puntentelling: Alle vragen maximaal 10 punten. Bonus voor trouwe klanten op werkcollege en practicum: 20 punten. Dit geeft samen maximaal 100 punten. Eindcijfer: aantal behaalde punten plus eventuele bonus, gedeeld door 10. 3