28 augustus 2003

advertisement
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
Download