Modelleren en Programmeren

Vergelijkbare documenten
Inleiding Logica 2013

Modelleren en programmeren. Week 9: werken met incomplete datastructuren

Uitwerkingen Rekenen met cijfers en letters

Datastructuren Uitwerking jan

Tweede college algoritmiek. 12 februari Grafen en bomen

Wouter Geraedts Processen & Processoren

Logisch programmeren 2012

2 REKENEN MET BREUKEN Optellen van breuken Aftrekken van breuken Vermenigvuldigen van breuken Delen van breuken 13

1 Rekenen in eindige precisie

Inleiding Programmeren 2

1 Rekenen met gehele getallen

1.1 Rekenen met letters [1]

1. Optellen en aftrekken

Examen Datastructuren en Algoritmen II

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Opdracht 1 Topics on Parsing and Formal Languages - fall 2010

Getaltheorie groep 3: Primitieve wortels

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/

Reken zeker: leerlijn kommagetallen

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

Inleiding Programmeren 2

2 Recurrente betrekkingen

VBA voor Doe het Zelvers deel 20

Modelleren en Programmeren

Rekenen met cijfers en letters

Werkboekje

Algoritmiek. 15 februari Grafen en bomen

ANTWOORDEN blz. 1. d = 1013; = ; = ; =

Datastructuren Uitwerking jan

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017

Het Breukenboekje. Alles over breuken

Opdracht 1 Topics on Parsing and Formal Languages - fall 2010

start -> id (k (f c s) (g s c)) -> k (f c s) (g s c) -> f c s -> s c

Achtste college algoritmiek. 12 april Verdeel en Heers. Dynamisch Programmeren

Uitgebreide uitwerking Tentamen Complexiteit, mei 2007

2.0 Voorkennis. Rekenregels machten: 5) a 0 = 1. p p q p q a p q q. p q pq p p p. Willem-Jan van der Zanden

Lab Webdesign: Javascript 3 maart 2008

Hoofdstuk 3. Equivalentierelaties. 3.1 Modulo Rekenen

Oplossing van opgave 6 en van de kerstbonusopgave.

8.1 Herleiden [1] Herleiden bij vermenigvuldigen: -5 3a 6b 8c = -720abc 1) Vermenigvuldigen cijfers (let op teken) 2) Letters op alfabetische volgorde

Aanvullende tekst bij hoofdstuk 1

Datastructuren: stapels, rijen en binaire bomen

Programmeren A. Genetisch Programma voor het Partitie Probleem. begeleiding:

Practicum Programmeerprincipes

3.1 Haakjes wegwerken [1]

II.3 Equivalentierelaties en quotiënten

Memoriseren: Een getal is deelbaar door 10 als het laatste cijfer een 0 is. Of: Een getal is deelbaar door 10 als het eindigt op 0.

Zevende college Algoritmiek. 6 april Verdeel en Heers

Combinatoriek groep 1

10 Meer over functies

OPLOSSINGEN VAN DE OEFENINGEN

Recursion. Introductie 37. Leerkern 37. Terugkoppeling 40. Uitwerking van de opgaven 40

ALGORITMIEK: antwoorden werkcollege 5

Reken zeker: leerlijn kommagetallen

Deeltoets Digitale technieken

6.1 Kwadraten [1] HERHALING: Volgorde bij berekeningen:

Discrete Wiskunde, College 12. Han Hoogeveen, Utrecht University

8.1 Herleiden [1] Herleiden bij vermenigvuldigen: -5 3a 6b 8c = -720abc 1) Vermenigvuldigen cijfers (let op teken) 2) Letters op alfabetische volgorde

Examencursus. wiskunde A. Rekenregels voor vereenvoudigen. Voorbereidende opgaven VWO kan niet korter

Examen Datastructuren en Algoritmen II

Info-books. Toegepaste Informatica. Deel 20 : Algoritmen en programmeren in Access en Excel (Basis) AL20. Jos Gils Erik Goossens

1.3 Rekenen met pijlen

8.0 Voorkennis ,93 NIEUW

4.1 Negatieve getallen vermenigvuldigen [1]

Bij het cijferend optellen beginnen we bij de eenheden en werken we van rechts naar links:

Modelleren en Programmeren: Prolog

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

Modelleren en Programmeren

Hoofdstuk 5: Functies voor getallen en teksten

5.0 Voorkennis. Rekenen met machten: Let op het teken van de uitkomst; Zet de letters (indien nodig) op alfabetische volgorde.

1. REGELS VAN DEELBAARHEID.

round up or round down 2 je maakt een getal kleiner door een getal van een ander af te halen, je mag ook numeral figure, number

recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber

Zevende college algoritmiek. 23/24 maart Verdeel en Heers

Uitwerking Puzzel 93-1, Doelloos

b) Teken op de bijlage welke lampjes van het klokje branden om 19:45:52. Schrijf eronder hoe je dit bepaald/berekend hebt. (3p)

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

