Naufraghi nella Rete

... Pagina in costruzione ...

Macchina di Turing in Python

Ho implementato una semplice macchina di Turing in Python (un potente linguaggio OO interpretato multipiattaforma con una sintassi chiarissima).
L'ho fatto per imparare ad usare le classi in python, ho creato una classe:
class LogicUnit:
    "Unita' logica della macchina di Turing"
    def __init__(self, matrice):
        self.InfoMatriceFunzionale = matrice[0]
        self.MatriceFunzionale = matrice[1]
    def valuta(self, (esterno, interno)):
        """
        Cerca sulla tabella i tre valori di uscita corrispondenti ai due di ingresso
        Rende NULL se il il valore non viene trovato
        """
        return self.MatriceFunzionale.get((str(esterno), str(interno)))
A questa classe fornisco una "matrice funzionale", cioè una tabella tipo battaglia navale dove sui due assi ci sono tutte le possibili combinazioni di coppie di valori ("Dato letto dal nastro", "Dato presente nel registro interno"), ed a ogni coppia è associata una tripla ("Dato da scrivere sul nastro", "Iscruzioni di spostamento", "Dato da scrivere nel registro interno").
Poi ho creato la classe MacchinaDiTuring come estensione della classe LogicUnit:

class MacchinaDiTuring(LogicUnit):
    "Implementazione in python della Macchina di Turing"
    def __init__(self, matrice, NastroOriginale, PosizioneIniziale, ValoreIniziale):
        #Per inizializzare la classe generatrice devo riferirmi direttamente
        #al metodo __init__
        LogicUnit.__init__(self, matrice)
        self.NastroOriginale, self.nastro = NastroOriginale, NastroOriginale
        self.PosizioneIniziale, self.posizione = PosizioneIniziale, PosizioneIniziale
        self.ValoreIniziale, self.valore = ValoreIniziale, ValoreIniziale
        self.passo = 0

A questa classe passo in NastroOriginale, e lo salvo in due proprietà, una che tiene quello Originale, ed una che tiene quello via via modificato, e faccio una cosa analoga per la Posizione e per il Valore.
Poi aggiungo un metodo che avanza di un passo:

    def Passo(self):
        "Va avanti di un ciclo"
        self.passo = self.passo + 1
        if(self.valore != '!'):
        #Se non ho finito...
            #Legge il valore presente sul nastro alla posizione corrente,
            #se l'indice e' esterno all'array rende ' '
            try:
                esterno = self.nastro[self.posizione]
            except:
                esterno = ' '
            interno = self.valore
            risposta = self.valuta((esterno, interno))
            #Scrive il valore di ritorno sul nastro alla posizione corrente,
            #se l'indice e' esterno all'array aggiunge ' '
            if self.posizione < 0:
                #inserisce in testa e riporta il carrello a 0 (cioe' su quello che ho
                #appena inserito
                self.nastro.insert(0, risposta[0])
                self.posizione = 0
            else:
                try:
                    #cerco di modificare il valore
                    self.nastro[self.posizione] = risposta[0]
                except:
                    #se non ci riesco allora aggiungo in coda
                    self.nastro.append(risposta[0])
            #Aggiorna la posizione sul nastro
            self.posizione = self.posizione + int(risposta[1])
            self.valore = risposta[2]
            return 1 #c'e' ancora da fare
        else:
            return 0 #ho finito

La parte logica è finita, ora se volete fare qualche prova potete scaricare i sorgenti del programma turing.py ed ovviamente l'interprete per questo file, ci sono i binari di Python al sito ufficiale www.python.org, oppure i binari ActiveState, cioè ActivePython che comprendono anche una comoda interfaccia per windows.

Links

Ultima modifica 29/01/2004
Per ogni suggerimento/errore contattatemi liberamente: Matteo Bertini

Creative Commons License
This work is licensed under a Creative Commons License.
Commenti

Rick -- 2003-10-23 17:31:47
Salve, mi chiamo Rick E mi sto addentrando in Python, la Macchina di Turing mi ha incuriosito e trovare questo connubio, mi ha fatto molto piacere. Col tempo, mi leggero il tuo codice, per il momento grazie. R B K R N @ L I B E R O . I T Rick

DIO -- 2005-03-14 09:02:04
salve a tutti!!!

sceva -- 2008-05-07 21:31:23
ma che codice è questo fa proprio cagar.....??????????

Picchio -- 2010-06-11 12:33:40
ahaha! Grandissimo Teo! =)

giovannone coscialunga -- 2006-11-17 19:43:40
matteo ti prego rifai la macchina di turing in modo migliore

Badussi -- 2006-03-11 19:46:58
il tuo codice fa cacaaaaaaaaaaaaa!!!!!!!

Matteo -- 2006-05-04 09:08:19
E lo so! Ma mi fa fatica rifallo! ... via, programmavo in Python da due mesi!
Nota: I link esterni sono in corsivo e aprono una nuova pagina.


Naufraghi nella rete - PHP - Informatica - Linux - Blog - Appartamento a Firenze - Gruppo di discussione