ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ Τμήμα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Τομέας Τηλεπικοινωνιών Αναπληρωτής Καθηγητής: Αλέξανδρος Ποταμιάνος Ονοματεπώνυμο: Α Μ : ΗΜΕΡΟΜΗΝΙΑ: ΤΗΛ 413 : Συστήματα Επικοινωνίας Φυσικής Γλώσσας Εαρινό Εξάμηνο 2007 1η Εργαστηριακή Άσκηση FSM Toolkit Exercises The following problems are designed to familiarize you with the FSM tools and methodsyou should use the tools throughout to solve these problems and to test your solutions Exercise 1 Given the alphabet L=(a, b,, z, A, B,, Z, <space>) create an automaton that : a) Accepts a letter in L including space b) Accepts a single space c) Accepts a capitalized word (where a word is a string of letters in L excluding space and a capitalized word has its initial letter uppercase and remaining letters lowercase) d) Accepts a word containing the letter a Exercise 2 Using the automata in Problem 1 as the building blocks use appropriate FSM operations on them to create an automaton that: a) Accepts zero or more capitalized words followed by spaces b) Accepts a word beginning or ending in a capitalized letter c) Accepts a word that is capitalized and contains the letter a d) Accepts a word that is capitalized or does not contain an a Exercise 3 Epsilonremove, determinize and minimize each of the automata in Problem2 Give the number of states and arcs before and after these operations
Exercise 4 Consider the automaton: 0 1 1 0 2 2 1 1 1 2 3 4 4 4 3 3 4 a) How many states can be reached from the initial state? b) How many states can reach a final state? c) Compile this automaton and then remove all useless states HAND OUT ΠΡΟΣΟΧΗ: Τοποθετείστε τα binaries του FSM Toolbox στο path: C:\FSM\bin\ Για να μπορέσουμε να καλέσουμε απευθείας τις εφαρμογές του FSM Toolbox θα πρέπει να έχουμε δηλώσει στο /etc/profile το path που έχουμε τα binaries του FSM (PATH = $PATH:::/cygdrive/c/FSM/bin ) Διαφορετικά θα πρέπει στο script να δηλώσουμε μία μεταβλητή στην οποία θα έχουμε καταχωρήσει το path των FSM binaries (πχ $fsm = /cygdrive/c/fsm/bin) και να καλέσουμε την system( $fsm/fsmdraw Εναλλακτικά θα μπορούσαμε να καλέσουμε την system δηλώνοντας explicitly το path: system( /cygdrive/c/bin/fsmdraw ); Από command line του cygwin εκτελούμε κανονικά εφόσον έχει δηλωθεί το path των binaries του FSM διαφορετικά το δίνουμε explicit fsmcompile i 01_inputlab /01a_automatondef > 01afsa fsmdraw i 01_inputlab /01afsa dot T ps > 01aps /cygdrive/c/fsm/bin/fsmdraw Άσκηση 1 a) Αρχικά πρέπει να δημιουργούμε ένα αρχείο το οποία στην ουσία ορίζει το FSM που θέλουμε να κατασκευάσουμε Στην ουσία έχουμε δύο καταστάσεις, αρχική την 0 και τελική την 1 και όλα τα γράμματα της αλφαβήτου μικρά, κεφαλαία και το <space> τα οποία μας οδηγούν από την αρχική στην τελική κατάσταση Το αρχείο μας δηλαδή θα πρέπει να είναι της μορφής : 0 1 a 0 1 b
0 1 A 0 1 B 0 1 <space> 1 // Η γραμμή αυτή δηλώνει την τελική κατάσταση του FSM Στη συνέχεια πρέπει να δημιουργήσουμε το αρχείο συμβόλων στο οποίο αντιστοιχίζουμε τα γράμματα και το <space> με καταστάσεις μετάβασης Το αρχείο αυτό δίνεται σαν όρισμα κατά την κλίση των εφαρμογών fsmcompile και fsmdraw Το αρχείο αυτό θα πρέπει να είναι της παρακάτω μορφής: eps 0 //Epsilon transitions a 1 b 2 A 27 B 28 Z 52 <space> 53 Στη συνέχεια αφού δημιουργήσουμε τα δύο αυτά αρχεία τα οποία έχουν τα ονόματα «01a_automatondef και 01_inputlab» χτίζουμε την μηχανή πεπερασμένης κατάστασης με την εντολή: System( fsmcompile I /01_inputlab /01a_automatondef > /01afsa ); Η παραπάνω εντολή εκτελείται μέσα από κάποιο perl script Εναλλακτικά μπορούμε από command line να εκτελέσουμε απευθείας την εντολή: fsmcompile i /01_inputlab /01a_automatondef > /01afsa Τέλος για να σχεδιάσουμε την μηχανή μας εκτελούμε την παρακάτω εντολή: fsmdraw i /inputsyms /fsa dot T ps G rotate=0 >/fsaps Η παραπάνω εντολή μας σχεδιάζει την μηχανή σε ένα ps αρχείο το οποίο στη συνέχεια μπορούμε να το ανοίξουμε κάνοντας δεξί κλικ στο
αρχείο μέσα από τον windows explorer και επιλέγοντας Convert to Adobe PDF Μπορούμε αν βάλουμε όρισμα στο dot αντί για ps gif να δημιουργήσουμε gif αρχείο αντί για ps Σχεδιάστε το γραφικό αποτέλεσμα b) Για το δεύτερο ερώτημα πρέπει να δημιουργήσουμε με τον ίδιο τρόπο μία μηχανή πάλι δύο καταστάσεων που να δέχεται μόνο το <space> Το αρχείο που θα δημιουργήσετε για τη μηχανή θα έχει όνομα spacedef και θα έχει τη μορφή: 0 1 <space> 1 Για αρχείο συμβόλων θα χρησιμοποιήσουμε το ίδιο με την προηγούμενη μηχανή αφού έχουμε δηλώσει το <space> σε αυτό Πάλι θα δημιουργήσουμε τη μηχανή μας με την παρακάτω εντολή: fsmcompile i /01_inputlab /spacedef > /spacefsa και θα την σχεδιάσουμε με την : fsmdraw i /01_inputlab /spacsfsa dot T ps G rotate =0 > /spaceps Ανοίγουμε πάλι το ps αρχείο κάνοντας δεξί κλικ στο αρχείο μέσα από τον windows explorer και επιλέγοντας Convert to Adobe PDF Σχεδιάστε το γραφικό αποτέλεσμα
c) Για το τρίτο ερώτημα θα πρέπει να δημιουργήσουμε δύο μηχανές, όπως παραπάνω, μία που να δέχεται μόνο ένα κεφαλαίο γράμμα U1 και μία που να δέχεται μόνο ένα μικρό L2 Στη συνέχεια θα πρέπει να δημιουργήσουμε τη έκφραση U1(L2)* Την (L2)* την δημιουργούμε καλώντας τη εφαρμογή: fsmclosure /lowerfsa >/closl2fsa Τέλος την U1(L2)* με την κλήση της εφαρμογής: fsmconcat /uperfsa /closl2fsa > /cap_wordfsa Την σχεδιάζουμε με την εντολή: fsmdraw i /01_inputlab /cap_wordfsa dot T ps Grotate=0 > /cap_wordps Προσοχή, θα πρέπει για το compile των δύο μηχανών, για λεξικό, να χρησιμοποιήσουμε ένα αρχείο και για τις δύο μηχανές έτσι ώστε το κάθε σύμβολο μετάβασης να αντιστοιχεί σε διαφορετικό index number d) Για το ερώτημα αυτό θα πρέπει να υλοποιήσουμε αρχικά μία μηχανή που να δέχεται το σύμβολο a και στην συνέχεια την έκφραση (U1 U L2)(L2)*a (L2)* Στην ουσία χρησιμοποιούμε τις μηχανές του προηγουμένου ερωτήματος upperfsa, και closl2fsa και την μηχανή που δημιουργήσαμε σε αυτό το ερώτημα Για να υλοποιήσουμε λοιπόν τη μηχανή του ερωτήματος εκτελούμε τις εντολές : fsmunion /uperfsa /L2fsa > frst_letterfsa fsmconcat /frst_letterfsa /closl2fsa /afsa /closl2fsa > finalfsa Την σχεδιάζουμε πάλι με την χρήση της fsmdraw Σχεδιάστε το γραφικό αποτέλεσμα:
Άσκηση 2 a) Για το ερώτημα αυτό πρέπει παίρνουμε την μηχανή από την προηγούμενη άσκηση η οποία δεχόταν κάθε λέξη με κεφαλαίο γράμμα σαν αρχική μηχανή cap_wordfsa, στη συνέχεια παίρνουμε το concatenation της μηχανής που δέχεται μόνο το <space> με την μηχανή που δέχεται μία λέξη με κεφαλαίο γράμμα και δημιουργούμε μία νέα μηχανή Α2 Μετά παίρνουμε το closure της Α2* Τέλος παίρνουμε το concatenation Α1(Α2*) και το closure όλης αυτής της μηχανής για να δέχεται και το τίποτα fsmconcat /spacefsa /cup_wordfsa > /a2fsa fsmclosure / a2fsa > /clos_a2fsa fsmconcat /cup_wordfsa /clos_a2fsa > /a3fsa fsmclosure /a3fsa > /fin1fsa fsmdraw -i/01_inputlab /fin1fsa dot Tps G rotate=0 > /finps b) Παίρνουμε την ένωση (Union) της μηχανής που δέχεται λέξεις με που ξεκινάνε με κεφαλαία γράμματα και μίας μηχανής που δέχεται λέξεις που το τελευταίο γράμμα τους είναι κεφαλαίο Την μηχανή η οποία δέχεται μία λέξη που τελειώνει σε κεφαλαίο γράμμα μπορούμε να την δημιουργήσουμε αντιστρέφοντας την πρώτη μηχανή με την εντολή fsmreverse Δηλαδή: fsminverse /cup_wordfsa > /rev_cup_wordfsa fsmunion /cup_wordfsa /rev_cup_wordfsa > /2bfsa fsmdraw i /01_inputlab /2bfsa dot Tps > 2bps
c) Παίρνουμε τη μηχανή που δέχεται μόνο ένα κεφαλαίο γράμμα έστω U1 στη συνέχεια παίρνουμε το closure της μηχανή που δέχεται μόνο ένα μικρό γράμμα έστω L1, και τέλος παίρνουμε και τη μηχανή που δέχεται μόνο το γράμμα a έστω Α1 και υλοποιούμε την έκφραση U1(L1)*A1 (L1)* d) Παίρνουμε το union της μηχανής που δέχεται λέξεις με το πρώτο γράμμα κεφαλαίο με μία μηχανή έστω word2 που φτιάχνουμε η οποία δέχεται λέξη που δεν περιέχει το γράμμα a Για να φτιάξουμε αυτή τη μηχανή παίρνουμε μία μηχανή που δέχεται μόνο ένα γράμμα έστω any_letter, αφαιρούμε τη μηχανή που δέχεται μόνο το γράμμα a και μετά παίρνουμε το closure της διαφοράς τους Την διαφορά δύο μηχανών την παίρνουμε με την εντολή fsmdifference Είναι δηλαδή της μορφής: (cup_word)u(any_letter - a)* Τέλος σχεδιάζουμε το αποτέλεσμα με την fsmdraw Άσκηση 3 Για την λύση της άσκησης αυτής χρησιμοποιούμε τις εφαρμογές του FSM Toolkit στις μηχανές που δημιουργήσαμε στα ερωτήματα της προηγούμενης άσκησης Έστω μηχανή a2fsa τότε για την άσκηση αυτή εκτελούμε τις παρακάτω εντολες: fsminfo n a2fsa fsmrmepsilon a2fsa > bfsa fsmdeterminize bsa > cfsa fsmminimize cfsa > dfsa fsminfo n dfsa
H fsminfo n μας δίνει τις πληροφορίες για τον αριθμό καταστάσεων, μεταβάσεων μίας μηχανής κα Η fsmrmepsilon μετατρέπει την μηχανή σε μία άλλη η οποία δεν έχει μεταβάσεις epsilon H fsmdeterminize μετατρέπει τη μηχανή από μη deterministic σε deterministic Τέλος η fsmminimize κάνει minimization στη μηχανή ΠΑΡΑΔΟΤΕΟ: FSM Ερωτήματος States/Before Arcs/Before States/After Arcs/After Μηχανή ερωτήματος (2a) Μηχανή ερωτήματος (2b) Μηχανή ερωτήματος (2c) Μηχανή ερωτήματος (2d) Άσκηση 4 Για την άσκηση αυτή αφού δημιουργήσουμε τη μηχανή με βάση τα δεδομένα την άσκησης, έστω 4fsa στη συνέχεια καλούμε την fsmconnent η οποία καθαρίζει την μηχανή μας από τις άχρηστες καταστάσεις και μεταβάσεις fsmconnect 4fsa > finalfsa Τέλος σχεδιάζουμε το αποτέλεσμα με την fsmdraw a) b) c) Σχεδιάστε το αποτέλεσμα