Het Miller-Urey experiment is een beroemd geworden experiment dat in 1952 aan de Universiteit van Chicago werd uitgevoerd door Stanley Miller en Harold Urey. In het experiment werd een mengsel van methaan, ammoniak, waterdamp en diwaterstof verwarmd en blootgesteld aan elektrische ladingen. De samenstelling van het mengsel werd gekozen op grond van wat men op dat moment aannam over de atmosfeer van voor er leven was op de jonge Aarde. De elektrische ladingen moesten de bliksem simuleren.
Na een week continu te hebben gedraaid met hun opstelling vonden Miller en Urey dat 10% tot 15% van de koolstof in het systeem zich nu in organische verbindingen bevond. Twee procent had aminozuren gevormd, waaronder 13 van de 20 die tegenwoordig door levende cellen gebruikt worden. Het aminozuur dat het meest voorkwam was glycine. Er werden ook suikers en lipiden gevormd. De bouwstenen van DNA en RNA (nucleotiden) ontbraken echter in zijn geheel. Simpele versies van nucleotiden zoals nucleosiden (nucleotiden zonder de fosfaatgroep) werden ook niet gevonden. Het experiment wordt door sommigen gezien als aanwijzing van hoe het leven op Aarde uit anorganische stoffen — de zogenaamde oersoep — is ontstaan. Een proces dat abiogenese genoemd wordt.
In deze opgave stellen we een molecule of een mengsel voor als een dictionary, waarvan de sleutels gevormd worden door de symbolische namen van de atomen die erin voorkomen en de corresponderende waarden aangeven hoeveel atomen erin voorkomen. Gevraagd wordt:
Schrijf een functie abiogenese waaraan een molecule en een mengsel als argument moeten doorgegeven worden. De functie moet een Booleaanse waarde teruggeven die aangeeft of het molecule al dan niet kan gevormd worden met de atomen die voorkomen in het mengsel. Het molecule kan gevormd worden, als alle atomen van het molecule in voldoende mate in het mengsel aanwezig zijn.
Schrijf een functie leesMoleculen waaraan de locatie van een tekstbestand moet doorgegeven worden. Elke regel van dit bestand bevat de naam van een molecule, gevolgd door een beschrijving van de atomaire samenstelling van de molecule. Deze omschrijving bestaat uit een oplijsting van de symbolische namen van de atomen, telkens gevolgd door het aantal van dat type atomen dat in het molecule voorkomt. Alle velden worden hierbij van elkaar gescheiden door één of meer spaties. De functie moet een dictionary als resultaat teruggeven. De sleutels van deze dictionary worden gevormd door de namen van de moleculen die in het bestand voorkomen. Elke naam van een molecule wordt afgebeeld op een dictionary die de atomaire samenstelling van het molecule beschrijft.
Schrijf een functie experiment1 waaraan twee dictionaries als argument moeten doorgegeven worden. De eerste dictionary bevat de samenstelling van een aantal moleculen die men op basis van het experiment wil verkrijgen, en heeft hetzelfde formaat als de dictionary die door de functie leesMoleculen wordt teruggegeven. De tweede dictionary beschrijft het mengsel dat bij het experiment gebruikt wordt. De functie moet als resultaat een alfabetisch gerangschikte lijst met de namen van alle moleculen uit de eerste dictionary teruggeven die aan de hand van het gegeven mengsel kunnen gevormd worden. Let wel, elke molecule moet hierbij afzonderlijk behandeld worden: er moet niet nagegaan worden of er voldoende atomen beschikbaar zijn om een reeks moleculen te maken.
Schrijf een functie experiment2 waaraan dezelfde twee dictionaries als argument moeten doorgegeven worden als bij de functie experiment1. De functie moet een Booleaanse waarde teruggeven die aangeeft of er voldoende atomen in het mengsel aanwezig zijn om van alle moleculen die in het eerste dictionary-argument vervat zitten telkens één molecule te maken.
Bij onderstaande voorbeeldsessie gaan we ervan uit dat het tekstbestand moleculen.txt1 zich in de huidige directory bevindt.
>>> oersoep = {'N':2, 'Na':2, 'O':5, 'H':4}
>>> abiogenese({'Si': 1, 'O': 2}, oersoep)
False
>>> abiogenese({'H': 3, 'N': 1}, oersoep)
True
>>> moleculen = leesMoleculen('moleculen.txt')
>>> moleculen['zand']
{'Si': 1, 'O': 2}
>>> moleculen['ammoniak']
{'H': 3, 'N': 1}
>>> experiment1(moleculen, oersoep)
['ammoniak', 'natronloog']
>>> moleculen1 = {'ammoniak': {'H': 3, 'N': 1}, 'natronloog': {'Na': 1, 'O': 1, 'H': 1}}
>>> experiment2(moleculen1, oersoep)
True
>>> moleculen2 = {'zand': {'Si': 1, 'O': 2}, 'ammoniak': {'H': 3, 'N': 1}}
>>> experiment2(moleculen2, oersoep)
False