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

Digitale Tijdschriftenarchief Stichting De Hollandse Cirkel en Geo Informatie Nederland

(NGT) Geodesia | 1989 | | pagina 25