3.2 Basiskennis De getallenlijn Symbolen, tekens en getallen. 92 Algebra. Inhoofdstuk1zijnaandeordegeweest: Het=teken. =staat.

6.1 Kwadraten [1] HERHALING: Volgorde bij berekeningen:

Zevende college algoritmiek. 24 maart Verdeel en Heers

Tweede college complexiteit. 12 februari Wiskundige achtergrond

Recursie: definitie. De som van de kwadraten van de getallen tussen m en n kan als volgt gedefinieerd worden:

Start u met zwiso in verschillende leerjaren tegelijkertijd?

5.4.2 a. Neen: dit lukt alléén met 1, 3, 7 enzovoort. b. Ja: dit lukt met elk aantal knopen! Bijvoorbeeld de volgende boom: 1

RSA. F.A. Grootjen. 8 maart 2002

Kennismaking met programmeren

Examen Datastructuren en Algoritmen II

1 Inleiding in Functioneel Programmeren

Discrete Structuren. Piter Dykstra Sietse Achterop Opleidingsinstituut Informatica en Cognitie

Practicumopgave 3: SAT-solver

Combinatorische Algoritmen: Binary Decision Diagrams, Deel III

3.1 Negatieve getallen vermenigvuldigen [1]

Kernbegrippen Handig met getallen 1, onderdeel Bewerkingen

Proeftentamen in1211 Computersystemen I (NB de onderstreepte opgaven zijn geschikt voor de tussentoets)

Overzicht. Inleiding. Toepassingen. Verwante problemen. Modellering. Exacte oplosmethode: B&B. Insertie heuristieken. Local Search

Uitgebreide uitwerking Tentamen Complexiteit, juni 2018

Transcriptie:

Modelleren en Programmeren Deeltoets 2. Proefopgaven Het tentamen bestaat uit tien vragen, elk goed voor drie punten. minimaal 16.5 uit 30 punten haalt. Je bent geslaagd als je Opgave 1 Neem de volgende queries over, en geef aan hoe Prolog erop reageert.?- X = mia, X = Vincent.?- X = mia, X = vincent.?- k(s(g),y) = k(x,t(k)).?- k(s(g),t(k)) = k(x,t(y)).?- [X []] = [a].?- [X,[]] = [a,[] []]. Opgave 2 Hier de definitie van optellen voor natuurlijke getallen in successornotatie. add(0,x,x). add(s(x),y,s(z)) :- add(x,y,z).... 1

Opgave 3 Hieronder de definitie van een predicaat times/3 waarmee je vermenigvuldigen modelleert als herhaald optellen. times_acc(x,y,z) :- times(x,y,0,z). % wrapper times(s(x),y,a,z) :- add(y,a,a1), times(x,y,a1,z). times(0,_,a,a). Definieer nu modulo/3 als herhaald aftrekken. De relatie modulo(x,y,z) drukt uit dat Z de rest is van delen van X door Y. Je definitie heeft een grensgeval en een recursief geval. - Het grensgeval wordt bereikt als X kleiner is dan de deler Y. In dat geval is X zelf de gezochte rest. - Het recursieve geval formuleert modulo rekenen als herhaald aftrekken. Denk erom dat de deler groter moet zijn dan nul. Voorbeeld:?-modulo(s(s(s(0))),s(s(0)),Z). Antwoord: Z = s(0). 2

Opgave 4 Hieronder een programma len/2 om de lengte van een lijst uit te rekenen. len([],0). len([_ T],N) :- len(t,m),n is M+1. De definitie is links-recursief. Geef een betere definitie met behulp van een predicaat len/3 dat van een accumulator gebruik maakt: len(lijst,acc,lengte) slaagt als Lengte de lengte is van Lijst uitgerekend met behulp van Acc als accumulator. len/3 loopt van links naar rechts door de invoerlijst, en hoogt de accumulator bij elke stap op. Als het eind van de invoerlijst is bereikt, is de gezochte lengte gelijk aan de waarde van de accumulator. Geef een wrapper, die de goede startwaarde voor de accumulator invult voor de?? hieronder. Definieer dan het recursieve en het grensgeval voor len/3. len(lijst,lengte) :- len(lijst,??,lengte). Opgave 5 Het ingebouwde predicaat select/3 werkt als volgt: select(e,lijst,rest) slaagt als Rest de lijst is die overblijft als je een voorkomen van element E uit Lijst verwijdert, en faalt als E niet in Lijst voorkomt. Bijvoorbeeld:?- select(a,[b,a,c,a],l). L = [b, c, a] ; L = [b, a, c] ; false. Definieer select/3. Je definitie heeft een basisgeval, en een recursief geval. Je mag geen hulppredicaten gebruiken. 3

