Πεπερασμένα αυτόματα και κανονικές εκφράσεις

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Εισαγωγή

Συμβολισμοί

Αλφάβητο (alphabet):
Πεπερασμένο σύνολο συμβόλων
Συμβολοσειρά (string):
Πεπερασμένη ακολουθία συμβόλων. Το μήκος της συμβολοσειράς χ συμβολίζεται ως |χ|.
Κενή συμβολοσειρά (empty string):
Συμβολοσειρά με μήκος 0. Συμβολίζεται ως ε.
Παράθεση (concatenation):
Η δημιουργία μιας νέας συμβολοσειράς από δύο άλλες (x, y) με τη σειριακή παράθεση των συμβόλων τους. Συμβολίζεται ως xy
Γλώσσα (language):
Ένα υποσύνολο των συμβολοσειρών που μπορούν να δημιουργηθούν από ένα συγκεκριμένο αλφάβητο.
Με βάση τον ορισμό της γλώσσας ορίζουμε:

Πεπερασμένα αυτόματα

Το θεωρητικό μοντέλο για την αναγνώριση μιας γλώσσας είναι ένα αυτόματο (automaton). Δύο αυτόματα τα οποία θα εξετάσουμε είναι τα:

Τα πεπερασμένα αυτόματα ορίζονται από την πεντάδα Μ = (Κ, Σ, δ, S, F):

K
Πεπερασμένο σύνολο καταστάσεων
Σ
Πεπερασμένο αλφάβητο εισόδου
δ
συνάρτηση αλλαγής κατάστασης (transition function) από μια κατάσταση Χ σε μια Χ' με βάση ένα σύμβολο εισόδου σ. δ(Χ, σ) = Χ'
S
Αρχική κατάσταση
F
Σύνολο τελικών καταστάσεων

Αν η συνάρτηση δ είναι μονότιμη τότε το αυτόματο αυτόματο καλείται ντετερμινιστικό πεπερασμένο αυτόματο (ΝΠΑ) (deterministic finite automaton (DFA)). Αντίθετα, αν για κάποιες τιμές (Χ, σ) της δ υπάρχουν πολλές πιθανές νέες καταστάσεις X' τότε το αυτόματο καλείται μη ντετερμινιστικό πεπερασμένο αυτόματο (ΜΠΑ) (non-deterministic finite automaton (NFA)). Οι γλώσσες που αναγνωρίζονται από τα πεπερασμένα αυτόματα λέγονται κανονικές γλώσσες (regular languages). Οι γλώσσες αυτές είναι κατάλληλες για να περιγράψουν τις λεκτικές μονάδες ενός προγράμματος.

Ένα πεπερασμένο αυτόματο μπορεί να παρασταθεί ως:

Κανονικές εκφράσεις

Μια κανονική έκφραση (regular expression) είναι ένας συμβολισμός κατάλληλος για την περιγραφή μιας κανονικής γλώσσας. Πολλά εργαλεία προγραμματισμού βασίζονται σε κανονικές εκφράσεις για την περιγραφή και την αναγνώριση συμβολοσειρών. Μπορούμε να ορίσουμε μια κανονική έκφραση σύμφωνα με τους παρακάτω κανόνες: Ο τελεστής * έχει την υψηλότερη και ο τελεστής | τη χαμηλότερη προτεραιότητα.

Κανονικές εκφράσεις στο Unix

Σε πολλά εργαλεία του Unix οι κανονικές εκφράσεις επιτρέπουν τον ορισμό σύνθετων συμβολοσειρών με δηλωτικό τρόπο. Η εντολή egrep επιτρέπει την αναζήτηση γραμμών που ικανοποιούν μια κανονική έκφραση μέσα σε ένα αρχείο. Τα παρακάτω σύμβολα έχουν ειδικό νόημα:
^
Αρχή της γραμμής
$
Τέλος της γραμμής
.
Οποιοδήποτε γράμμα
[abc]
Ένα από τα γράμματα a, b, ή c
[a-z]
Ένα από τα γράμματα a μέχρι z
[^abc]
Οποιοδήποτε γράμμα εκτός από τα a, b, και c.
Έκφραση*
Η έκφραση μηδέν ή περισσότερες φορές
Έκφραση+
Η έκφραση μία ή περισσότερες φορές
Έκφραση?
Η έκφραση μία ή καμία φορά
Έκφραση1|Έκφραση1
Η έκφραση1 ή η έκφραση2
(Έκφραση)
Το περιεχόμενο στην παρένθεση

Παράδειγμα: (με την εντολή cd ~dspin φτάνετε σε έναν κατάλογο που περιέχει ένα αρχείο με πολλές λέξεις (words))

athena:~> egrep 'abo' words
...
sabotage
seaboard
taboo
thereabouts
turnabout
vagabond
whereabout
...

athena:~> egrep '^abo' words
aboard
abode
abolish
abolition
abominable
abominate
aboriginal                 

athena:~> egrep bent words
absorbent
bent
benthic
debenture
incumbent
recumbent

athena:~> egrep 'bent$' words
absorbent
bent
incumbent
recumbent                                  

athena:~> egrep "heaven|hell" words
eggshell
heaven
heavenly
heavens
hell
hellfire
hellish
hello
hells
...

athena:~> egrep "(ga)(ba)+" words
gabardine
megabaud

athena:~> egrep pe+l words
..
peel
peeled
...

Ασκήσεις

  1. Να γράψετε ως κανονικές εκφράσεις τις παρακάτω εκφράσεις του egrep:
    w[xyz]k*
    a[^a-x]q
    a(b?)
    
  2. Να σχεδιάσετε ένα γράφο μετάβασης που να αναγνωρίζει τη γλώσσα με τις παρακάτω συμβολοσειρές:
    Kadafi
    Gadafi
    Ghadafi
    Khadafi
    
  3. Να σχεδιάσετε ένα γράφο μετάβασης που να αναγνωρίζει την κανονική έκφραση a* . (b | c) . (d | b)+.

Βιβλιογραφία