Τεχνογλωσσία 8 Β' Εξάμηνο Λογικός Προγραμματισμός Prolog Άσκηση: Διορθωτής Εκφράσεων Σκοπός της άσκησης είναι ο σχεδιασμός και η υλοποίηση συστήματος διορθωτή εκφράσεων βασισμένη στο φορμαλισμό της prolog που θα είναι σε θέση να διαβάζει κείμενο από πληκτρολόγιο, να ελέγχει την ορθότητα κάθε έκφρασης, να αναγνωρίζει το συντακτικό λάθος, να το δηλώνει με ένα μήνυμα και να προτείνει τη σωστή έκφραση στη θέση του. Για το σκοπό αυτό δημιουργήθηκε αρχικά μια ενoποιητική γραμματική με κανόνες Definite Clause numbers (DCG) σε περιβάλλον της Prolog και ένα λεξικό. Για τις ανάγκες της άσκησης κατασκευάστηκαν DCG κανόνες που εμπλουτίστηκαν με arguments (ορίσματα) ή διαφορετικά με γραμματικούς και σημασιολογικούς περιορισμούς (constraints) για να περιγράψουν όχι μόνο τη συντακτική δομή των προτάσεων, αλλά και τη σημασία τους. Πιο συγκεκριμένα δημιουργήθηκαν κανόνες που αναγνωρίζουν προτάσεις που αποτελούνται από: -ονοματική φράση όπου o περιορισμός action χρησιμοποιείται για να ταιριάξει τη γάτα με το νιαουρίζω (m= μπορώ να νιαουρίζω, nm= δεν μπορώ να νιαουρίζω ) -ρηματική φράση με αμετάβατο ρήμα (intrans) ή διμεταβατικό ρήμα (ditrans) για να αναγνωρίζονται όλοι οι δυνατοί συνδυασμοί. -Οι περιορισμοί δε του γένους (gender), του αριθμού (number), της πτώσης (case), του προσώπου (person) εξασφαλίζουν τη γραμματική ορθότητα των προτάσεων. Με βάση τους παραπάνω DCG κανόνες δοκιμάζουμε την ορθότητα της πρότασης μας με την χρήση των κανόνων test και change. Έτσι δίνοντας την ερώτηση «test([i,gata,kyniga,ta,pontikia],y)». παίρνουμε από το πρόγραμμα την απάντηση ότι η πρόταση είναι σωστή και στην μεταβλητή Y μεταφέρεται και τυπώνεται στην οθόνη η σωστή πρόταση. 1
Θα πρέπει εξ αρχής να θεωρήσουμε ότι ένα λάθος συμβαίνει κάθε φορά. Αν η πρόταση μας έχει λάθη ασυμφωνίας πτώσεων σε υποκείμενο ή αντικείμενο, λάθος αριθμό ή κάτι εκτός λεξικού γενικά δεν το διορθώνει. Διορθώσεις γίνονται όταν έχουμε Αντιστροφή άρθρου ουσιαστικού στο υποκείμενο Αντιστροφή άρθρου ουσιαστικού στο αντικείμενο Αντιστροφή ρήματος ουσιαστικού του υποκειμένου Αντιστροφή ρήματος άρθρου του αντικειμένου Αντικατάσταση μιας λέξης που ανήκει σε άλλη γραμματική κατηγορία Επίσης προστίθεται το σωστό αν Λείπει το υποκείμενο Λείπει το αντικείμενο Λείπει το άρθρο του υποκειμένου Λείπει το άρθρο του αντικειμένου Λείπει το ρήμα Με τη χρήση του κανόνα change κάνουμε αλλαγές από κάτι λάθος στο σωστό. Η θέση των κανόνων change μέσα στο πρόγραμμα είναι τέτοια ώστε να δουλεύει σωστά η διόρθωση. Φυσικά υπάρχουν πολλά προβλήματα όταν μεγαλώσει το λεξικό μας και οι διάφοροι κανόνες αντικατάστασης θα πολλαπλασιαστούν. Δόθηκε ιδιαίτερη μέριμνα ώστε αυτοί οι κανόνες αντικατάστασης να είναι όσο γίνεται λιγότεροι. Μια πιθανή επέκταση του προγράμματος θα ήταν να βρίσκει περισσότερα από ένα λάθη με αλλαγή όμως των κανόνων. 2
Παρατηρήσεις 1. Για την καλύτερη συμβατότητα του προγράμματος χρησιμοποιήθηκαν λατινικοί χαρακτήρες αφού υπήρχαν προβλήματα με τους ελληνικούς 2. Έγινε προσπάθεια ώστε το πρόγραμμα να είναι όσο γίνεται πιο απλό και εύχρηστο 3. Το ρήμα κυνηγώ θεωρήσαμε ότι μπορεί να παίρνει ή να μην παίρνει αντικείμενο 4. Υπάρχουν ξεχωριστές περιπτώσεις για τα μεταβατικά και τα αμετάβατα ρήματα 5. Δεν υπάρχουν περιπτώσεις αμφισημίας αφού στον κανόνα change εκεί που θα μπορούσαμε να βάλουμε περισσότερες επιλογές για χάρη απλότητας βάλαμε μόνο μία 3
Κώδικας σε Prolog % Τεχνογλωσσία VIII - Β Εξάμηνο (2013-2014) % Λογικός Προγραμματισμός - Prolog % Άσκηση: Διορθωτής Εκφράσεων % Φοιτητές: % Στριπέλη Αιμιλία, Α.Μ.: 130232 % Χορόζογλου Γεώργιος, Α.Μ.: 130247 % Κούκης Νικόλαος, Α.Μ.:130225 n(singular,nominative,masculine,nm) --> [kostas]. n(singular,nominative,feminine,nm) --> [maria]. n(singular,nominative,masculine,nm) --> [skylos]. n(singular,nominative,feminine,m) --> [gata]. n(singular,accusative,feminine,m) --> [gata]. n(singular,accusative,neutral,nm) --> [pontiki]. n(plural,nominative,masculine,nm) --> [skyloi]. n(plural,nominative,feminine,m) --> [gates]. n(plural,accusative,feminine,m) --> [gates]. n(plural,accusative,neutral,nm) --> [pontikia]. v(singular,ditrans,_) --> [kyniga]. v(singular,intrans,m) --> [niaourizei]. v(plural,ditrans,_) --> [kynigoyn]. v(plural,intrans,m) --> [niaourizoyn]. d(singular,nominative,masculine) --> [o]. d(singular,nominative,feminine) --> [i]. d(plural,nominative,masculine) --> [oi]. d(plural,nominative,feminine) --> [oi]. d(singular,accusative,feminine) --> [tin]. d(plural,accusative,feminine) --> [tis]. 4
d(singular,accusative,neutral) --> [to]. d(plural,accusative,neutral) --> [ta]. s --> np(number,nominative,gender,action), vp(number,case,gender,action). np(number,case,gender,action) --> d(number,case,gender), n(number,case,gender,action). vp(number,case,gender,action) --> v(number,ditrans,action), np(_,accusative,_,_). vp(number,case,gender,m) --> v(number,intrans,m). vp(number,case,gender,_) --> v(number,ditrans,_). % Kanones gia tin periptosi poy exei anastrafei to rima me to ypokeimeno - amatavata rimata % Mpainei edo giati an mpei parakato syndyazetai me alloys kanones change([x,niaourizei,y],[x,y,niaourizei]). change([x,niaourizoyn,y],[x,y,niaourizoyn]). change([x,kyniga,y],[x,y,kyniga]). change([x,kynigoyn,y],[x,y,kynigoyn]). % Kanones gia tin periptosi poy leipei to ypokeimeno - mia epilogi mono % Mpainei edo giati an mpei parakato syndyazetai me alloys kanones change([i,kyniga,x,y],[i,gata,kyniga,x,y]). change([o,kyniga,x,y],[o,skylos,kyniga,x,y]). change([oi,kynigoyn,x,y],[oi,gates,kynigoyn,x,y]). % Kanones gia tin periptosi poy anti ametavatoy rimatos mpainei kati allo change([i,gata [X]],[i,gata,niaourizei]). change([oi,gates [X]],[oi,gates,niaourizoyn]). change([o,x [Y]],[o,X,kyniga]). change([i,x [Y]],[i,X,kyniga]). change([oi,x [Y]],[i,X,kynigoyn]). % Kanones gia tin periptosi poy leipei to arthro toy ypokeimenoy 5
change([gata,x,y,z],[i,gata,x,y,z]). change([gates,x,y,z],[oi,gates,x,y,z]). change([maria,x,y,z],[i,maria,x,y,z]). change([kostas,x,y,z],[o,kostas,x,y,z]). change([skylos,x,y,z],[o,skylos,x,y,z]). change([skyloi,x,y,z],[oi,skyloi,x,y,z]). change([gates,x],[oi,gates,x]). change([gata,x],[i,gata,x]). change([skylos,x],[o,skylos,x]). change([skyloi,x],[oi,skyloi,x]). % Kanones gia tin periptosi poy exei anastrafei to arthro me to oysiastiko sto ypokeimeno change([x,i,y,z,w],[i,x,y,z,w]). change([x,oi,y,z,w],[oi,x,y,z,w]). change([x,o,y,z,w],[o,x,y,z,w]). change([x,i,y],[i,x,y]). change([x,oi,y],[oi,x,y]). % Kanones gia tin periptosi poy exei anastrafei to arthro me to oysiastiko sto antikeimeno change([x,y,z,w,tin],[x,y,z,tin,w]). change([x,y,z,w,tis],[x,y,z,tis,w]). change([x,y,z,w,to],[x,y,z,to,w]). change([x,y,z,w,ta],[x,y,z,ta,w]). % Kanones gia tin periptosi poy exei anastrafei to rima me to ypokeimeno change([x,kynigoyn,y,z,w],[x,y,kynigoyn,z,w]). change([x,kyniga,y,z,w],[x,y,kyniga,z,w]). % Kanones gia tin periptosi poy exei anastrafei to rima me to arthro toy antikeimenoy 6
change([x,y,tin,z,w],[x,y,z,tin,w]). change([x,y,tis,z,w],[x,y,z,tis,w]). change([x,y,to,z,w],[x,y,z,to,w]). change([x,y,ta,z,w],[x,y,z,ta,w]). % Kanones gia tin periptosi poy leipei to metavatiko rima change([i,x,to,w],[i,x,kyniga,to,w]). change([i,x,ta,w],[i,x,kyniga,ta,w]). change([o,x,to,w],[o,x,kyniga,to,w]). change([o,x,ta,w],[o,x,kyniga,ta,w]). change([oi,x,to,w],[oi,x,kynigoyn,to,w]). change([oi,x,ta,w],[oi,x,kynigoyn,ta,w]). % Kanones gia tin periptosi poy leipei to arthro toy antikeimenoy change([x,y,z,pontiki],[x,y,z,to,pontiki]). change([x,y,z,pontikia],[x,y,z,ta,pontikia]). change([x,y,z,gata],[x,y,z,tin,gata]). change([x,y,z,gates],[x,y,z,tis,gates]). % Kanones gia tin periptosi poy leipei to antikeimeno change([x,y,z,to],[x,y,z,to,pontiki]). change([x,y,z,ta],[x,y,z,ta,pontikia]). change([x,y,z,tin],[x,y,z,tin,gata]). change([x,y,z,tis],[x,y,z,tis,gates]). change(x,x). test(x,x):-s(x,[]),write('the phrase is correct'),!. test(x,y):-change(x,y),write('the phrase is not correct. Possible correction:'),!. % test:?- test([o,skylos,kyniga,to,pontiki],y). % 7
% test:?- s(x,[]). % to find out all the possible variations 8