✖

Μετατροπή αυτομάτου σε κανονική έκφραση

Θα δούμε πώς μπορούμε να μετατρέψουμε οποιοδήποτε πεπερασμένο αυτόματο σε κανονική έκφραση.

Περιγραφή του αλγορίθμου

Στην είσοδο έχουμε ένα NFA A. Πρώτα το μετατρέπουμε σε GNFA. Στη δεύτερη φάση σε κάθε βήμα απαλείφουμε μία κατάσταση, τροποποιούμε σωστά τη συνάρτηση μετάβασης και επαναλαμβάνουμε, μέχρι να μείνουν μόνο δύο καταστάσεις – η αρχική και η τελική. Ανάμεσά τους θα υπάρχει μία ακμή, της οποίας η ετικέτα είναι κανονική έκφραση, και αυτή είναι το αποτέλεσμα ολόκληρου του αλγορίθμου. Όλη η διαδικασία συνίσταται λοιπόν κυρίως στην απαλοιφή μιας κατάστασης και στην επακόλουθη διόρθωση του αυτομάτου, ώστε να πάρουμε ένα ισοδύναμο αυτόματο.

Απαλοιφή μίας κατάστασης

Πώς απαλείφεται μία κατάσταση, μπορούμε να το δούμε σε ένα απλό παράδειγμα. Ας υποθέσουμε ότι ένα τμήμα του αυτομάτου μας μοιάζει ως εξής:

όπου τα Ri είναι κάποιες κανονικές εκφράσεις. Πώς θα έμοιαζε το αυτόματο, αν απαλείφαμε την κατάσταση qr; Μπορούμε να το φανταστούμε ως εξής: βρισκόμαστε στην κατάσταση qi και ρωτάμε ποιες λέξεις μπορούμε να παράγουμε σε αυτό το τμήμα. Αν πάμε από την κατάσταση qi απευθείας στην qj, θα είναι όλες οι λέξεις που αντιστοιχούν στην κανονική έκφραση R4.

Αν όμως πάμε στην κατάσταση qr, μπορούμε να παράγουμε λέξεις της μορφής R1. Στην κατάσταση qr όμως μπορούμε να κάνουμε βρόχο με την κανονική έκφραση R2, οπότε στην πραγματικότητα μπορούμε να παράγουμε λέξεις της μορφής R1∘(R2∗). Και επειδή μπορούμε ακόμη να περάσουμε από την κατάσταση qr στην qj, προσθέτουμε στο τέλος και την κανονική έκφραση R3. Συνολικά, με αυτή τη διαδρομή μπορούμε να πάρουμε λέξεις της μορφής R1∘(R2∗)∘R3.

Τώρα ξέρουμε ότι από αυτό το τμήμα του αυτομάτου μπορούν να προκύψουν λέξεις της μορφής R4 ή της μορφής R1∘(R2∗)∘R3. Αυτό φυσικά μπορούμε να το γράψουμε ως κανονική έκφραση: (R4)|(R1∘(R2∗)∘R3).

Τώρα μπορούμε απλά να απαλείψουμε την κατάσταση qr και να αφήσουμε μόνο τις δύο καταστάσεις qi και qj, γράφοντας στη θέση του R4 την έκφραση που μόλις υπολογίσαμε:

Αυτή τη διαδικασία την εκτελούμε για κάθε ακμή από κάθε κατάσταση qi προς κάποια κατάσταση qj, συμπεριλαμβανομένων των βρόχων, δηλαδή και της περίπτωσης qi = qj.

Μετά την απαλοιφή μίας κατάστασης παίρνουμε ένα ισοδύναμο αυτόματο – ένα αυτόματο που αναγνωρίζει την ίδια γλώσσα.

Ο πλήρης αλγόριθμος

Στην είσοδο έχουμε ένα NFA A = ⟨Q, Σ, δ, q0, F⟩.

  1. Μετατρέπουμε το NFA A σε GNFA Z = ⟨Q′, Σ, δ′, q0′, qf′⟩. Στη συνέχεια με το γράμμα k θα συμβολίζουμε το πλήθος των καταστάσεων του Z.
  2. Αν k = 2, ο αλγόριθμος τελειώνει και στην ακμή ανάμεσα στην αρχική και την τελική κατάσταση βρίσκεται η κανονική έκφραση που ψάχνουμε.
  3. Αν k>2, επιλέγουμε μια οποιαδήποτε κατάσταση qr που είναι διαφορετική από την αρχική και την τελική, δηλαδή qr ≠ q0′ και qr ≠ qf′. Στη συνέχεια δημιουργούμε ένα νέο GNFA Z′ = ⟨Q′′, Σ, δ′′,q0′,qf′⟩, για το οποίο θα ισχύει: Q′′=Q′∖{qr} και για όλες τις qi ∈ Q′′ ∖ {qf′} και όλες τις qj ∈ Q′′ ∖ {q0′} ας είναι δ′′(qi,qj)=(R4)|(R1(R2∗)R3), όπου R1 = δ′(qi,qr), R2 = δ′(qr,qr), R3 = δ′(qr, qj), R4 = δ′(qi, qj). Συνέχισε με το βήμα 2.

Παράδειγμα

Έστω ότι στην είσοδο έχουμε αυτό το πεπερασμένο αυτόματο:

Πρώτα το μετατρέπουμε σε GNFA (τις περιττές ∅-μεταβάσεις δεν τις σχεδιάζουμε):

Τώρα εφαρμόζουμε το δεύτερο μέρος του αλγορίθμου και απαλείφουμε κάποιον κόμβο. Ξεκινάμε με τον κόμβο q2. Απαλείφουμε τον κόμβο q2 και προσθέτουμε μετάβαση από την κατάσταση q1 στην κατάσταση qf. Αυτή τη μετάβαση την ονομάζουμε b(a|b)∗, επειδή από τον κόμβο q1 φτάνουμε στην κατάσταση q2 με λέξεις της μορφής b, μετά μπορούμε να κάνουμε βρόχο με a|b, οπότε παίρνουμε (a|b)∗, και τέλος με μια ε-μετάβαση περνάμε στην qf. Ισχύει μάλιστα b(a|b)∗ϵ = b(a|b)∗. Παίρνουμε το αυτόματο:

Μένει να απαλείψουμε την τελευταία κατάσταση, την q1. Προσθέτουμε ακμή από την κατάσταση qs στην κατάσταση qf. Πώς θα την ονομάσουμε; Στην κατάσταση q1 φτάνουμε μέσω ε-μετάβασης, την οποία μπορούμε απλά να παραλείψουμε. Μετά μπορούμε να κάνουμε βρόχο με a, οπότε παίρνουμε την κανονική έκφραση a∗. Και τέλος, μέσω της ακμής φτάνουμε στην qf, οπότε τη συνενώνουμε ακόμη με την b(a|b)∗. Την ακμή λοιπόν την περιγράφουμε με την κανονική έκφραση a∗ b(a|b)∗.

Το αυτόματο έχει πια μόνο δύο καταστάσεις, άρα ο αλγόριθμος τελειώνει. Στην ακμή βρίσκεται η τελική κανονική έκφραση.

Πηγές

Κεφάλαια: Κανονικές εκφράσεις, Μετατροπή κανονικής έκφρασης σε αυτόματο, Γενικευμένο NFA, Μετατροπή αυτομάτου σε κανονική έκφραση