|
dModLogKursets hjemmesideEndelige automaterJeg har strikket en lille makropakke kaldet finite.mp (faktisk er det bare filnavnet, men af mangel på bedre...) sammen. Du kan se eksempler på anvendelse nedenfor:
Når du MetaPost'er en fil, bør du gøre det med kommandoen mpost -tex=latex filnavn.mp, da der ellers vil være problemer med labels. Brug ikke xdvi til at se dit foreløbige resultat; xdvi er elendig til at vise eps-filer. Lav i stedet en .tex-fil hvori du inkluderer grafikken, og når du vil se om diagrammet bliver som ønsket køres så mpost -tex=latex filnavn.mp ; dvips filnavn.dvi. Bemærk at filerne ikke er inkluderet i dvi-filen (hvilket er en af grundene til at man ikke skal bruge xdvi), men først inkluderes når der dvips'es. Derfor er det ikke nødvendigt at LaTeX'e sin .tex-fil hver gang, da der jo allerede i dvi-filen står at den skal læse filerne filnavn.1, filnavn.2 osv. Der mangler megen funktionalitet og customisabilitet i pakken endnu. Hvis du har specifikke ønsker til ændrede features kan du sende en mail. Bemærk at pakken er garanteret bug-fyldt; fx vil nogle af makroernes algoritmer gå helt amok hvis to cirkler skærer hinanden på en uheldig måde. AfleveringerMine afleveringer ligger her ikke for at blive skrevet af, men fordi de skal tjene som eksempler på anvendelse af ovenstående.
Universel Turing-maskine i bashSkæbnen ville åbenbart, at jeg aldrig skulle få mig et liv. Jeg har derfor skrevet en universel Turing-maskine i bash. Jeg tror nok de primære grunde var følgende: Jeg kunne, jeg ville gerne lave noget selv som kunne teste korrektheden af min konstruktion fra aflevering 4, og så ville jeg gerne skrive noget som kunne vise en Turing-maskine på arbejde. Der findes ganske vist udmærkede færdiglavede tingester frit tilgængeligt fra det vide væv, men dels findes der jo en hob af (beregningsmæssigt ækvivalente) definitioner af hvad en Turing-maskine er, og en lige så stor hob af tilhørende universelle Turing-maskiner, så jeg ville skrive noget fra bunden som stemmer overens med Kozens definition; ie. den definition der bruges i dModLog F03. Valget faldt på bash fordi jeg ikke kan "programmere" i andet. Maskinen består af et script kaldet turing. Programmet skal have tre, evt. fire, argumenter; syntaksen for brugen er derfor turing maskine input output [-verbose]. maskine er en fil der indeholder en beskrivelse af transitionsfunktionen. Hvis ð(q,s) = (p,t,d) (hvor q er den tilstand maskinen befinder sig i, s er det symbol der læses, p er den tilstand der skal skiftes til, t er det symbol der skal skrives, og d er enten L eller R), skal filen maskine indeholde en linje der er en mellemrumssepareret liste q s p t ±1 (+1 svarer til R, -1 svarer til L); antallet af mellemrum er underordnet så længe der er mindst ét. input er navnet på en én-linjes inputfil, hvor det der skal stå på båndet til at starte med skal læses fra. Programmet turing læser kun den første linje af filen (jeg bruger head -n 1 $input). output er en fil som turing har lov at skrive forskelligt output til; det bliver en 3-linjers fil bestående af 1) båndets indhold ved terminering 2) navnet på tilstanden som maskinen sluttede i 3) det totale antal iterationer udført af turing. -verbose kan man skrive hvis man har lyst til at se Turing-maskinen på arbejde; det viser løbende indholdet af båndet, navnet på den aktuelle tilstand samt en markør ^ der viser hvor på båndet man er. turing forudsætter følgende:
Filen GCD ovenfor er en næsten tro implementation af min besvarelse af afleveringsopgave 4. Dog er der følgende forskelle:
Euklids algoritme kører ca. i logaritmisk tid; dvs. gcd(m,n) udregnes i O(log(max(m,n))); se fx Algebra 1-noterne af Niels Lauritzen for et hint til hvordan det kan vises. Nu er én instruktion for en Turing-maskine jo ikke det samme som vi normalt mener med en instruktion/operation; bare en simpel addition eller subtraktion kræver i hvert fald lineær tid (ie. Plus(m,n) regnes normalt for én operation; dvs. konstant tid; mens additionen af de to tal på en Turing-maskine jo i hvert fald kræver at man løber mindst én gang henover båndet (alt afhængig af kodningen af heltal)). Hvis man prøver at køre GCD-interaktiv og giver fx tallene 19 og 14 som input kan man se hvor lang tid det egentlig tager. Jeg har opbygget følgende tabel over det gennemløbne antal iterationer (empiriske, ekstrapolerede data!):
Jeg kan ikke lige finde nogen generel formel for antallet af iterationer ved input (m,n)... |