Opgave 6 We kunnen een getal in binaire notatie in Prolog representeren als een niet lege lijst van 0-en en 1-en. 0 10 wordt dan [0], 5 10 wordt [1,0,1], enzovoort. Definieer een predicaat bitnot/2 waarmee je een dergelijke lijst omzet in zijn bitsgewijze complement: 0 wordt 1 en omgekeerd. Bijvoorbeeld:?- bitnot([1,0,0,1],l). L = [0,1,1,0]. Opgave 7 Om een decimaal getal n 10 om te rekenen naar m 2 in binaire notatie is er het volgende eenvoudige algoritme. Deel n door twee: de rest is de laatste bit van m; voor de voorlaatste bit herhaal je met het naar beneden afgeronde resultaat van n/2; ga zo door tot het resultaat van verder delen nul wordt. Schrijf een Prolog programma dec2bin/2: dec2bin(dec,bin) zet decimaal getal Dec om in binair Bin, gerepresenteerd als lijst. Werk voor decimale invoer groter dan nul met een accumulator. Hieronder alvast het grensgeval, en de wrapper die dec2bin/3 aanroept met [] als beginwaarde voor de accumulator. Je kan de ingebouwde rekenpredicaten gebruiken: N//M voor delen afgerond op gehele getallen, en N mod M voor modulo rekenen. Hieronder een illustratie van de werking van die rekenpredicaten. dec2bin(0,[0]). dec2bin(n,bin) :- N>0, dec2bin(n,[],bin).?- X is 5//2.?- X is 5 mod 2. X = 2. X = 1. 4

Opgave 8 Een binaire boom is leeg, of hij bestaat uit een wortelknoop met een linker en een rechter dochterboom, waarbij die dochters zelf binaire bomen zijn. De lege boom representeren we in Prolog als [], een niet-lege boom als een term t(links,knoop,rechts). We noemen een binaire boom welgebalanceerd als voor elke knoop geldt dat het aantal knopen in zijn linker en rechter dochterboom op zijn hoogst met één verschillen. Hieronder de vier mogelijkheden om een welgebalanceerde boom met vier knopen te maken. Definieer een predicaat balans/2 waarmee je de welgebalanceerde binaire bomen genereert. balans(n,boom) slaagt als Boom een welgebalanceerde boom is met N knopen. Het aantal knopen druk je uit als een natuurlijk getal in successornotatie. De aanroep die de vier bomen van het plaatje hierboven genereert ziet er als volgt uit.?- balans(s(s(s(s(0)))),boom). Boom = t(t(t([], _, []), _, []), _, t([], _, [])) ; Boom = t(t([], _, t([], _, [])), _, t([], _, [])) ; Boom = t(t([], _, []), _, t(t([], _, []), _, [])) ; Boom = t(t([], _, []), _, t([], _, t([], _, []))) ; false. Het basisgeval voor balans/2 is eenvoudig: de lege boom is de enige welgebalanceerde boom met nul knopen. Voor het recursieve geval heb je een knoop nodig voor de wortel. Er blijft een even of oneven aantal knopen over die je dan over de linker en rechter dochters van de wortel 5

kan verdelen. Zoals bij de opgave over modulo rekenen is add/3 het enige hulppredicaat dat je mag gebruiken. Opgave 9 Een postorder traversal van een binaire boom bezoekt de knopen van de linker en rechter deelboom in postorder volgorde, gevolgd door de wortelknoop. Bijvoorbeeld: a b c d e?-b = t(t(_,a,_),b,t(t(_,c,_),d,t(_,e,_))), postorder(b,lijst). Lijst = [a,c,e,d,b]. Hieronder een naieve definitie van postorder/2 die gebruik maakt van append/3. postorder(t(l,x,r),knopen):- postorder(l,linkerknopen), postorder(r,rechterknopen), append(rechterknopen,[x],rechts), append(linkerknopen,rechts,knopen). postorder([],[]). Werk de append/3 aanroepen weg door gebruik te maken van verschillijsten. De wrapper: postorder(boom,knopen) :- postorder(boom,knopen,[]). 6

Opgave 10 Het ingebouwde findall/3 gebruik je om alle oplossingen voor een vraag in een lijst te verzamelen: findall(object,goal,list) slaagt als List de lijst van objecten Object is die voldoen aan Goal. Bijvoorbeeld:?- findall(prefix,append(prefix,_,[a,b,c,d]),lijst). Lijst = [[], [a], [a, b], [a, b, c], [a, b, c, d]]. Hieronder de definitie van shuffle/3 voor het in elkaar voegen van twee lijsten. shuffle([],[],[]). shuffle([h R],S,[H T]) :- shuffle(r,s,t). shuffle(r,[h S],[H T]) :- shuffle(r,s,t). Laten we een verzameling representeren als een lijst zonder herhalingen. Gebruik findall/3 en shuffle/3 om een definitie te geven van powerset/2: powerset(set,subsets) slaagt als Subsets de lijst van deelverzamelingen is van de verzameling Set. Bijvoorbeeld:?- powerset([1,2,3],l). L = [[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], []]. 7