Om historisch inzicht te krijgen in de geologische gebeurtenissen die een bepaalde regio gevormd hebben tot wat ze nu is, moeten geologen kunnen achterhalen in welke volgorde de gesteenten uit die regio gevormd werden. Helaas is het meestal enkel mogelijk om de leeftijdsrelatie tussen soorten gesteenten te bepalen op plaatsen waar ze met elkaar in contact komen. De leeftijdsrelatie op dergelijke contactpunten kan voor een bepaalde regio schematisch voorgesteld worden op een zogenaamde lithologische kaart. Onderstaande afbeelding toont een voorbeeld van een dergelijke kaart, waarbij gebieden met eenzelfde lythogisch type — zeg maar waarin hetzelfde soort gesteente aangetroffen wordt — eenzelfde label krijgen. In dit voorbeeld zijn de lythologische types aangeduid met de letters A tot en met L (uitgezonderd de letter I). Pijlen duiden op contactpunten waar de relatieve leeftijd van aangrenzende soorten gesteenten bepaald werd. De pijlen wijzen van oudere naar jongere soorten gesteenten. Voor het gebied dat in het grijs werd aangeduid op de lithologische kaart, kan bijvoorbeeld afgeleid worden dat het lithologisch type L ouder is dan de lithologische types A, D en J. Alle leeftijdsrelaties tussen de soorten gesteenten uit een bepaalde regio kunnen op die manier in een lithologische tabel opgelijst worden. Zo bevat onderstaande lithologische tabel alle leeftijdsrelaties uit de corresponderende lithologische kaart.

lithologische kaart
ouder jonger
A E
A J
B G
C B
D A
D E
D F
D J
E J
F A
F E
F H
F J
H A
H E
H J
H K
J C
K J
L A
L D
L J

De uitdaging bestaat er in om op basis van de informatie uit een lithologische tabel te bepalen in welke volgorde de lithologische types gevormd werden. Een dergelijke volgorde die consistent is met de gegevens uit een lithologische tabel wordt een topologische orde genoemd. Het bepalen van alle mogelijke topologische ordes is een complex probleem dat we hier niet als dusdanig gaan aanpakken. Je opdracht bestaat er in om voor een gegeven volgorde te bepalen of het een topologische orde is of niet, rekening houdend met een gegeven lithologische tabel.

Opgave

  1. Schrijf een functie isChronologisch waaraan drie argumenten moeten doorgegeven worden. De eerste twee argumenten zijn lithologische types die worden voorgesteld door één enkele letter. Het derde argument is een string die een gegeven volgorde van lithologische types voorstelt. In deze string staan letters die corresponderen met oudere types voor letters die corresponderen met jongere types. De functie moet de waarde True teruggeven indien het eerste lithologisch type ouder is dan het tweede type of als de twee types hetzelfde zijn, anders moet de waarde False teruggegeven worden. Zorg er voor dat de functie ook de waarde False teruggeeft indien het letterteken dat correspondeert met één van de gegeven lithologische types niet in het derde argument voorkomt.

  2. Gebruik de functie isChronologisch om een functie isTopologischeOrde te schrijven, waaraan twee argumenten moeten doorgegeven worden. Het eerste argument is een string die een gegeven volgorde voorstelt, en die op dezelfde manier moet geïnterpreteerd worden als het argument omschreven bij de functie isChronologisch. Het tweede argument is de locatie van een tekstbestand waarin een topologische tabel is opgenomen. De eerste rij van dit bestand is voorbehouden voor kolomkoppen; de volgende rijen bevatten telkens twee letters, gescheiden door een tab. Zoals in het voorbeeld hierboven staat de eerste kolom voor het oudere lithologische type en de tweede kolom voor het jongere type. De functie moet de waarde True terug geven indien de gegeven volgorde een topologische orde is, die dus consistent is met alle paarsgewijze leeftijdsrelaties van gesteenten zoals omschreven in de rijen van het opgegeven bestand. Anders moet de waarde False teruggegeven worden.

Voorbeeld

In volgend voorbeeld wordt het bestand topologischeorde1.txt1 gebruikt.

>>> isChronologisch('A', 'B', 'ACEGHLDBFJK')
True
>>> isChronologisch('B', 'A', 'ACEGHLDBFJK')
False
>>> isTopologischeOrde('KLGHABECFJD', 'topologischeorde1.txt')
False
>>> isTopologischeOrde('LDFHAEKJCBG', 'topologischeorde1.txt')
True