Προσομοίωση μη ντετερμινιστικού αυτομάτου
Αν έχουμε ένα μη ντετερμινιστικό αυτόματο και θέλουμε να βρούμε αν αποδέχεται μια δεδομένη λέξη, μπορούμε να το μετατρέψουμε σε ντετερμινιστικό, μπορούμε να δοκιμάσουμε κάπως ή μπορούμε να χρησιμοποιήσουμε έναν αλγόριθμο που προσομοιώνει τη λειτουργία του NFA.
Η αρχή του αλγορίθμου
Την αρχή θα τη δούμε σε ένα κατάλληλο παράδειγμα. Έστω αυτό το αυτόματο:
Πρόκειται για ένα μη ντετερμινιστικό πεπερασμένο αυτόματο, που αποδέχεται κάποια γλώσσα. Προς το παρόν δεν μας ενδιαφέρει ποια. Θα δούμε πώς μπορεί να γίνει ο υπολογισμός ενός τέτοιου αυτομάτου για τη λέξη εισόδου 11001. Η ιδέα είναι να επεξεργαζόμαστε ένα σύμβολο της λέξης και να βλέπουμε σε ποιες καταστάσεις μπορούμε να πάμε χάρη στις πολλαπλές μεταβάσεις για το ίδιο σύμβολο. Θυμόμαστε όλες αυτές τις καταστάσεις και στο επόμενο βήμα υποθέτουμε ότι βρισκόμαστε «σε όλες αυτές τις καταστάσεις ταυτόχρονα» και μας ενδιαφέρει πού μπορούμε να πάμε από εκεί.
Θα θυμόμαστε λοιπόν το σύνολο των καταστάσεων στις οποίες μπορεί να βρισκόμαστε και το αδιάβαστο μέρος της λέξης. Στην αρχή έχουμε το ζεύγος ⟨{q0}, 11001⟩. Ξεκινάμε από την κατάσταση q0 (αρχική κατάσταση) και η λέξη εισόδου είναι η 11001. Το αυτόματο φαίνεται ως εξής, με κόκκινο χρώμα και έντονα είναι σημειωμένη η κατάσταση στην οποία βρισκόμαστε:
Το πρώτο σύμβολο είναι το 1. Από την κατάσταση q0 υπάρχει μόνο μία μετάβαση για το σύμβολο 1, οπότε πηγαίνουμε στην κατάσταση q1. Θυμόμαστε το ζεύγος ⟨{q1}, 1001⟩. Το αυτόματο φαίνεται ως εξής:
Συνεχίζουμε. Το αδιάβαστο μέρος της λέξης είναι το 1001, οπότε ψάχνουμε πάλι μεταβάσεις για το 1. Τώρα είναι δύο – πίσω στην κατάσταση q0 και στην κατάσταση q3. Εμείς πηγαίνουμε και στις δύο καταστάσεις ταυτόχρονα. Θυμόμαστε λοιπόν το ζεύγος ⟨{q0, q3}, 001⟩.
Ποια είναι η λογική; Ξέρουμε ότι υπάρχει διαδρομή που μας φέρνει από την αρχική κατάσταση με τη λέξη 11 και στην κατάσταση q3 και στην κατάσταση q0. Δεν ξέρουμε ακόμη ποιος κλάδος θα μας χρειαστεί, οπότε απλώς θυμόμαστε και τους δύο. Συνεχίζουμε. Στην είσοδο έχουμε το σύμβολο 0. Τώρα πρέπει να κοιτάξουμε και τις μεταβάσεις από την q0 και τις μεταβάσεις από την q3. Από την κατάσταση q0 οδηγούν μεταβάσεις στις καταστάσεις q1 και q2, από την κατάσταση q3 οδηγεί μετάβαση πίσω στην q1. Προσθέτουμε όλες αυτές τις καταστάσεις και παίρνουμε το ζεύγος ⟨{q1, q2}, 01⟩:
Σε αυτό το βήμα όμως δεν έχουμε τελειώσει ακόμη. Βλέπουμε ότι από την κατάσταση q2 οδηγεί ε-μετάβαση στην κατάσταση q4. Ξέρουμε ότι μια ε-μετάβαση μπορούμε να την κάνουμε «οποιαδήποτε στιγμή», χωρίς να διαβάσουμε επόμενο σύμβολο. Με άλλα λόγια – χωρίς να διαβάσουμε επόμενο σύμβολο της λέξης εισόδου, μπορούμε ακόμη να μετακινηθούμε στην κατάσταση q4. Προσθέτουμε λοιπόν την κατάσταση q4 στις καταστάσεις στις οποίες μπορεί να βρισκόμαστε: ⟨{q1, q2, q4}, 01⟩. Το αυτόματο θα το χρωματίζαμε ως εξής:
Στη συνέχεια η είσοδος είναι το 0. Κοιτάμε πού μπορούμε να μετακινηθούμε από τις τρεις καταστάσεις στις οποίες βρισκόμαστε. Από την q1 δεν μπορούμε να πάμε πουθενά, γιατί λείπει η μετάβαση για το 0. Ο υπολογισμός σε αυτόν τον κλάδο τελειώνει. Από την κατάσταση q4 επίσης δεν πάμε πουθενά. Από την κατάσταση q2 πηγαίνουμε πάλι στην κατάσταση q2. Επειδή όμως από την q2 οδηγεί ε-μετάβαση στην q4, μπορούμε να φτάσουμε και στην q4. Από το σύνολο καταστάσεων {q1, q2, q4} μπορούμε λοιπόν για το σύμβολο 0 να φτάσουμε στο σύνολο καταστάσεων {q2, q4} και παίρνουμε το ζεύγος ⟨{q2, q4}, 1⟩:
Τέλος, στην είσοδο έχουμε το σύμβολο 1. Από την κατάσταση q2 δεν πάμε πουθενά, ο υπολογισμός σε αυτόν τον κλάδο τελειώνει. Από την κατάσταση q4 όμως πηγαίνουμε στις καταστάσεις q3 και q5. Παίρνουμε το ζεύγος ⟨{q3, q5}, ε⟩:
Το αυτόματο διάβασε πλέον ολόκληρη τη λέξη και «βρίσκεται» σε δύο καταστάσεις: q3, q5. Επειδή τουλάχιστον μία από αυτές είναι τελική κατάσταση, το αυτόματο αποδέχεται τη λέξη 11001.
Ο αλγόριθμος
Πρώτα χρειαζόμαστε μια συνάρτηση που παίρνει ως όρισμα ένα σύνολο καταστάσεων και υπολογίζει σε ποιες καταστάσεις μπορούμε ακόμη να φτάσουμε με ε-μεταβάσεις. Είσοδος είναι λοιπόν ένα αυτόματο ⟨Q, Σ, δ, q0, F⟩ και ένα σύνολο καταστάσεων States, και έξοδος είναι ένα υπερσύνολο αυτών των καταστάσεων, στις οποίες μπορούμε να φτάσουμε με ε-μεταβάσεις. Αυτή την πράξη θα την ονομάζουμε ε-κλειστότητα του συνόλου States.
Αυτή τη συνάρτηση τη χρησιμοποιούμε στη συνάρτηση που θα προσομοιώνει τη λειτουργία του μη ντετερμινιστικού αυτομάτου. Είσοδος είναι το αυτόματο, η λέξη εισόδου w = w1w2… wn και το σύνολο καταστάσεων στις οποίες βρίσκεται τώρα το αυτόματο. Έξοδος είναι η απάντηση Ναι ή Όχι, ανάλογα με το αν το αυτόματο αποδέχεται ή δεν αποδέχεται τη δεδομένη λέξη.
Αν θέλουμε να ελέγξουμε αν το αυτόματο αποδέχεται τη λέξη w, καλούμε τη συνάρτηση ως εξής: ComputeNFA(⟨Q, Σ, δ, q0, F⟩, w, EpsilonClosure(⟨Q, Σ, δ, q0, F⟩, {q0})).
Πηγές
Κεφάλαια: Πεπερασμένο αυτόματο, Πλήρες αυτόματο, Μη ντετερμινιστικό πεπερασμένο αυτόματο, Προσομοίωση NFA, Μετατροπή NFA σε DFA