Modelleren en Programmeren Jeroen Bransen en Michael Moortgat 29 januari 2014 Overzicht Java Imperatief programmeren I Von Neumann (1950): computer = geheugen + processor Imperatief programmeren I Von Neumann (1950): computer = geheugen + processor I Opdracht: wijzig het geheugen Imperatief programmeren I Von Neumann (1950): computer = geheugen + processor I Opdracht: wijzig het geheugen I Programma: reeks van opdrachten, worden 1 voor 1 door processor uitgevoerd Programma en geheugen Opdrachten veranderen Variabelen zijn gegroepeerd in zijn gegroepeerd in Methoden bewerken Objecten zijn gegroepeerd in hebben als type Klasse Minimum en maximum voorbeeld class MinMax2 { public static void main(String[] args) { int nums[] = { 99, -10, 100123, 18, -978, 5623, 463, -9, 287, 49 }; int min, max; min = max = nums[0]; for(int i = 1; i < 10; i++) { if(nums[i] < min) min = nums[i]; if(nums[i] > max) max = nums[i]; } System.out.println("Min and max: " + min + " " + max); } } Fibonacci public class Fibonacci { public static void main(String[] args) { // Print het vijfde Fibonaccigetal System.out.println(fib(5)); } public static int fib(int n) { // Basisgeval if(n <= 1) return 1; // Reken getal uit op basis van andere waarden return fib(n-1) + fib(n-2); } } Imperatieve programmeertalen Behalve Java zijn er nog vele imperatieve programmeertalen, elk met sterke en zwakke punten. I C en C++: low-level, kan hele efficiente code opleveren Imperatieve programmeertalen Behalve Java zijn er nog vele imperatieve programmeertalen, elk met sterke en zwakke punten. I C en C++: low-level, kan hele efficiente code opleveren I C#: lijkt sterk op Java, van Microsoft Imperatieve programmeertalen Behalve Java zijn er nog vele imperatieve programmeertalen, elk met sterke en zwakke punten. I C en C++: low-level, kan hele efficiente code opleveren I C#: lijkt sterk op Java, van Microsoft I Python: scriptingtaal Imperatieve programmeertalen Behalve Java zijn er nog vele imperatieve programmeertalen, elk met sterke en zwakke punten. I C en C++: low-level, kan hele efficiente code opleveren I C#: lijkt sterk op Java, van Microsoft I Python: scriptingtaal I ... Prolog: tijdslijn I 1972 — Colmerauer/Roussel: eerste interpreter Prolog: tijdslijn I 1972 — Colmerauer/Roussel: eerste interpreter I 1977 — Warren: DEC10 compiler Prolog: tijdslijn I 1972 — Colmerauer/Roussel: eerste interpreter I 1977 — Warren: DEC10 compiler I 1980 — Pereira/Warren: Definitie Clause Grammars Prolog: tijdslijn I 1972 — Colmerauer/Roussel: eerste interpreter I 1977 — Warren: DEC10 compiler I 1980 — Pereira/Warren: Definitie Clause Grammars I 1980/90 — bloei, Europa, Japan Prolog: tijdslijn I 1972 — Colmerauer/Roussel: eerste interpreter I 1977 — Warren: DEC10 compiler I 1980 — Pereira/Warren: Definitie Clause Grammars I 1980/90 — bloei, Europa, Japan I nu — NASA ISS natural language interface, delen van IBM Watson QA, . . . Prolog essentials I Programma = beschrijving situatie m.b.v. feiten, regels Prolog essentials I Programma = beschrijving situatie m.b.v. feiten, regels I Query: bevragen van programma Prolog essentials I Programma = beschrijving situatie m.b.v. feiten, regels I Query: bevragen van programma Prolog: I Prolog essentials I Programma = beschrijving situatie m.b.v. feiten, regels I Query: bevragen van programma Prolog: I I zoekt instanties van query die logisch volgen uit programma Prolog essentials I Programma = beschrijving situatie m.b.v. feiten, regels I Query: bevragen van programma Prolog: I I I zoekt instanties van query die logisch volgen uit programma geeft die instanties als antwoorden terug Prolog essentials I Programma = beschrijving situatie m.b.v. feiten, regels I Query: bevragen van programma Prolog: I I I I zoekt instanties van query die logisch volgen uit programma geeft die instanties als antwoorden terug Zoeken van bewijzen/afleidingen: Prolog essentials I Programma = beschrijving situatie m.b.v. feiten, regels I Query: bevragen van programma Prolog: I I I I zoekt instanties van query die logisch volgen uit programma geeft die instanties als antwoorden terug Zoeken van bewijzen/afleidingen: I resolutie Prolog essentials I Programma = beschrijving situatie m.b.v. feiten, regels I Query: bevragen van programma Prolog: I I I I zoekt instanties van query die logisch volgen uit programma geeft die instanties als antwoorden terug Zoeken van bewijzen/afleidingen: I I resolutie unificatie Resolutie, unificatie, zoekboom ?-k(Y). Y=X ?- f(X), g(X), h(X). X=a f(a). f(b). g(a). g(b). h(b). k(X):- f(X), g(X), h(X). X=b ?-g(a),h(a). ?- g(b), h(b). ?-h(a). ?-h(b) † ?- k(Y). Logische programmeertalen Prolog maakt onderdeel uit van een landschap van talen, elk met hun eigen accent. I Datalog: logica voor deductive databases Logische programmeertalen Prolog maakt onderdeel uit van een landschap van talen, elk met hun eigen accent. I Datalog: logica voor deductive databases I Constraint Logic Programming: propagatie van constraints Logische programmeertalen Prolog maakt onderdeel uit van een landschap van talen, elk met hun eigen accent. I Datalog: logica voor deductive databases I Constraint Logic Programming: propagatie van constraints I Inductive Logic Programming: logica + machine learning Logische programmeertalen Prolog maakt onderdeel uit van een landschap van talen, elk met hun eigen accent. I Datalog: logica voor deductive databases I Constraint Logic Programming: propagatie van constraints I Inductive Logic Programming: logica + machine learning I ... Vergelijking paradigma’s Declaratief — Imperatief Declaratief: programmeren is redeneren I procedurele details zo mogelijk onder de zoekmotorkap Declaratief — Imperatief Declaratief: programmeren is redeneren I procedurele details zo mogelijk onder de zoekmotorkap I redeneren met incomplete informatie: unificatie vs recursie Declaratief — Imperatief Declaratief: programmeren is redeneren I procedurele details zo mogelijk onder de zoekmotorkap I redeneren met incomplete informatie: unificatie vs recursie I controle via metaprogrammeren: programma als data Declaratief — Imperatief Declaratief: programmeren is redeneren I procedurele details zo mogelijk onder de zoekmotorkap I redeneren met incomplete informatie: unificatie vs recursie I controle via metaprogrammeren: programma als data Declaratief — Imperatief Declaratief: programmeren is redeneren I procedurele details zo mogelijk onder de zoekmotorkap I redeneren met incomplete informatie: unificatie vs recursie I controle via metaprogrammeren: programma als data Imperatief: I Precieze controle over executie Declaratief — Imperatief Declaratief: programmeren is redeneren I procedurele details zo mogelijk onder de zoekmotorkap I redeneren met incomplete informatie: unificatie vs recursie I controle via metaprogrammeren: programma als data Imperatief: I Precieze controle over executie I Voorspelbaar gedrag van code Declaratief — Imperatief Declaratief: programmeren is redeneren I procedurele details zo mogelijk onder de zoekmotorkap I redeneren met incomplete informatie: unificatie vs recursie I controle via metaprogrammeren: programma als data Imperatief: I Precieze controle over executie I Voorspelbaar gedrag van code I Abstraheren over vaak voorkomende patronen met objecten en functies Overeenkomsten I Modelleren Overeenkomsten I Modelleren I Op grote schaal gebruikt Overeenkomsten I Modelleren I Op grote schaal gebruikt I Bevatten bibliotheek met standaard-code Overeenkomsten I Modelleren I Op grote schaal gebruikt I Bevatten bibliotheek met standaard-code I Beide Turing-compleet Wanneer welk paradigma? I Controle over de procedures: Java Wanneer welk paradigma? I Controle over de procedures: Java I Bewijzen zoeken in predicatencalculus: Prolog Wanneer welk paradigma? I Controle over de procedures: Java I Bewijzen zoeken in predicatencalculus: Prolog I Conclusie: wees meertalig! Vervolg Java Datastructuren I Direct vervolg op Java-deel van dit vak Datastructuren I Direct vervolg op Java-deel van dit vak I Nadenken over efficientie van code Datastructuren I Direct vervolg op Java-deel van dit vak I Nadenken over efficientie van code I “Slimme” implementaties van bijvoorbeeld Set Inleiding Adaptieve Systemen I Systemen die interacteren met hun omgeving Inleiding Adaptieve Systemen I Systemen die interacteren met hun omgeving I Zelflerende systemen Inleiding Adaptieve Systemen I Systemen die interacteren met hun omgeving I Zelflerende systemen I Deel Java, deel Netlogo Modelleren en Systeemontwikkeling I Standaard geen onderdeel KI Modelleren en Systeemontwikkeling I Standaard geen onderdeel KI I Ontwerpen object georiënteerde systemen Modelleren en Systeemontwikkeling I Standaard geen onderdeel KI I Ontwerpen object georiënteerde systemen I Alles wat er aan bod komt bij maken van software behalve programmeren Prolog Inleiding taalkunde Grammatica’s in Prolog: DCG, Definitie Clause Grammars. I Rijtjes en afleidingsbomen: s(Boom,Rijtje) Inleiding taalkunde Grammatica’s in Prolog: DCG, Definitie Clause Grammars. I Rijtjes en afleidingsbomen: s(Boom,Rijtje) I Syntaxis en semantiek: s(Syn,Sem) Inleiding taalkunde Grammatica’s in Prolog: DCG, Definitie Clause Grammars. I Rijtjes en afleidingsbomen: s(Boom,Rijtje) I Syntaxis en semantiek: s(Syn,Sem) I Automatisch vertalen: source(Sem,NL), target(Sem,IT) Inleiding taalkunde Grammatica’s in Prolog: DCG, Definitie Clause Grammars. I Rijtjes en afleidingsbomen: s(Boom,Rijtje) I Syntaxis en semantiek: s(Syn,Sem) I Automatisch vertalen: source(Sem,NL), target(Sem,IT) I Parseren: bottom up, top down, . . . Logische grammatica’s I grammar = logic, parsing = deduction Logische grammatica’s I grammar = logic, parsing = deduction I leren uit “big data”: inductie van grammatica uit treebanks Intelligente systemen I programmeren van agents Intelligente systemen I programmeren van agents I exploreren, en waarnemen in game omgeving Intelligente systemen I programmeren van agents I exploreren, en waarnemen in game omgeving I logica voor planning en actieselectie Overig Functioneel Programmeren I Nog een ander paradigma Functioneel Programmeren I Nog een ander paradigma I Functionele programmeertaal Haskell Functioneel Programmeren I Nog een ander paradigma I Functionele programmeertaal Haskell I Sterk typesysteem