1. Κατασκευή ενός πεπερασμένου αυτοματοποιημένου (FA) ή ντετερμινιστικής πεπερασμένης Automaton (DFA)
* Επεξήγηση: Εάν μπορείτε να χτίσετε ένα DFA ή NFA (μη -nondeterministic Finite Automaton) που δέχεται * όλα * και * μόνο * τις χορδές στη γλώσσα, τότε η γλώσσα είναι τακτική.
* Πώς να το κάνετε:
* Καθορίστε τις καταστάσεις: Οι καταστάσεις της FA σας αντιπροσωπεύουν τη "μνήμη" του τι έχει δει μέχρι στιγμής στη συμβολοσειρά εισόδου. Σκεφτείτε ποιες πληροφορίες είναι απαραίτητες για να θυμηθείτε να προσδιορίσετε εάν η συμβολοσειρά είναι στη γλώσσα.
* Καθορίστε τις μεταβάσεις: Οι μεταβάσεις υπαγορεύουν τον τρόπο με τον οποίο η FA μετακινείται από κατάσταση σε κράτος με βάση τα σύμβολα εισόδου. Βεβαιωθείτε ότι οι μεταβάσεις σας αντικατοπτρίζουν σωστά τους κανόνες της γλώσσας.
* Καθορίστε την κατάσταση εκκίνησης: Όπου αρχίζει η επεξεργασία του Automaton.
* Καθορίστε τις καταστάσεις αποδοχής: Τα κράτη που υποδεικνύουν ότι η συμβολοσειρά βρίσκεται στη γλώσσα.
* Παράδειγμα: Εξετάστε τη γλώσσα l ={χορδές πάνω από {a, b} που περιέχουν "ab" ως υποσύνολο}.
`` `
Κράτη:q0 (start), q1, q2 (αποδοχή)
Μεταβάσεις:
- Q0, a -> q1 (βλέπει ένα 'a' μέχρι στιγμής, ενδεχομένως οδηγώντας σε "ab")
- Q0, B -> Q0 (παρατηρείται Α 'Β', Επαναφορά)
- Q1, a -> q1 (βλέπε 'aa' μέχρι στιγμής, εξακολουθεί να ψάχνει για "ab")
- Q1, b -> q2 (βλέπε 'ab'!)
- Q2, a -> q2 (ήδη φαίνεται 'ab', οπότε οποιαδήποτε περαιτέρω είσοδος μας κρατά δεχόμενοι)
- Q2, B -> Q2 (ήδη φαίνεται «AB», οπότε οποιαδήποτε περαιτέρω είσοδος μας κρατάει να δεχόμαστε)
Εκκίνηση κατάστασης:q0
Αποδοχή κατάστασης:Ε2
`` `
Μπορείτε να σχεδιάσετε ένα διάγραμμα κατάστασης για να απεικονίσετε αυτό το FA.
2. Κατασκευή κανονικής έκφρασης
* Επεξήγηση: Εάν μπορείτε να γράψετε μια κανονική έκφραση που περιγράφει * όλα * και * μόνο * τις χορδές στη γλώσσα, τότε η γλώσσα είναι τακτική.
* Πώς να το κάνετε:
* Κατανόηση των βασικών χειριστών κανονικής έκφρασης:
* Concatenation:`ab` (ταιριάζει με τη συμβολοσειρά" ab ")
* Ένωση (ή):`a | b` (ταιριάζει" a "ή" b ")
* Kleene Star (μηδέν ή περισσότερες επαναλήψεις):`a*` (αντιστοιχίες "," a "," aa "," aaa ", ...)
* Kleene Plus (μία ή περισσότερες επαναλήψεις):`a+` (αντιστοιχεί "a", "aa", "aaa", ...)
* Παρενθέσεις για ομαδοποίηση:`(a | b) c` (αντιστοιχεί" ac "ή" bc ")
* Κατηγορίες χαρακτήρων:`[ABC]` (ταιριάζει 'Α', 'Β' ή 'C')
* Ranges:`[a-z]` (ταιριάζει με οποιοδήποτε πεζά γράμμα)
* Καταρρίψτε τη γλώσσα σε μικρότερα μέρη και συνδυάστε τα χρησιμοποιώντας τους χειριστές.
* Παράδειγμα: Χρησιμοποιώντας την ίδια γλώσσα l ={χορδές πάνω από {a, b} που περιέχουν "ab" ως υποσύνολο}.
Η κανονική έκφραση είναι:`(a | b)*ab (a | b)*`
* `(a | b)*` σημαίνει μηδέν ή περισσότερα περιστατικά 'a' ή 'b' (οποιαδήποτε σειρά των 'a's και' b).
* `ab` είναι το απαιτούμενο υπόστρωμα.
* `(a | b)*` Και πάλι επιτρέπει οποιαδήποτε σειρά των 'a και' b* μετά* "ab".
3. Χρησιμοποιώντας ιδιότητες κλεισίματος των κανονικών γλωσσών
* Επεξήγηση: Οι τακτικές γλώσσες κλείνουν υπό ορισμένες επιχειρήσεις. Αυτό σημαίνει ότι εάν εφαρμόσετε αυτές τις λειτουργίες σε τακτικές γλώσσες, το αποτέλεσμα είναι επίσης μια κανονική γλώσσα. Οι κοινές ιδιότητες κλεισίματος περιλαμβάνουν:
* Ένωση
* Συγκόλληση
* Αστέρι Kleene
* Διασταύρωση
* Συμπλήρωση
* Διαφορά
* Αντιστροφή
* Ομομορφισμός (υποκατάσταση)
* Πώς να το κάνετε:
1. Δείξτε ότι η γλώσσα μπορεί να κατασκευαστεί από απλούστερες, γνωστές κανονικές γλώσσες χρησιμοποιώντας λειτουργίες κλεισίματος.
2. Για παράδειγμα, εάν μπορείτε να δείξετε ότι η γλώσσα σας είναι η ένωση δύο τακτικών γλωσσών, έχετε αποδείξει ότι είναι τακτική.
* Παράδειγμα: Έστω L1 ={χορδές πάνω από {a, b} ξεκινώντας με 'a'} και l2 ={χορδές πάνω από {a, b} τελειώνοντας με 'b'}. Τόσο το L1 όσο και το L2 είναι τακτικοί (μπορείτε εύκολα να γράψετε τακτικές εκφράσεις γι 'αυτούς:`a (a | b)*` και `(a | b)*b`).
Τώρα, εξετάστε τη γλώσσα l =l1 ∩ l2 ={χορδές πάνω από {a, b} ξεκινώντας με 'a' * και * τελειώνοντας με 'b'}.
Δεδομένου ότι οι κανονικές γλώσσες είναι κλειστές κάτω από τη διασταύρωση, το L είναι επίσης τακτικό. Η κανονική του έκφραση είναι `a (a | b)*b`.
4. Θεώρημα myhill-nerode
* Επεξήγηση: Το θεώρημα Myhill-Nerode παρέχει μια απαραίτητη και επαρκή προϋπόθεση για μια γλώσσα να είναι τακτική. Δηλώνει ότι μια γλώσσα L είναι τακτική εάν και μόνο αν έχει πεπερασμένο αριθμό *διακριτών επιθημάτων *. Δύο επίθετα *x *και *y *διακρίνονται σε σχέση με το *l *αν υπάρχει μια συμβολοσειρά *z *έτσι ώστε ακριβώς ένα από τα *xz *ή *yz *είναι σε *l *. Με απλούστερους όρους:Μια γλώσσα L είναι τακτική εάν μπορείτε να διαιρέσετε όλα τα πιθανά προθέματα σε έναν πεπερασμένο αριθμό τάξεων ισοδυναμίας.
* Πώς να το κάνετε (πιο προηγμένο):
1. Καθορίστε μια σχέση ισοδυναμίας που βασίζεται σε διακριτά επιθήματα:`x ≡ y` αν και μόνο αν για όλες τις χορδές` z`, `xz ∈ l` αν και μόνο αν` yz ∈ L`.
2. Δείξτε ότι ο αριθμός των τάξεων ισοδυναμίας κάτω από αυτή τη σχέση είναι πεπερασμένος. Εάν είναι, τότε η γλώσσα είναι τακτική. Ο αριθμός των κατηγοριών ισοδυναμίας είναι ίσος με τον αριθμό των κρατών στο ελάχιστο DFA για τη γλώσσα.
* Παράδειγμα: Έστω l ={0
Εξετάστε τα προθέματα 0, 00, 000, .... αν ήταν κανονικά, τότε τελικά δύο προθέματα, πείτε 0
5. Το λεμόνι άντλησης για κανονικές γλώσσες (για να αποδείξει ότι μια γλώσσα δεν είναι * κανονική)
* Επεξήγηση: Το λεμόνι άντλησης είναι ένα εργαλείο για να αποδείξει ότι μια γλώσσα δεν είναι * κανονική. Δηλώνει ότι εάν η γλώσσα L είναι κανονική, τότε υπάρχει μήκος άντλησης *p *(ακέραιος), έτσι ώστε κάθε συμβολοσειρά *s *σε l με μήκος μεγαλύτερο ή ίσο με *p *να μπορεί να χωριστεί σε τρία υποσύνολα, *x *, *y *και *z *, όπου *s *=*xyz *, και οι ακόλουθες συνθήκες κρατούν:
1. Για κάθε i> =0, xy
2. | Y |> 0 (το "αντλημένο" μέρος y πρέπει να έχει μήκος τουλάχιστον 1).
3. | Xy | <=p. (Το "αντλημένο" μέρος y πρέπει να εμφανιστεί μέσα στους πρώτους χαρακτήρες p).
* Πώς να το χρησιμοποιήσετε για να αποδείξετε τη μη κανονικότητα:
1.
2. Ας υποθέσουμε ότι το μήκος άντλησης είναι *p *. (Δεν ξέρετε τι είναι * p *, αλλά υποθέτετε ότι υπάρχει).
3. Επιλέξτε μια συμβολοσειρά * s * σε l έτσι ώστε | s |> =*p *. Το κλειδί εδώ είναι να επιλέξετε μια συμβολοσειρά * s * που θα οδηγήσει σε μια αντίφαση αργότερα. Αυτό είναι συχνά το πιο δύσκολο κομμάτι.
4. Εξετάστε όλους τους πιθανούς τρόπους διαίρεσης * s * σε * xyz * έτσι ώστε |> 0 και | xy | <=*p *.
5. Για *κάθε πιθανή διαίρεση, βρείτε μια τιμή *i *έτσι ώστε *xy
6. Δεδομένου ότι βρήκατε μια αντίφαση, η αρχική σας παραδοχή ότι το L είναι κανονικό πρέπει να είναι ψευδές. Επομένως, το L δεν είναι κανονικό.
* Παράδειγμα: Έστω l ={a
1.
2. ας * p * είναι το μήκος άντλησης.
3. Επιλέξτε * s * =a
4. Εξετάστε τις πιθανές διαιρέσεις του * s * σε * xyz * με | y |> 0 και | xy | <=*p *. Από το | xy | <=* p * και * s * Ξεκινά με
p
, * xy * πρέπει να αποτελείται μόνο από 'a's. Επομένως:
* x =a
* y =a
* z =a
5. Επιλέξτε i =0. Τότε xy
6. αντίφαση! Το λεμόνι αντλίας λέει ότι για όλα όσα εγώ, xy
7. Επομένως, l δεν είναι κανονικό.
Βασικές εκτιμήσεις και βέλτιστες πρακτικές:
* Επιλέξτε τη σωστή μέθοδο: Η καλύτερη μέθοδος εξαρτάται από τη γλώσσα.
* Για απλές γλώσσες, η κατασκευή DFA/NFA ή κανονική έκφραση είναι συχνά η πιο εύκολη.
* Για τις γλώσσες που κατασκευάστηκαν από άλλες κανονικές γλώσσες χρησιμοποιώντας τυποποιημένες λειτουργίες, χρησιμοποιήστε ιδιότητες κλεισίματος.
*Για τις γλώσσες που υποψιάζονται να είναι *μη κανονικές *, χρησιμοποιήστε το θεώρημα της άντλησης ή του myhill-nerode.
* Σαφήνεια και αυστηρότητα: Όταν αποδεικνύετε ότι μια γλώσσα είναι τακτική, καθορίστε σαφώς την αυτοματοποιημένη σας/κανονική έκφραση και εξηγήστε γιατί δέχεται * όλες τις * χορδές στη γλώσσα και * μόνο * αυτές τις χορδές. Με άλλα λόγια, αποδεικνύουν και τις δύο κατευθύνσεις της επίπτωσης. Μια αόριστη περιγραφή δεν είναι αρκετή.
* ελαχιστοποίηση: Εάν κατασκευάσετε ένα DFA, είναι χρήσιμο (αλλά δεν απαιτείται) για να το ελαχιστοποιήσετε. Ένα ελαχιστοποιημένο DFA είναι μοναδικό για μια δεδομένη γλώσσα.
* Πρακτική: Η εργασία μέσω πολλών παραδειγμάτων είναι ο καλύτερος τρόπος για να κατανοήσουμε αυτές τις έννοιες και να αναπτυχθεί η διαίσθηση που απαιτείται για την αποτελεσματική εφαρμογή τους.
Συνοπτικά, η απόδειξη ότι μια γλώσσα είναι τακτική συνήθως περιλαμβάνει την απόδειξη της ισοδυναμίας της με έναν επίσημο ορισμό της κανονικότητας:είτε με την άμεση κατασκευή ενός μηχανήματος (FA) είτε με πρότυπο (κανονική έκφραση) που το αναγνωρίζει ή δείχνοντας ότι είναι χτισμένο από τακτικά εξαρτήματα χρησιμοποιώντας γνωστές λειτουργίες που διατηρούν την κανονικότητα. Το λεμόνι άντλησης, αντίθετα, χρησιμοποιείται για να διαψεύσει την κανονικότητα.
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα