Διαδικασίεσ εισόδου/εξόδου Prolog Διαδικασίεσ εισόδου/εξόδου
Διαδικασίες εισόδου / εξόδου Στην Prolog, η επικοινωνία μεταξύ χρήστη και προγράμματος γίνεται συνήθως με τη μορφή ερωτήσεων από την πλευρά του χρήστη και απαντήσεων από την πλευρά του συστήματος. Η Prolog όμως περιέχει και ειδικές ενσωματωμένες διαδικασίες (built-in procedures), οι οποίες διαβάζουν όρους ή χαρακτήρες από το προκαθορισμένο κανάλι εισόδου (πληκτρολόγιο / αρχείο) και επιστρέφουν το αποτέλεσμα στο προκαθορισμένο κανάλι εξόδου (οθόνη / αρχείο).
Είσοδος από το πληκτρολόγιο get(X): Διαβάζει τον επόμενο χαρακτήρα που πληκτρολογεί ο χρήστης. read(X): Διαβάζει τον επόμενο όρο που εισάγεται από το πληκτρολόγιο. Παραδείγματα: ?- get(X),get(Y). Αν ο χρήστης πληκτρολογήσει ab η απάντηση που θα επιστραφεί είναι: X=a, Y=b. ?- read(X). a. X=a a no (λείπει η τελεία) [l,k]. X=[l,k] ‘a bc. No (λείπει η δεξιά απόστροφος)
Έξοδος στην οθόνη put(X): Τυπώνει στην οθόνη τον χαρακτήρα Χ. write(X): Τυπώνει στην οθόνη τον όρο Χ. nl: Προκαλεί αλλαγή γραμμής. Παραδείγματα: ?- write(aaa),nl,write([1,2,3]),nl,write(f(k,l)). aaa [1,2,3] f(k,l) yes
Είσοδος / Έξοδος σε αρχεία Για την είσοδο / έξοδο όρων και χαρακτήρων σε αρχεία χρησιμοποιούνται τα ίδια κατηγορήματα. Το μόνο που απαιτείται είναι η ανακατεύθυνση των καναλιών εισόδου / εξόδου. see(filename): Ορίζει ως κανάλι εισόδου το αρχείο filename. seen: Ακυρώνει το κανάλι επικοινωνίας που ορίστηκε με την εντολή see και κλείνει όλα τα αρχεία εισόδου. seeing: Επιστρέφει το τρέχον κανάλι εισόδου. tell(filename): Ορίζει ως κανάλι εξόδου το αρχείο filename. told: Ακυρώνει το κανάλι επικοινωνίας που ορίστηκε με την εντολή tell και κλείνει όλα τα αρχεία εξόδου. telling: Επιστρέφει το τρέχον κανάλι εξόδου.
Παράδειγμα εισόδου / εξόδου σε αρχείο Το κατηγόρημα που ακολουθεί δέχεται σαν είσοδο μία λίστα με στοιχεία και τα γράφει σε ένα προκαθορισμένο αρχείο. out(L):- tell(‘myfile.txt’),write_list(L),told. write_list([]). write_list([H|T]):-write(H),nl,write_list(T). 6
Χειρισμός συμβολοσειρών Στην Prolog, η τακτική που ακολουθείται για το χειρισμό συμβολοσειρών είναι η μετατροπή τους σε λίστες και η χρήση κατηγορημάτων επεξεργασίας λιστών. Το κατηγόρημα που μετατρέπει μία συμβολοσειρά σε λίστα ASCII κωδικών είναι το: name(String,List). ?- name(abc,X). X=[97,98,99] Η συμβολοσειρά μπορεί να είναι άτομο ή αριθμός Αν το άτομο αρχίζει με κεφαλαίο ή περιέχει κενά, πρέπει να είναι τοποθετημένο σε απλά εισαγωγικά. Ένα άτομο ή αριθμός μέσα σε διπλά εισαγωγικά ισοδυναμεί με λίστα ASCII κωδικών.
Παράδειγμα χειρισμού συμβολοσειρών Το παρακάτω κατηγόρημα δέχεται σαν είσοδο δύο συμβολοσειρές και τις συνενώνει: strings_concatenate(Str1,Str2,Str):- name(Str1,L1),name(Str2,L2),append(L1,L2,L), name(Str,L). 8