© Ευάγγελος Κουράκος Μαυρομιχάλης, 2006 |
Προηγούμενο | Περιεχόμενα | Επόμενο |
Διαδικασίες με λίστεςΣτη προηγούμενη ενότητα είδαμε πως μπορούμε ν' αναπαραστήσουμε μία λίστα γεγονότων. Στην ενότητα αυτή θα δούμε πως μπορούμε να χειριστούμε τις λίστες κάνοντας χρήση ενός συνόλου διαδικασιών οι οποίες μας επιτρέπουν να εξάγουμε στοιχεία από μία λίστα, να εισάγουμε νέα, να διαγράψουμε στοιχεία, να ενώνουμε λίστες και να τις αντιστρέφουμε. Οι διαδικασίες αυτές θεωρούνται βασικές διότι οι περισσότερες διαδικασίες χειρισμού λιστών κάνουν χρήση αυτών. Μέλος λίσταςΗ πιο χρήσιμη διαδικασία είναι αυτή της "μέλους λίστας". Δεδομένου μίας λίστας αυτό που μας ενδιαφέρει είναι να εξετάσουμε αν ένα συγκεκριμένο στοιχείο είναι μέλος της λίστας ή όχι. Ένα στοιχείο Χ είναι μέλος μίας λίστας L αν: Ο παραπάνω αναδρομικός τρόπος ορισμού του μέλους μίας λίστας υλοποιείται με τον ακόλουθο τρόπο:
Η πιο απλά γράφοντας:
Παρατηρείστε ότι κατά τη στιγμή της ενοποίησης του Χ με το πρώτο στοιχείο της λίστας, αν η Χ είναι ελεύθερη τότε παίρνει τη τιμή του πρώτου στοιχείου της λίστας, ενώ αν η Χ είναι δεσμευμένη (δηλαδή ο χρήστης έχει δόσει ήδη τιμή σ' αυτή) τότε ελέγχει αν η Χ ταυτίζεται με το πρώτο στοιχείο της λίστας. Για το λόγω αυτό, το κατηγόρημα
Στη πρώτη περίπτωση το input είναι η λίστα L, ενώ το output είναι το στοιχείο Χ. Στη δεύτερη περίπτωση το κατηγόρημα member δέχεται ως input τόσο τον όρο Χ όσο και τη λίστα L, ενώ το output είναι η απάντηση που δίνει η Prolog (δηλαδή αν το στοιχείο X είναι μέλος της λίστας ή όχι). Για παράδειγμα αν κάνουμε την ακόλουθη ερώτηση:
Τότε κάνοντας διαδοχικά backtracking (όποτε πατάμε το ;) η Prolog απαντά:
Ενώ αν κάνουμε την ερώτηση:
Τότε η Prolog απλά ελέγχει αν το στοιχείο 2 είναι μέλος της λίστας. Αν το πρόβλημά δεν μας επιτρέπει τη χρήση backtracking, ένας εναλλακτικός τρόπος να παίρνουμε τα στοιχεία μίας λίστας, είναι ν' αναλύσουμε τη λίστα στο πρώτο στοιχείο της και την ουρά της, να κάνουμε τη πράξη που θέλουμε και μετά να επαναλαμβάνουμε το ίδιο για τα υπόλοιπα στοιχεία της λίστας. Για παράδειγμα, το επόμενο πρόγραμμα παίρνει ένα-ένα τα στοιχεία μίας λίστας και τα τυπώνει στην οθόνη:
Εισαγωγή νέου στοιχείουΗ εισαγωγή ενός νέου στοιχείου Η διαδικασία αυτή υλοποιείται από το γεγονός: Παραδείγματα:
Διαγραφή στοιχείουΗ διαγραφή ενός στοιχείου
Η
Παράθεση λιστώνΗ επόμενη πιο χρήσιμη διεργασία είναι αυτή της παράθεσης δύο λιστών. Έστω δύο λίστες διαφορετικού μήκους Πιο συγκεκριμένα, μία λίστα L είναι παράθεση δύο λιστών L1 και L2 όταν:
Η παραπάνω διαδικασία υλοποιείται από το ακόλουθο πρόγραμμα:
ή πιο απλά από το πρόγραμμα:
Όπως και με τη διαδικασία member, λόγω του ότι το σύμβολο της ενοποίησης "=" χρησιμοποιείται με διττό τρόπο το παραπάνω πρόγραμμα μπορεί να χρησιμοποιηθεί για να:
Στη τελευταία περίπτωση η Prolog μας δίνει όλες τις δυνατές περιπτώσεις. Για παράδειγμα:
Αντιστροφή λίσταςΔεδομένης μίας λίστας Η αντιστροφή λιστών μπορεί να υλοποιηθεί με δύο τρόπους: Πρώτος τρόπος: Ο πρώτος τρόπος κάνει χρήση της concat/3. Πιο συγκεκριμένα, με αναδρομικό τρόπο για να αντιστρέψουμε μία λίστα Η διαδικασία αυτή υλοποιείται από το παρακάτω πρόγραμμα:
Ο δεύτερος (και πολύ πιο γρήγορος) τρόπος, κάνει χρήση μίας βοηθητικής δομής, αυτής της στοίβας. Θεωρούμε τη λίστα Έτσι για ν' αντιστρέψουμε τα στοιχεία μίας λίστας
(α) να διασπάσουμε τη λίστα Η διαδικασία αυτή υλοποιείται από το παρακάτω πρόγραμμα:
Για παράδειγμα:
|