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