trekslijnen van een vlak V, vlak V als vlak-rechts moeten
hebben. Is dit niet het geval, dan is dit te verhelpen door
voor alle omtrekslijnen vlak-links met vlak-rechts te ver
wisselen, met gelijktijdige verwisseling van beginpunt en
eindpunt [1, pag. 11].
Bij backtracking hebben we gezien, dat de omtrekslijnen
van een vlak met behulp van de relatie alleOmtrekslijnen
kunnen worden opgezocht en vervolgens worden opge
borgen in een lijst.
Een „lijst" is een basisstructuur in PROLOG. Een lijst
kan men opgebouwd denken uit een kop en een staart.
Met de kop wordt het eerste element van de lijst bedoeld;
met de staart alle overige elementen van de lijst. De nota
tie hiervoor is:
Kop Staart
Bijvoorbeeld toegepast op de omtrekslijnen van vlak v1:
In PROLOG: |?- alleOmtrekslijnen v1, K S
Antwoord: K Ii06
S Ii01, Ii04, N07
Zoals hiervoor is aangegeven, zal van iedere omtrekslijn
in een lijst moeten worden bekeken of deze omtrekslijn
wel rechtsom gericht is. Het één voor één aflopen van alle
elementen in een lijst wordt in PROLOG gerealiseerd
door een relatie te definiëren, die gebruik maakt van de
recursietechniek. Deze relatie heeft de predikaatnaam
richtvlak en luidt als volgt:
richtvlak Vlak, Kop Staart :-
draai Vlak, Kop
richtvlak Vlak, Staart
We zien dat in de relatie richtvlak een conditie met be
trekking tot de kop is opgenomen (draai: nog nader te om
schrijven) en een conditie met betrekking tot de staart: de
recursieve aanroep van richtvlak in een eenvoudiger ver
sie. Deze recursieve aanroep dient te worden beëindigd
als alle elementen van de lijst zijn bekeken, dat wil zeg
gen als de lijst leeg is. De aanduiding voor een lege lijst
is De volgende regel voor richtvlak geeft de stop
conditie: richtvlak Vlak,
Ter herinnering: het is de bedoeling van richtvlak om te
controleren of alle omtrekslijnen van een vlak rechtsom
liggen vastgelegd. Deze controle wordt gerealiseerd met
behulp van een relatie draai, die uit twee regels bestaat.
De eerste regel heeft betrekking op de situatie dat een
omtrekslijn reeds rechtsom is vastgelegd:
draai Vlak, Lijn :-
lijn Lijn,Vlak,
Of in woorden: Als een lijn Lijn als vlak-rechts Vlak heeft,
dan is draai Vlak, Lijn) een feit. Dit zal niet altijd het ge
val zijn. Vandaar de tweede regel als aanvulling op de
eerste regel:
draai Vlak, Lijn :-
lijn Lijn, BP, EP, Vlak, V, L
assert lijn Lijn, EP, BP, V, Vlak, L
retract lijn Lijn, BP, EP, Vlak, V, L
De aanvulling voorziet in het geval dat Vlak vlak-links is:
in dat geval verwisselen we beginpunt (BP) met eindpunt
(EP) en vlak-links (Vlak) met vlak-rechts (V), bergen dit op
in de database met behulp van het assert-predikaat, en
verwijderen de linksom georiënteerde vastlegging van
Lijn met behulp van het retract-predikaat.
Functionele programmeertalen
De nog niet-ingewijde lezer zal binnenkort met een andere
groep programmeertalen worden geconfronteerd, namelijk met
die van de functionele programmeertalen.
Functionele talen zijn een deelverzameling van declaratieve ta
len. PROLOG als declaratieve taal behoort niet tot de functio
nele talen, maar bezit wel zekere functionele kenmerken.
De aanduiding „functioneel" is terug te leiden tot het mathe
matische functiebegrip. In die zin opgevat, legt een functie een
verband tussen domein en bereik, net als de inverse functie het
verband legt tussen bereik en domein. Bij een functionele taal
is er maar één expressie die de relatie tussen domein en be
reik, en vice versa, dus beide, weergeeft.
Een voorbeeld van een dergelijke expressie in PROLOG is de
concat-relatie. Met één en dezelfde expressie kan men zowel
lijsten samenvoegen als opdelen!
Bijvoorbeeld:
concat [1,2], [3], L
geeft: L [1,2,3],
maar: concat [1,2], SL, [1,2,3]).
geeft: SL [3j.
Bovendien: concat SL1, SL2, [1,2,3]).
levert: SL1
SL2 [1,2,3]
SL1 [1]
SL2 [2,3]
SL1 [1,2]
SL2 [3]
SL1 [1,2,3]
SL2
Door backtracking worden alle sublijsten gegenereerd. Een
(voor de hand liggend) voordeel van een functionele taal is het
gebruik van minder programmeerregels, zodat de kans op pro
grammeerfouten naar evenredigheid afneemt.
Van de andere kant vraagt een functionele taal meer van een
programmeur, omdat basismechanismen van procedurele ta
len, zoals loops, niet werken (denk aan het tweerichting-aspect
van een functionele expressie). Voorlopig is de status van func
tionele talen, zoals ML, Hope en Miranda, nog zeer acade
misch, maar binnenkort zullen de eerste generaties studenten
niet anders meer voorgeschoteld krijgen („om hun Turbo-
Pascal te doen vergeten").
Bron: Fixing the Function [8].
Bijvoorbeeld: in de database ligt de lijn Ii01 linksom ten
opzichte van vlak v1 opgeslagen (zie figuur en tabellen).
Nu willen we alle omtrekslijnen van vlak v1 rechtsom op
slaan, als volgt:
In PROLOG: |?- alleOmtrekslijnen v1, Lijst
richtvlak v1, Lijst
Controle: ?- lijn M01, BP, EP, VL, VR,
Antwoord: BP p7
EP p5
VL v2
VR v1
We zien dat de richting van Ii01 is veranderd en dat de
aangrenzende vlakken zijn verwisseld.
We zijn nu op het punt aangekomen, dat we alle om
trekslijnen van een vlak rechtsom in onze database kun
nen opbergen. De volgende stap is om alle omtrekslijnen
op elkaar te laten aansluiten. Twee omtrekslijnen sluiten
op elkaar aan als het eindpunt van de ene lijn het begin
punt is van de andere lijn. Deze ordeningsrelatie geven
we de predikaatnaam volgtop:
volgtop Lijn 1Lijn2 :-
lijn Lijnl, EP
lijn Lijn2, BP,
EP BP.
NGT GEODESIA 89 - 7/8
361