I?-
Backtracking in PROLOG
I ?- c
Complexe vragen in PROLOG
Door de opdracht te herhalen, zoals hierboven, wordt de
complete oplossingsverzameling gevonden. Overigens
kan één opdracht betrekking hebben op een zeer groot
PROLOG-programma.
Met behulp van de in de database opgeslagen feiten zijn
(nieuwe) regels te definiëren, die relaties tussen die feiten
beschrijven. Eén zo'n relatie is die van omtrekslijn, dat wil
zeggen een lijn die behoort tot de omtrek van een vlak.
In PROLOG luidt zo'n definitie:
omtrekslijn L, VL lijn L, VL,
omtrekslijn L, VR lijn L, VR,
In woorden (hierbij lezen we van rechts naar links):
Indien een lijn L als vlak-links VL heeft (premisse), kun
nen we concluderen dat L een omtrekslijn is van VL (eer
ste regel)
of:
Indien een lijn L als vlak-rechts VR heeft (premisse), kun
nen we concluderen dat L een omtrekslijn is van VR
(tweede regel).
Met deze definitie kunnen de volgende vragen worden
beantwoord:
Vraag: Is Ii02 een omtrekslijn van v2?
In PROLOG: |?- omtrekslijn Ii02, v2
Antwoord: yes
Vraag: Is Ii05 een omtrekslijn van v4?
In PROLOG: |?- omtrekslijn M05, v4
Antwoord: no
Vraag: Ligt punt p8 op de omtrek van vlak v4?
In PROLOG: |?- omtrekspunt p8, v4
Antwoord: yes
Vraag: Ligt punt p3 op de omtrek van vlak v1?
In PROLOG: |?- omtrekspunt p3, v1
Antwoord: no
Vraag: Welke vlakken hebben punt p5 op hun omtrek?
In PROLOG: |?- omtrekspunt p5, Vlak
Antwoord: Vlak v1
Vlak v2
Vlak v4
no
Vraag: Welke punten heeft vlak v4 als omtrek?
In PROLOG:
Antwoord: P
P8
P
P2
P
P1
P
P5
no
Bij raadpleging van de database wordt in PROLOG altijd
nagegaan of meerdere antwoorden op de vraagstelling
van toepassing zijn (backtracking) Hierboven zijn reeds
enige voorbeelden gegeven. De raadpleger van de data
base kan ook van tevoren opgeven dat hij alle antwoor
den tegelijkertijd wil weten. Dit gebeurt door een nieuwe
regel alleOmtrekslijnen te definiëren en hierbij gebruik
te maken van het zogenoemde systeem predikaat
„findall".
Bijvoorbeeld:
alleOmtrekslijnen Vlak, Lijst:-
findall L, omtrekslijn L, Vlak), Lijst
Vraag: Welk vlak heeft Ii10 als omtrek?
In PROLOG: |?- omtrekslijn li 10, Vlak
Antwoord: Vlak v3
Vlak v4
no
Vraag: Wat is de omtrek van v1?
In PROLOG:
Antwoord: L
N06
L
IÏ01
L
Ii04
L
M07
no
Een andere relatie is die van omtrekspunt, dat wil zeg
gen een punt dat ligt op de omtrek van een vlak.
In PROLOG definiëren we twee regels:
omtrekspunt
BP, VL :-
lijn BP, VI
omtrekspunt
EP, VR :-
lijn EP, VR,
Of in woorden: Van een (willekeurige) lijn ligt het punt BP
op de omtrek van vlak VL (eerste regel); dit geldt even
eens voor het punt EP met betrekking tot het vlak VR
(tweede regel).
Evenals bij de relatie omtrekslijn kunnen bij de relatie
omtrekspunt dezelfde vragen worden gesteld:
NGT GEODESIA 89 - 7/8
Of in woorden: Zoek alle findall) omtrekslijnen L op van
Vlak en berg die op in Lijst.
Vraag: Wat zijn de omtrekslijnen van vlak v1?
In PROLOG: |?- alleOmtrekslijnen v1, Lijst
Antwoord: Lijst Ii06, Ii01, Ii04, Ii07
In het reeds aangehaalde artikel van Van der Schans [1]
komt ook de vraag voor: welke zijn de grenslijnen tussen
bos en weide?
Met het volgende PROLOG-programma kan deze com
plexe vraag (gemakkelijk) worden beantwoord.
Eerste moeten we via de vlakkentabel informatie krijgen
over de cultuur (vlaklabel) van een vlak in relatie tot een
lijn. Daartoe worden de nieuwe regels cultuurLinks en
cultuurRechts gedefinieerd:
cultuurLinks Cultuur, Lijn :-
lijn Lijn, VL,
vlak VL, Cultuur
cultuurRechts Cultuur, Lijn :-
lijn Lijn, VR,
vlak VR, Cultuur
Of in woorden: Als vlak VL met label Cultuur vlak-links is
van de lijn Lijn, dan is Cultuur de cultuur-links van Lijn
(eerste regel).
359