Ένωση κανονικών γλωσσών
Έστω δύο κανονικές γλώσσες L1, L2. Θα αποδείξουμε ότι η ένωσή τους L = L1 ∪ L2 είναι επίσης κανονική γλώσσα.
Μέθοδος με ντετερμινιστικό αυτόματο
Η ιδέα
Έχουμε δύο κανονικές γλώσσες L1 και L2 και θέλουμε να αποδείξουμε ότι η ένωσή τους L1 ∪ L2 είναι πάλι κανονική γλώσσα. Επειδή οι L1 και L2 είναι κανονικές γλώσσες, υπάρχουν πεπερασμένα αυτόματα A1 και A2 που αποδέχονται τις γλώσσες L1 και L2, δηλαδή ισχύει L(A1) = L1 και L(A2) = L2. Στη συνέχεια θα κατασκευάσουμε ένα πεπερασμένο αυτόματο A που θα αποδέχεται τη γλώσσα L1 ∪ L2, και έτσι θα αποδείξουμε ότι η γλώσσα L1 ∪ L2 είναι κανονική.
Πώς θα το κάνουμε; Έχουμε στη διάθεσή μας τα πεπερασμένα αυτόματα A1 και A2, που αποδέχονται τις επιμέρους γλώσσες. Μπορούμε να πούμε ότι η λέξη w ανήκει στη γλώσσα L1 ∪ L2 αν και μόνο αν την αποδέχεται τουλάχιστον ένα από τα αυτόματα A1 ή A2.
Το αυτόματο A θα μπορούσε να λειτουργεί ως εξής: για την είσοδο w θα προσομοιώνει τον υπολογισμό του αυτομάτου A1 για την είσοδο w. Αν το A1 αποδεχτεί τη λέξη w, τότε τη λέξη w αποδέχεται και το A. Αν το A1 απορρίψει τη λέξη w, το A θα δοκιμάσει να προσομοιώσει τον υπολογισμό του A2 για την είσοδο w. Αν το A2 αποδεχτεί τη λέξη w, τότε τη λέξη w αποδέχεται και το A. Διαφορετικά την απορρίπτει.
Μένει να διατυπώσουμε αυστηρά τι σημαίνει ότι το αυτόματο A «προσομοιώνει» τον υπολογισμό ενός άλλου αυτομάτου.
Αυστηρή διατύπωση
Έχουμε δύο κανονικές γλώσσες L1 και L2, που αποδέχονται τα πεπερασμένα αυτόματα
Θα κατασκευάσουμε ένα πεπερασμένο αυτόματο A = ⟨Q, Σ, δ, q, F⟩ που θα αποδέχεται τη γλώσσα L = L1 ∪ L2. Θα χρησιμοποιήσουμε την ιδέα της ταυτόχρονης προσομοίωσης δύο αυτομάτων A1, A2. Ας φανταστούμε ότι έχουμε στην είσοδο τη λέξη w = w1w2… wn και ότι προσομοιώνουμε ταυτόχρονα την πορεία των αυτομάτων A1 και A2 για τη λέξη w. Η αρχική διαμόρφωση του αυτομάτου A1 είναι ⟨q1, w1w2… wn⟩, ενώ η αρχική διαμόρφωση του A2 είναι ⟨q2, w1w2… wn⟩. Σε κάθε αυτόματο εκτελούμε τώρα ένα βήμα υπολογισμού και καταλήγουμε στις διαμορφώσεις ⟨δ1(q1, w1), w2… wn⟩ και ⟨δ2(q2, w1), w2… wn⟩.
Βλέπουμε ότι οι διαμορφώσεις αυτές διαφέρουν μόνο στο πρώτο στοιχείο· το δεύτερο – το μέρος της λέξης που δεν έχει διαβαστεί ακόμα – είναι πάντα το ίδιο. Άρα κατά την προσομοίωση δεν χρειάζεται να κρατάμε δύο διαμορφώσεις δύο αυτομάτων, αρκεί μία διαμόρφωση της μορφής ⟨⟨qi, qj⟩, wl… wn⟩, όπου qi ∈ Q1 και qj ∈ Q2. Με άλλα λόγια, το αυτόματο A που κατασκευάζουμε θα έχει αρχική διαμόρφωση ⟨⟨q1, q2⟩, w⟩. Το πρώτο μέρος του ζεύγους ⟨q1, q2⟩ είναι η κατάσταση στην οποία βρίσκεται τη στιγμή αυτή το αυτόματο A1 και το δεύτερο μέρος είναι η τρέχουσα κατάσταση του αυτομάτου A2.
Μπορούμε λοιπόν να γράψουμε ότι το αυτόματο A θα έχει σύνολο καταστάσεων Q = Q1 × Q2. Θα είναι το καρτεσιανό γινόμενο των καταστάσεων των δύο προηγούμενων αυτομάτων. Η ιδέα που ακολουθεί είναι ότι το αυτόματο A θα έχει αρχική κατάσταση ⟨q1, q2⟩ και, αν το αυτόματο A1 μεταβαίνει για το σύμβολο w1 στην κατάσταση qi και το αυτόματο A2 μεταβαίνει για το σύμβολο w1 στην κατάσταση qj, τότε το αυτόματο A μεταβαίνει για το σύμβολο w1 στην κατάσταση ⟨qi, qj⟩.
Τη συνάρτηση μετάβασης δ τη γράφουμε ως εξής (εδώ υποθέτουμε ήδη ότι βρισκόμαστε στις καταστάσεις qi και qj):
Μένουν μόνο μικρές λεπτομέρειες. Για το αλφάβητο ισχύει Σ= Σ1 ∪ Σ2. Η αρχική κατάσταση είναι q = ⟨q1, q2⟩. Και οι τελικές καταστάσεις είναι όλα τα ζεύγη ⟨qi, qj⟩ για τα οποία ισχύει qi ∈ F1 ή qj ∈ F2.
Επεξήγηση με παράδειγμα
Έστω δύο αυτόματα. Το πρώτο είναι το αυτόματο A1, που αποδέχεται όλες τις λέξεις (και την κενή λέξη) στις οποίες εναλλάσσονται μηδενικά και μονάδες, δηλαδή τις λέξεις της μορφής 01, 0101, 010101, …
Το δεύτερο αυτόματο A2 αποδέχεται τις λέξεις που περιέχουν τουλάχιστον ένα μηδενικό:
Η ένωση αυτών των γλωσσών αποτελείται από τις λέξεις που είτε περιέχουν μηδενικό είτε έχουν τη μορφή 01, 0101, … Τώρα θα κατασκευάσουμε το πεπερασμένο αυτόματο A = ⟨Q, Σ, δ, q, F⟩ που θα αποδέχεται ακριβώς αυτή την ενωμένη γλώσσα. Πρώτα θα δούμε πώς θα είναι οι καταστάσεις του νέου αυτομάτου A. Θα είναι το καρτεσιανό γινόμενο των καταστάσεων του πρώτου και του δεύτερου αυτομάτου:
Έτσι προκύπτουν οι έξι καταστάσεις του αυτομάτου A, που αποδέχεται την ενωμένη γλώσσα L(A1) ∪ L(A2). Στο διάγραμμα θα έμοιαζαν ως εξής:
Μην ανησυχείς που έχουμε καταστάσεις που αποτελούνται από ζεύγη καταστάσεων – αυτό βοηθά απλώς να καταλαβαίνουμε καλύτερα τι συμβαίνει στο αυτόματο. Οι καταστάσεις θα μπορούσαν κάλλιστα να ονομάζονται απλά q0, …, q5. Τελικές είναι οι καταστάσεις που περιέχουν είτε την κατάσταση q0 είτε την p1, δηλαδή τις τελικές καταστάσεις των αρχικών αυτομάτων. Η αρχική κατάσταση είναι η ⟨q0, p0⟩.
Τώρα πρέπει να βρούμε όλες τις μεταβάσεις. Γράφουμε τον εξής πίνακα:
Και θα τον συμπληρώνουμε σταδιακά. Πρώτα βρίσκουμε πού οδηγεί η μετάβαση από την κατάσταση ⟨q0, p0⟩ με είσοδο 0. Βρίσκουμε πού οδηγεί η μετάβαση από την κατάσταση q0 με είσοδο 0 στο αυτόματο A1: οδηγεί στην κατάσταση q1. Στο αυτόματο A2 η μετάβαση από την p0 με το μηδέν οδηγεί στην κατάσταση p1. Γράφουμε λοιπόν στον πίνακα ⟨q1, p1⟩:
Με είσοδο 1 έχουμε: για το αυτόματο A1 ισχύει δ1(q0, 1) = q2 και για το αυτόματο A2 ισχύει δ2(p0, 1) = p0. Παίρνουμε έτσι την κατάσταση ⟨q2, p0⟩.
Συμπληρώνουμε τον υπόλοιπο πίνακα:
Και με βάση αυτόν τον πίνακα σχεδιάζουμε το υπόλοιπο διάγραμμα.
Μπορούμε να δοκιμάσουμε αν το αυτόματο λειτουργεί όπως πρέπει. Ας δοκιμάσουμε τη λέξη 0100. Το αυτόματο περνά διαδοχικά από τις καταστάσεις
Επειδή η κατάσταση ⟨q2, p1⟩ είναι τελική, το αυτόματο A αποδέχεται τη λέξη 0100. Τι θα γινόταν αν δίναμε τη λέξη 0100 στα αυτόματα A1 και A2; Το αυτόματο A1 θα περνούσε διαδοχικά από τις καταστάσεις:
Το αυτόματο κατέληξε στην κατάσταση q2, η οποία δεν είναι τελική, άρα το αυτόματο A1 δεν θα αποδεχόταν αυτή τη λέξη. Και το αυτόματο A2;
Η κατάσταση p1 είναι τελική, άρα το αυτόματο A2 θα αποδεχόταν τη λέξη 0100. Πρόσεξε ότι τα αυτόματα A1 και A2 κατέληξαν στις καταστάσεις q2 και p1, κάτι που συμφωνεί με το ότι το αυτόματο A κατέληξε στην κατάσταση ⟨q2, p1⟩.
Μέθοδος με μη ντετερμινιστικό αυτόματο
Παράδειγμα
Ότι το σύνολο των κανονικών γλωσσών είναι κλειστό ως προς την ένωση μπορούμε να το αποδείξουμε και κατασκευάζοντας ένα μη ντετερμινιστικό αυτόματο, που θα είναι πολύ πιο απλό.
Έχουμε λοιπόν δύο κανονικές γλώσσες L1, L2 και θέλουμε να αποδείξουμε ότι η ένωσή τους L = L1 ∪ L2 είναι επίσης κανονική γλώσσα. Επειδή οι L1, L2 είναι κανονικές γλώσσες, πρέπει να υπάρχουν αυτόματα A1, A2 που τις αποδέχονται. Δηλαδή ισχύει L(A1) = L1 και L(A2) = L2. Με τη βοήθεια αυτών των αυτομάτων κατασκευάζουμε ένα αυτόματο A που θα αποδέχεται τη γλώσσα L, δηλαδή L(A) = L.
Ας υποθέσουμε ότι τα πεπερασμένα αυτόματα A1 και A2 έχουν αυτή τη μορφή:
και
Το αυτόματο που θα αποδεχόταν την ένωση των δύο γλωσσών το κατασκευάζουμε δημιουργώντας μια νέα αρχική κατάσταση και φέρνοντας από αυτήν δύο ε-μεταβάσεις στις αρχικές καταστάσεις των δύο αυτομάτων. Αυτό είναι όλο. Το αυτόματο θα έμοιαζε ως εξής:
Αυστηρή διατύπωση
Έχουμε δύο αυτόματα A1 = ⟨Q1, Σ, δ1, q1, F1⟩ και A2 = ⟨Q2, Σ, δ2, q2, F2⟩. Κατασκευάζουμε το αυτόματο A = ⟨Q, Σ, δ, q0, F⟩, που θα αποδέχεται την ένωση των γλωσσών τις οποίες αποδέχονται τα προηγούμενα αυτόματα, δηλαδή L(A) = L(A1) ∪ L(A2). Ισχύουν τα εξής:
- Q = Q1 ∪ Q2 ∪ {q0}
- F = F1 ∪ F2
Και τη συνάρτηση μετάβασης δ ορίζουμε ως εξής:
Πηγές
Κεφάλαια: Κλειστότητα κανονικών γλωσσών, Ένωση, Τομή, Διαφορά, Συμπλήρωμα, Παράθεση, Κλειστότητα Kleene