Μετατροπή NFA σε DFA
Θα δούμε πώς να μετατρέψουμε ένα μη ντετερμινιστικό αυτόματο σε ντετερμινιστικό αυτόματο, αποδεικνύοντας έτσι ότι η υπολογιστική ισχύς των μη ντετερμινιστικών και των ντετερμινιστικών αυτομάτων είναι ισοδύναμη.
Βασική ιδέα
Έστω ένα μη ντετερμινιστικό αυτόματο ⟨QN, ΣN, δN, q0, FN⟩ χωρίς ε-μεταβάσεις. Κατασκευάζουμε ένα ντετερμινιστικό αυτόματο ⟨QD, ΣD, δD, p0, FD⟩ ως εξής:
- QD ⊆ 2QN
- ΣD = ΣN
- p0 = {q0}
- FD = {Q ∈ QD ∣ Q ∩ FN ≠ ∅}
Τη συνάρτηση μετάβασης δD ορίζουμε ως εξής:
Τι σημαίνει αυτό; Ένα μη ντετερμινιστικό αυτόματο μπορεί να βρίσκεται ταυτόχρονα σε περισσότερες καταστάσεις, οπότε μπορεί π.χ. να βρεθούμε στην περίπτωση όπου το μη ντετερμινιστικό αυτόματό μας είναι στις καταστάσεις {q0, q1}. Διαβάζοντας το επόμενο σύμβολο, για παράδειγμα το 1, μπορούμε να φτάσουμε στο σύνολο καταστάσεων {q0, q2, q3}. Στην ντετερμινιστική εκδοχή του ίδιου αυτομάτου αυτό εκφράζεται ως εξής: δημιουργούμε δύο καταστάσεις, τις ονομάζουμε {q0, q1} και {q0, q2, q3} και βάζουμε ανάμεσά τους μετάβαση για το σύμβολο 1. Τυπικά πηγαίνουμε από τη μία κατάσταση στην άλλη, αλλά χάρη στην ονομασία θα ξέρουμε ότι στο μη ντετερμινιστικό αυτόματο θα βρισκόμασταν σε δύο και σε τρεις καταστάσεις αντίστοιχα.
Παράδειγμα
Έστω αυτό το μη ντετερμινιστικό αυτόματο:
Για να κατασκευάσουμε το ντετερμινιστικό αυτόματο, χρειαζόμαστε πρώτα απ' όλα μια νέα συνάρτηση μετάβασης. Θα μας βοηθήσει ένας πίνακας, στον οποίο θα γράψουμε όλες τις μεταβάσεις. Στην αρχή ο πίνακας έχει ως εξής:
Στην αριστερή στήλη θα έχουμε στο τέλος του αλγορίθμου όλες τις καταστάσεις του ντετερμινιστικού αυτομάτου. Ο συμπληρωμένος πίνακας θα ορίζει τότε τη συνάρτηση μετάβασης. Τώρα γράφουμε στον πίνακα σε ποιες καταστάσεις πηγαίνουμε, αν βρισκόμαστε στις καταστάσεις {q0} και στην είσοδο είναι τα σύμβολα 0 και 1.
Από την κατάσταση q0 οδηγεί για το σύμβολο 0 μετάβαση μόνο στην κατάσταση q1, ενώ για το σύμβολο 1 οδηγεί στις καταστάσεις q1 και q2. Τώρα προσθέτουμε στον πίνακα δύο νέες καταστάσεις: {q1} και {q1, q2}. Γιατί; Όποτε συμπληρώνουμε στον πίνακα ένα σύνολο καταστάσεων που δεν έχουμε ακόμη στην αριστερή στήλη, το προσθέτουμε εκεί.
και πάλι συμπληρώνουμε. Για την κατάσταση {q1, q2} δεν πρέπει να ξεχάσουμε να ελέγξουμε και τις δύο καταστάσεις, δηλαδή πού πηγαίνουμε από την κατάσταση q1 ενωμένο με το πού πηγαίνουμε από την κατάσταση q2.
Πήραμε μερικές νέες καταστάσεις, που πρέπει να προσθέσουμε στον πίνακα:
…και πάλι συμπληρώνουμε τις μεταβάσεις:
Οι καταστάσεις {q0, q1, q3}, {q1} και {q1,q2} υπάρχουν ήδη, οπότε προσθέτουμε μόνο την κατάσταση {q0,q1,q2,q3}.
Δεν προσθέσαμε καμία νέα κατάσταση, άρα ο πίνακας είναι συμπληρωμένος. Τώρα απλώς σχεδιάζουμε το διάγραμμα. Οι καταστάσεις του ντετερμινιστικού αυτομάτου είναι στην πρώτη στήλη, οι μεταβάσεις για τα σύμβολα 0 και 1 στις επόμενες. Κάθε κατάσταση που περιέχει κάποια τελική κατάσταση του αρχικού αυτομάτου θα είναι τελική και σε αυτό το αυτόματο. Δηλαδή κάθε κατάσταση που περιέχει την q3 θα είναι τελική. Το αυτόματο θα φαίνεται ως εξής:
Μπορούμε να δείξουμε ότι το αυτόματο λειτουργεί πραγματικά σωστά. Ας δοκιμάσουμε αν το αυτόματο αποδέχεται τη λέξη 11001. Στο ντετερμινιστικό αυτόματο θα ακολουθήσουμε τη διαδρομή
και το αυτόματο θα αποδεχόταν τη λέξη, επειδή η τελευταία κατάσταση {q0, q1, q2, q3} είναι τελική. Στο μη ντετερμινιστικό αυτόματο, κατά την προσομοίωση, θα φτάναμε στις ίδιες καταστάσεις, δηλαδή θα ξεκινούσαμε από την κατάσταση q0 και για το σύμβολο 1 θα φτάναμε στις καταστάσεις {q1, q2}. Το επόμενο σύμβολο 1 θα μας έφερνε στις καταστάσεις {q0,q3} κ.ο.κ. για τις υπόλοιπες καταστάσεις. Στο τέλος θα βρισκόμασταν σε όλες τις καταστάσεις {q0, q1, q2, q3} και το αυτόματο θα αποδεχόταν τη λέξη.
Πηγές
Κεφάλαια: Πεπερασμένο αυτόματο, Πλήρες αυτόματο, Μη ντετερμινιστικό πεπερασμένο αυτόματο, Προσομοίωση NFA, Μετατροπή NFA σε DFA