Intermezzo Muteren van de databases Recursie in PROLOG Dit is een voorbeeld van hoe een conclusie wordt getrok ken uit twee premissen (ook te zien als voorwaarden). Een overeenkomstige definitie geldt voor de cultuur rechts van een lijn. Vraag: welke cultuur bevindt zich links, respectievelijk rechts van de lijn Ii02? In PROLOG: |?- cultuurLinks Cultuur, Ii02 Antwoord: Cultuur bos In PROLOG: |?- cultuurRechts Cultuur, Ii02 Antwoord: Cultuur weide Met een tweede regel cultuurGrens combineren we de cultuur links en rechts van een lijn: In de definitie van cultuurGrens hebben we rekening ge houden met de willekeurige richting van een lijn. Vandaar de tweede regel in de definitie. Vraag: Welke culturen grenzen aan de lijn Ii01? In PROLOG: |?- cultuurGrens C1, C2, Ii01 Antwoord: C1 akker C2 weide Maar ook: C1 weide C2 akker Het tweede antwoord is natuurlijk zeer „logisch" en wordt gevonden door backtracking. Vraag: Wat is een grenslijn tussen „weide" en „bos"? In PROLOG: |?- cultuurGrens weide, bos, Lijn Antwoord: Lijn N02 Eveneens: ?- cultuurGrens bos, weide, Lijn Antwoord: Lijn Ii02 Tenslotte kunnen met het findall-predikaat alle cultuur grenzen worden gevonden: alleCultuurgrenzen C1, C2, Lijst:- findall X, cultuurGrens C1, C2, X), Lijst Vraag: vind alle grenslijnen tussen „weide" en „woest" In PROLOG: |?- alleCultuurgrenzen weide, woest, Lijst Antwoord: Lijst Ii08, Ii05, Ii03 Eveneens: ?- alleCultuurgrenzen woest, weide, Lijst Antwoord: Lijst N05, Ii03, Ii08 (dezelfde oplossingsverzameling, maar de volgorde is anders). Zoals uit de voorbeelden blijkt, is het met PROLOG mo gelijk om uit een relationeel gestructureerd database, met behulp van eenvoudige definities, complexe vragen te beantwoorden. Of dit bij grote databases ook snel ge beurt, is een ander verhaal. Eerlijk gezegd is dit op dit moment nog niet het geval; er wordt wel hard gewerkt om de efficiëntie van PROLOG-compilers te verbeteren. Het belang van PROLOG ligt in de introductie van de for mele logica bij relationele databases. Een van de tekort komingen van het relationele model is de mogelijkheid om onzinnige vragen te stellen, zoals „geef alle werkne mers waarvan de leeftijd groter is dan het huisnummer van het woonadres" [4]. Dit komt omdat uit een relatione le database haast alle betekenis (semantiek) is verdwe nen. PROLOG brengt deze semantiek weer terug: door de redeneerregels komt men vanuit ware premissen altijd tot een ware conclusie. De eerste commerciële program mapakketten, die een koppeling tussen een relationele database en PROLOG tot stand brengen, zijn dan ook al verschenen [5]. In het hiervoorgaande zijn enige voorbeelden gegeven over de wijze waarop de database wordt geraadpleegd. Het is echter noodzakelijk deze te wijzigen indien muta ties in de topografie optreden. Mutaties kunnen eenvou dig of complex van aard zijn. Een eenvoudige mutatie is bijvoorbeeld de verandering van de hoedanigheid (label) van een lijn of vlak: „boom" wordt „paal", „heg" wordt „raster", enz. Een complexe mutatie is het verwijderen van lijnen of het opdelen van vlakken. In PROLOG worden feiten respectievelijk toegevoegd en verwijderd met de systeempredikaten assert en retract. De volgende regel verandert de hoedanigheid (label) van een punt: muteerlabelpunt P, Loud, Lnieuw :- punt P, X, Y, Loud assert punt P, X, Y, Lnieuw retract punt P, X, Y, Loud Voorbeeld: verander van punt p4 het label „boom" in „buis". In PROLOG: ?- muteerlabelpunt p4, boom, buis Antwoord: yes Controle: |?- labelpunt p4, L Antwoord: L buis Bij een nogal complexe mutatie als het verdelen van een vlak in twee vlakken moet een ordening van de omtrekslij- nen plaatsvinden. Om de integriteit van de database te handhaven, dient na afloop van een dergelijke mutatie namelijk de juiste topologische relatie van elke lijn aan wezig te zijn. De ordeningsoperatie van omtrekslijnen, die hierna zal worden gepresenteerd, maakt gebruik van een in PRO LOG veel voorkomende techniek, namelijk die van recur- sie. Recursie is een simpel concept, maar lang niet eenvou dig toe te passen! Met recursie kunnen we hetzelfde be reiken als met een while-loop in een taal als PASCAL: ook een recursieve formulering behoeft een stopconditie. Een klassiek voorbeeld van recursie is de berekening van de faculteit van een getal n. Recursief wordt dit gedefinieerd met n! n*(n-1)l Een recursieve is altijd geformuleerd in een eenvoudiger versie van zichzelf. De stopconditie, die de definitie van n! behoeft, is de formulering van 0!namelijk 01 1. Bij het ordenen van de omtrekslijnen van een vlak zullen we gebruik maken van de recursietechniek. Om de om trekslijnen van een vlak in de juiste volgorde te krijgen, moeten we eerst alle omtrekslijnen in één richting vast leggen, bijvoorbeeld rechtsom. Dit betekent, dat de om- cultuurGrens Cultl, Cult2, Lijn :- cultuurLinks Cultl, Lijn cultuurRechts Cult2, Lijn cultuurGrens Cultl, Cult2, Lijn :- cultuurLinks Cult2, Lijn cultuurRechts Cultl, Lijn 360 NGT GEODESIA 89 - 7/8

Digitale Tijdschriftenarchief Stichting De Hollandse Cirkel en Geo Informatie Nederland

(NGT) Geodesia | 1989 | | pagina 24