Logisch Programmeren/Prolog 2007-8 Jori Mur Rijksuniversiteit Groningen j.mur@rug.nl
1 Overzicht Huishoudelijk Logisch programmeren Prolog als kennisbank Prolog syntax Matching Zoeken Praktisch: laden/listen/tracen
2 Logisch Programmeren/Prolog (5 ECTS) Docenten: Jori Mur (HC), Mendel van t Riet (Pract). Wanneer/waar: 2e helft 1e semester. Hoorcollege ma 9-11 H13.309. Practicum do 13-17, Unixzaal letteren (Hagen-account nodig). Boek: Learn Prolog Now! Blackburn, Bos & Striegnitz. Eisen: 5x/6 huiswerk inleveren, eindopdracht, tentamen. Homepage: www.let.rug.nl/ mur/prolog0708
3 Prolog Prolog werd ontwikkeld begin jaren 70 in Marseille. De syntaxis en semantiek van Prolog is sterk gebaseerd op de predikatenlogica. P if Q and R Om P op te lossen, los Q en R op. Procedureel/imperatief: programma is lijst instructies. Uitvoeren is het volgen van de instructies, één voor één. Declaratief: programma is een beschrijving van een stand van zaken. In Prolog is het uitvoeren van een programma het proberen af te leiden van feiten uit deze beschrijving.
4 Kennisbank Simpel Prolog-programma bevat alleen eenvoudige feiten: taal(nederlands). taal(duits). Deze kennisbank laat zich bevragen in een interactive Prolog-sessie, m.b.v. queries. De query?- p. betekent: kan je bewijzen dat p het geval is??- taal(nederlands). yes
5?- taal(engels). no Dus: we kunnen uit de huidige kennisbank bewijzen dat Nederlands een taal is, maar niet dat Engels een taal is.
6 Kennisbank II Een regel p :- q zegt: p is het geval als ik q kan bewijzen. taal(nederlands):- germaanse_taal(nederlands). taal(duits):- germaanse_taal(duits). germaanse_taal(nederlands) :- west_germaanse_taal(nederlands). germaanse_taal(duits) :- west_germaanse_taal(duits). west_germaanse_taal(nederlands). west_germaanse_taal(duits).
7 Variabelen We kunnen een argument in een Prolog term vullen met een variabele. Bijv. in een query:?- taal(x). X = nederlands? Prolog geeft nu niet alleen aan of het afgeleid kan worden, maar ook wat de instantiaties van evt. variabelen zijn.
8 Variabelen II Bovendien kan je Prolog naar meer antwoorden laten zoeken. D.w.z. je vraagt: is er nog een manier om dit te bewijzen??- taal(x). X = nederlands? ; X = duits yes
9 Variabelen III In regels/feiten kan je natuurlijk ook variabelen hebben, die daarmee opgaan voor alles wat je maar voor die variabele in kan vullen. taal(x):- germaanse_taal(x). germaanse_taal(y) :- west_germaanse_taal(y). west_germaanse_taal(nederlands). west_germaanse_taal(duits).
10 Nog een voorbeeld Zowel queries als de rechterkant van regels kunnen uit meer dan een term bestaan. Prolog moet ze dan allemaal bewijzen: levende_taal(x) :- taal(x), heeft_sprekers(x). taal(latijn). taal(nederlands). heeft_sprekers(nederlands).
11 Volgorde... Zolang we kijken naar Prolog als Logisch Programmeren, maakt volgorde van clauses in de kennisbank, of van goals in een clause niet uit. Immers: clauses zijn manieren om iets te bewijzen/dingen die we kunnen bewijzen. Als we A kunnen bewijzen en B, dan kunnen we ook B en A bewijzen. Net zo: een lijst goals moeten allemaal bewezen worden. Bewijs A,B betekent dus bewijs A B. Dat is hetzelfde als B A
12 Prolog Syntax en meer atom: begint met een kleine letter en is een aaneengesloten reeks letters, cijfers en. Of staat tussen.... Of is een reeks speciale characters zoals + :- etc. complexe term: van de vorm functor(argument 1... argument n ), waarbij functor een atom is, en de argumenten zijn terms. term: een atom, een getal, een variabele of een complexe term. variabele: begint met een hoofdletter of een. De scope van een variabele is de clause: twee variabelen in dezelfde clause met dezelfde naam zijn dezelfde variabele, m.u.v..
13 clause: een term met als functor :-/2. Het eerste argument noemen we de head het tweede argument goal(s). De goals zijn de heads van andere clauses. Heads/Goals mogen geen clauses zijn. programma: een verzameling clauses.
14 Meer Prolog syntax Er zijn 3 verschillende clauses, die we allemaal al gezien hebben: feiten: clauses met head en zonder goal (om de head te bewijzen hoeven we niets meer te doen). regels: clauses met head en goal (om head te bewijzen moeten we goal bewijzen). en eigenlijk ook: queries: clauses zonder head, maar met goal (we moeten hoedanook de goals bewijzen).
15 Matching 1. als term1 en term2 constanten zijn matchen ze als en alleen als het dezelfde constanten zijn. 2. als een van de twee een variabele is, matchen de termen altijd. De variabele krijgt de waarde van de andere term. 3. complexe termen term1 en term2 matchen als en alleen als: (a) ze dezelfde functor en hetzelfde aantal argumenten hebben (b) het n-de argument uit term1 matched met het n-de uit term2. 4. anders is er geen sprake van matching.
16 Matching voorbeelden?- bla = blo.?- bla(blo) = X.?- bla(blo,x) = bla(x,y).?- X = Y.?- bla(x) = X.
17 Zoekbomen Prolog gebruikt matching om te iets proberen te bewijzen. Het executiemodel is grofweg als volgt:
18 Als we niks (meer) te bewijzen hebben, zeg yes. Als we p1..pn te bewijzen hebben, probeer dan p1 te matchen met het head van een clause in de kennisbank. Lukt? Pak de eerste clause waarbij dat lukt en vervang p1 door de goals. Begin bovenaan. Lukt niet? Ga naar het laatste punt waar je een goal met een head gematched hebt en waar er andere match-mogelijkheden waren. Lukt? Pak de eerste van deze mogelijkheden. Vervang het oude goal door de nieuwe. Begin bovenaan. Lukt niet? Zeg no.
19 Zoekbomen, voorbeeld levende_taal(x) :- taal(x), heeft_sprekers(x). taal(latijn). taal(nederlands). heeft_sprekers(nederlands).
20 Volgorde... Vanwege het executiemodel: depth-first, links-naar-rechts/boven-naar-onder maakt de volgorde wel uit. De oplossing wordt bijvoorbeeld eerder gevonden als je de goals in levende taal/1 omdraait: levende_taal(x) :- heeft_sprekers(x), taal(x). taal(latijn). taal(nederlands). heeft_sprekers(nederlands).
21 Praktisch In de directory programma.pl: sicstus laden: [programma]. listing: listing. paniekknop: Ctrl-C platte zoekboom : trace. notrace. halt.