ΑΡΧΕΣ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ
Πανεπιστήμιο Ιωαννίνων - Τμήμα Πληροφορικής και Τηλεπικοινωνιών
Γκόγκος Χρήστος - Άρτα@2022
e-course μαθήματος: http://ecourse.uoi.gr/course/view.php?id=1945
Τελευταία ενημέρωση: 3/6/2022
- Ασκήσεις επανάληψης: 1, 2
- Quiz επανάληψης στο ecourse (x4)
Εργασίες
- Εργασία 1 παράδοση μέχρι
27/4/2022στο ecourse - Εργασία 2 παράδοση μέχρι 19/6/2022 στο ecourse
- παραδείγματα εισόδου: input1000.txt, input10000.txt
1. ΘΕΩΡΙΑ
Σημειώσεις μελέτης και διαφάνειες για το Αρχές Γλωσσών Προγραμματισμού 11η εκδ., Robert W. Sebesta
- Κεφ.1 Εισαγωγή
- Κεφ.3 Περιγραφή συντακτικού και σημασιολογίας
- Κεφ.4 Λεκτική και συντακτική ανάλυση
- Κεφ.5 Ονόματα, προσδέσεις και εμβέλειες
- Κεφ.9 Υποπρογράμματα
- Κεφ.15 Γλώσσες συναρτησιακού προγραμματισμού
- Κεφ.16 Γλώσσες λογικού προγραμματισμού
2. ΕΡΓΑΣΤΗΡΙΟ
Πρώτο εργαστήριο Python
- Εγκατάσταση της Python
- Εκτέλεση κώδικα στο IDLE, εκτέλεση script της Python στη γραμμή εντολών
- Μεταβλητές, τιμές και τύποι, τελεστές και εκφράσεις
- Είσοδος από τον χρήστη, εμφάνιση στη γραμμή εντολών (παραδείγματα 1, 2)
- Έλεγχος ροής (επιλογή και επανάληψη)
- Αμυντικός προγραμματισμός (παραδείγματα 1, 2, 3, 4)
- Δομές Δεδομένων (λίστα, πλειάδα, λεξικό, σύνολο)
- Τεμαχισμός λιστών και συμβολοσειρών
- Εγκατάσταση VSCode, ms-python.python extension, εκτέλεση κώδικα Python από το VSCode
Ενισχύστε τις γνώσεις σας για τα παραπάνω :
- διαβάζοντας τα κεφάλαια 1,2,3,4,5,7,8 από το Αγγελιδάκης-2015.
- μελετώντας τις παρουσιάσεις από το PY4E
Άσκηση E1A1 - Γράψτε πρόγραμμα που να υπολογίζει τα 10 πρώτα ψηφία του αποτελέσματος της πράξης $\sqrt{\frac{2^{101}}{\pi^{53}+11^7}}$
Άσκηση E1A2 - Γράψτε πρόγραμμα που να εμφανίζει για τη συμβολοσειρά “How I need a drink alcoholic of course, after all those lectures involving quantum mechanics” το πλήθος των χαρακτήρων κάθε λέξης. Παρατήρηση: η μέθοδος split() σε μια συμβολοσειρά επιστρέφει μια λίστα με τις λέξεις της.
Άσκηση E1A3 - Γράψτε πρόγραμμα που να υπολογίζει το άθροισμα 1 + 1/2 + 1/4 + 1/8 + … όπου ο χρήστης θα δίνει το πλήθος των όρων του αθροίσματος. Διασφαλίστε με αμυντικό προγραμματισμό ότι η τιμή που δίνει ο χρήστης είναι μια μη αρνητική ακέραια τιμή, αλλιώς να ζητείται επανεισαγωγή της τιμής.
Άσκηση E1A4 - Δώστε την εντολή import this στο IDLE και αντιγράψτε σε ένα λεκτικό το κείμενο που επιστρέφεται. Γράψτε πρόγραμμα που να εμφανίζει το πλήθος παρατηρήσεων των χαρακτήρων Α έως και Z, χωρίς διάκριση πεζών και κεφαλαίων, στο παραπάνω κείμενο.
Δεύτερο εργαστήριο Python
- Συναρτήσεις
- Εμβέλεια μεταβλητών, παραδείγματα 1a, 1b, 1c, 2a, 2b
- mutability vs immutability
- Λάμδα συναρτήσεις
- Αρθρώματα (modules), παράδειγμα my_module.py, use_of_my_module.py)
- Περιφραστικές λίστες (list comprehensions)
- Testing, η βιβλιοθήκη unittest, παραδείγματα 1, 2, 3
Ενισχύστε τις γνώσεις σας για τα παραπάνω :
- διαβάζοντας το κεφάλαιο 6 από το Αγγελιδάκης-2015.
- μελετώντας την παρουσίαση functions από το PY4E
Άσκηση E2A1 - Γράψτε μια συνάρτηση που να δέχεται δύο λεκτικά και να επιστρέφει την απόσταση Hamming (δηλαδή το πλήθος των αντίστοιχων χαρακτήρων που διαφέρουν στα δύο λεκτικά). Αν τα λεκτικά είναι διαφορετικού μήκους η συνάρτηση να επιστρέφει την τιμή -1. Τροποποιήστε το template2_1.py έτσι ώστε η λύση σας να επιτυγχάνει σε όλα τα unit tests.
Άσκηση E2A2 - Γράψτε μια συνάρτηση που να ελέγχει αν μια φράση είναι παντόγραμμα, δηλαδή περιλαμβάνει και τα 24 γράμματα του Ελληνικού αλφαβήτου. Τροποποιήστε το template2_2.py έτσι ώστε η λύση σας να επιτυγχάνει σε όλα τα unit tests.
Άσκηση E2A3 - Γράψτε μια συνάρτηση που να δέχεται ένα κείμενο, να αφαιρεί τα σύμβολα τελεία και κόμμα, να εντοπίζει το μεγαλύτερο μήκος λέξης που περιέχει και να επιστρέφει μια λίστα με όλες τις λέξεις του κειμένου με μήκος ίσο με το μεγαλύτερο μήκος. Τροποποιήστε το template2_3.py έτσι ώστε η λύση σας να επιτυγχάνει σε όλα τα unit tests.
Άσκηση E2A4 - Για την ακόλουθη λίστα τιμών 56, 37, 771, 90, 16, 11 γράψτε comprehensions που να κάνουν τα ακόλουθα:
- Να δημιουργεί νέα λίστα με το πλήθος των ψηφίων κάθε τιμής.
- Να δημιουργεί νέα λίστα με τα ψηφία κάθε τιμής σε αντίστροφη σειρά.
- Να δημιουργεί νέα λίστα μόνο με τις τιμές που είναι μεγαλύτερες από το μέσο όρο των τιμών.
- Να δημιουργεί νέα λίστα με ζεύγη τιμών που το πρώτο στοιχείο κάθε ζεύγους να είναι η ίδια τιμή και δεύτερο στοιχείο μια λογική τιμή με τιμή True αν η τιμή είναι άρτια αλλιώς η τιμή False.
Τροποποιήστε το template2_4.py έτσι ώστε η λύση σας να επιτυγχάνει σε όλα τα unit tests.
Τρίτο εργαστήριο Python
- Εξαιρέσεις
- Η βιβλιοθήκη os, παραδείγματα 1
- Αρχεία (απλού κειμένου, CSV, excel, XML, JSON, YAML)
- Σειριοποίηση με το pickle
- Η βιβλιοθήκη κανονικών εκφράσεων re
- Τυχαίες τιμές, η βιβλιοθήκη random
- Εγκατάσταση βιβλιοθηκών (π.χ. NumPy, pandas, Scikit-learn, Matplotlib, Seaborn, Pillow κ.α.)
Ενισχύστε τις γνώσεις σας για τα παραπάνω:
- διαβάζοντας τα κεφάλαια 9 και 10 από το Αγγελιδάκης-2015.
- μελετώντας τις παρουσιάσεις από το PY4E
- παίζοντας με τις κανονικές εκφράσεις στo https://regexr.com/, στο https://alf.nu/RegexGolf, ή στο https://regexcrossword.com/.
- οπτικοποιώντας κανονικές εκφράσεις στο https://regexper.com/, για παράδειγμα: κανονική έκφραση για ώρα σε μορφή h:mm ή hh:mm.
Άσκηση E3A1 - Στο ακόλουθο tweet ο Lex Fridman αναφέρει ότι η αναμενόμενη τιμή του πλήθους τυχαίων επιλογών αριθμών στο διάστημα 0 έως 1 που απαιτούνται έτσι ώστε το άθροισμά τους να ξεπεράσει το 1 είναι ίση με e=2.7182…
Select numbers between 0 and 1 randomly until sum is > 1.
The expected # of selections needed is equal to e.
— Lex Fridman (@lexfridman) March 8, 2021
Τροποποιήστε το template3_1.py έτσι ώστε η λύση σας να επιτυγχάνει στο unit test.
Άσκηση E3A2 - Κατεβάστε σε txt μορφή το βιβλίο “Μεταμόρφωση” του Φ. Κάφκα από το https://www.gutenberg.org/ebooks/5200. Γράψτε πρόγραμμα που να διαβάζει το κείμενο. Στη συνέχεια, απομονώστε το κείμενο της πρώτης παραγράφου (One morning…looked), μετατρέψτε το κείμενο σε πεζά γράμματα, και συμπληρώστε τις συναρτήσεις που απαντούν στα ακόλουθα ερωτήματα:
- Ποιο είναι το πλήθος των λέξεων του κειμένου; Για το ερώτημα αυτό όπως και για τα επόμενα θεωρήστε ως λέξεις τις συμβολοσειρές που περιέχουν μόνο χαρακτήρες του αγγλικού αλφαβήτου. Επίσης, μας ενδιαφέρουν μόνο οι διαφορετικές μεταξύ τους λέξεις.
- Ποιο είναι το πλήθος των λέξεων του κειμένου που ξεκινούν με τον χαρακτήρα ‘h’ και τελειώνουν με τον χαρακτήρα ‘e’;
- Ποιο είναι το πλήθος των λέξεων του κειμένου με 5 χαρακτήρες;
- Ποιο είναι το πλήθος λέξεων του κειμένου που περιέχουν συνεχόμενους τους χαρακτήρες ‘a’, ‘s’;
- Ποιο είναι το πλήθος λέξεων του κειμένου που περιέχουν συνεχόμενους τους χαρακτήρες ‘a’, ‘s’ σε οποιαδήποτε σειρά;
- Ποιο είναι το πλήθος λέξεων του κειμένου που ξεκινούν και τελειώνουν με τον ίδιο χαρακτήρα;
- Ποιο είναι το πλήθος λέξεων του κειμένου που ξεκινούν και τελειώνουν με τους δύο ίδιους χαρακτήρες;
Τροποποιήστε το template3_2.py έτσι ώστε η λύση σας να επιτυγχάνει σε όλα τα unit tests.
Άσκηση E3A3 - Κατεβάστε το MovieLens 100K Dataset ml-100k.zip. Εντοπίστε το αρχείο u.data που περιέχει 100.000 αξιολογήσεις από 943 χρήστες για 1.682 ταινίες και το αρχείο u.item που περιέχει τα στοιχεία των ταινιών. Εντοπίστε τις 10 ταινίες με τις καλύτερες αξιολογήσεις κατά μέσο όρο λαμβάνοντας υπόψη μόνο ταινίες που έχουν λάβει τουλάχιστον 50 αξιολογήσεις η κάθε μια. Εμφανίστε τους τίτλους αυτών των ταινιών. Παρατήρηση: Δείτε το αρχείο README στο ml-100k.zip για περιγραφή των περιεχομένων των αρχείων.
Άσκηση E3A4 - Κατεβάστε το ακόλουθο XML αρχείο που περιέχει το πρόγραμμα αγώνων ενός πρωταθλήματος.
ITC2021_Test8_SolGenMethodA.xml
Για κάθε αγώνα εμφανίστε την απόσταση περιόδων ανάμεσα στον αγώνα και στον επαναληπτικό του. Για παράδειγμα, για τις ομάδες 0 και 1 ο αγώνας 0-1 γίνεται στην περίοδο 33 και ο επαναληπτικός αγώνας 1-0 γίνεται στην περίοδο 14, άρα η απόσταση των δύο αγώνων είναι 33-14=19 αγωνιστικές.
Τέταρτο εργαστήριο Python
- Αντικειμενοστραφής Προγραμματισμός
- Κλάσεις και αντικείμενα, ιδιότητες και μέθοδοι
- Κατασκευαστές __init__
- Οι μέθοδοι __str__ και __repr__
- Υπερφόρτωση τελεστών
- Κληρονομικότητα
- Πολυμορφισμός
Ενισχύστε τις γνώσεις σας για τα παραπάνω:
- διαβάζοντας το κεφάλαιο 11 από το Αγγελιδάκης-2015.
- μελετώντας την παρουσίαση Object-Oriented Programming από το PY4E
Άσκηση E4A1 - Δημιουργήστε μια κλάση Car με μέλη δεδομένων τη μάρκα (brand), το μοντέλο (model) και το έτος κατασκευής (year). Υλοποιήστε τη μέθοδο κατασκευής __init__ και τη μέθοδο __str__ που θα εμφανίζει πληροφορίες για κάθε αντικείμενο τύπου Car. Διαβάστε τα ακόλουθα δεδομένα και δημιουργήστε στιγμιότυπα αντικειμένων Car. Ταξινομήστε τα αντικείμενα πρώτα με βάση το έτος κατασκευής, και μετά με βάση τη μάρκα. Εμφανίστε τα ταξινομημένα αντικείμενα.
cars = """
#year,brand,model
1969,Dodge,Charger
1963,Corvette, Stingray
1974,Porsche,914
1969,Chevrolet,Camaro Z28
1967,Toyota,2000GT
1971,Ford,Thunderbird
1991,Dodge,Viper
1966,Lamborghini,Miura
1962,Ferrari,250 GTO
1954,Mercedes,300SL Gullwing"""
Άσκηση E4A2 - Δίνεται ο ακόλουθος κώδικας που ορίζει την κλάση Juice και υπερφορτώνει τον τελεστή +.
class Juice:
def __init__(self, name, capacity):
self.name = name
self.capacity = capacity
def __str__(self):
return (self.name + ' ('+str(self.capacity)+'L)')
def __add__(self, other):
return Juice(self.name + '&' + other.name, self.capacity + other.capacity)
a = Juice('Orange', 1.5)
b = Juice('Apple', 2.0)
result = a + b
print(result)
- Προσθέστε το επιπλέον πεδίο τιμή (price).
- Όταν εφαρμόζεται ο τελεστής πρόσθεσης ο νέος χυμός να έχει τιμή ίση με το άθροισμα τιμών των δύο χυμών.
- Προσθέστε τη μέθοδο pour() που να δέχεται ως παράμετρο μια τιμή από το 0% μέχρι το 100% και να επιστρέφει ένα νέο αντικείμενο Juice με το χυμό που προκύπτει αν ληφθεί το αντίστοιχο ποσοστό περιεχομένου από το καλών αντικείμενο.
Άσκηση E4A3 - Δημιουργήστε μια κλάση Stack που να ορίζει μια στοίβα. Η στοίβα να υποστηρίζει τις λειτουργίες ώθηση (push), απώθηση (pop), εκκαθάριση περιεχομένων στοίβας (clear) και εμφάνιση περιεχομένων στοίβας (με τη χρήση του __str__). Τροποποιήστε το template4_3.py έτσι ώστε η λύση σας να επιτυγχάνει σε όλα τα unit tests.
Άσκηση E4A4 - Κατασκευάστε την κλάση Document που να αναπαριστά ένα έγγραφο που να περιέχει τη λίστα συντακτών του (authors) και την ημερομηνία δημιουργίας του (creation_date). Η κλάση Document να διαθέτει τη μέθοδο add_author για την προσθήκη συντακτών στο έγγραφο. Από την κλάση Document κληρονομήστε σε δύο άλλες κλάσεις, την υποκλάση Book και την υποκλάση Email. Για την υποκλάση Book ορίστε το επιπλέον πεδίο title (τίτλος βιβλίου). Για την υποκλάση Email ορίστε τα επιπλέον πεδία sender (αποστολέας), subject (θέμα), recipients (λίστα παραληπτών). Η υποκλάση Recipient να διαθέτει τη μέθοδο add_recipient για την προσθήλη παραληπτών. Για όλες τις κλάσεις ορίστε κατάλληλους κατασκευαστές και τη συνάρτηση __str__.
- Συμπληρώστε, τον κώδικα στο template4_4.py έτσι ώστε η έξοδος να είναι η ακόλουθη.
Document created at 2022-03-24 09:30:00 authors=Nikos
Document created at 2022-03-24 10:20:00 authors=Petros, Maria
Document created at 2021-01-01 00:00:00 authors=Socrates, Descartes, Nietschie title=Philosophy 101 type=BOOK
Document created at 2022-03-26 10:30:00 authors=Panayiotis sender=Panayiotis subject=Important notice recipients=Maria type=EMAIL
Document created at 2022-03-21 22:45:00 authors=Marianthi, Vasilis sender=Marianthi subject=SPAM recipients=Maria, Christos, Vasilis, Sofia type=EMAIL
- Συμπληρώστε τον κώδικα στη main έτσι ώστε η λίστα εγγράφων να εμφανίζεται ταξινομημένη σε αύξουσα σειρά ημερομηνίας και ώρας δημιουργίας.
Πέμπτο εργαστήριο Python
- Προγραμματισμός με γεγονότα (event driven programming)
- Γραφικές διεπαφές με το tkinter (GUIs = Graphical User Interfaces)
- Η βιβλιοθήκη matplotlib για τη σχεδίαση γραφημάτων
- Το μοντέλο MVC (Model View Controller)
- Άλλες βιβλιοθήκες κατασκευής γραφικών διεπαφών πέρα από την tkinter: PySimpleGUI, PyQt5, wxPython
Ενισχύστε τις γνώσεις σας για τα παραπάνω:
- διαβάζοντας για το tkinter το κεφάλαιο 12 από το Αγγελιδάκης-2015.
- ακολουθώντας τα tutorials για το tkinter του pythontutorial
- ιδιαίτερα το Switching between Frames
- και το Tkinter MVC
- και το Tkinter Matplotlib
Άσκηση E5A1 - Δημιουργήστε ένα πρόγραμμα το οποίο να υλοποιεί μια λίστα εργασιών (todo list) μέσω ενός γραφικού περιβάλλοντος διεπαφής. Ο χρήστης να μπορεί να εισάγει εργασίες στη λίστα και να διαγράφει εργασίες από τη λίστα. Να μην επιτρέπεται η εισαγωγή της ίδιας εργασίας πάνω από μια φορά στη λίστα εργασιών.
Άσκηση E5A2 - Δημιουργήστε ένα πρόγραμμα που να διαχειρίζεται επαφές (contacts). Για κάθε επαφή να διατηρούνται οι πληροφορίες, επώνυμο, όνομα, τηλέφωνο. Να παρέχεται λειτουργικότητα CRUD (Create, Retrieve, Update, Delete). Τα δεδομένα να αποθηκεύονται σε αρχείο contacts.csv και να ανακαλούνται από αυτό κατά την εκκίνηση του προγράμματος.
Άσκηση E5A3 - Δημιουργήστε ένα πρόγραμμα που να απεικονίζει σε ένα γράφημα τις θερμοκρασίες για τις 5 τελευταίες ημέρες στην πόλη Άρτα [39.1606, 20.9853]. Χρησιμοποιήστε το module matplotlib για τη σχεδίαση του γραφήματος και για τη λήψη των θερμοκρασιών το OpenWeathermap API.
Άσκηση E5A4 - Χρησιμοποιήστε το pattern MVC έτσι ώστε να αναπτύξετε μια εφαρμογή που να πραγματοποιεί πράξεις πρόσθεσης, αφαίρεσης, πολλαπλασιασμού και διαίρεσης με μιγαδικούς αριθμούς. Στο ρόλο του view να μπορεί να εναλλάσσεται γραφικό περιβάλλον (GUI) και περιβάλλον κειμένου (TUI=Text User Interface).
Πρώτο εργαστήριο Haskell
- Από το Haskell wikibook Haskell Basics
- Εγκατάσταση της Haskell, ghci 1.1
- Μεταβλητές, συναρτήσεις, αρχεία πηγαίου κώδικα, where 1.2
- Τιμές αλήθειας, guards 1.3
- Τύποι 1.4
- Λίστες (συναρτήσεις head και tail), πλειάδες (συναρτήσεις fst και snd) 1.5
- Πολυμορφικοί τύποι, Num, Eq 1.6
- if/then/else/, pattern matching, let bindings 1.7
- Σύνθεση συναρτήσεων (composition), βιβλιοθήκες 1.8
- Είσοδος, έξοδος 1.9
Ενισχύστε τις γνώσεις σας για τα παραπάνω:
Άσκηση Ε6Α1 Γράψτε μια συνάρτηση που να υπολογίζει τον όγκο ενός κουτιού δεχόμενη ως είσοδο το πλάτος, το μήκος και το ύψος του, και μια συνάρτηση που να υπολογίζει τον όγκο μιας πυραμίδας με τετραγωνική βάση δεχόμενη το μήκος της πλευράς της βάσης της πυραμίδας και το ύψος της πυραμίδας. Γράψτε ένα πρόγραμμα σε Haskell που να ζητά από το χρήστη τις διαστάσεις μιας πυραμίδας με τετραγωνική βάση (μήκος πλευράς βάσης και ύψος σε μέτρα) και να υπολογίζει πόσα πέτρινα τούβλα χρειάζονται κατά προσέγγιση για να καλυφθεί ο όγκος της πυραμίδας αν κάθε τούβλο έχει μήκος 19 εκατοστά, πλάτος 9 εκατοστά και ύψος 6 εκατοστά. Δίνεται ότι ο όγκος μιας πυραμίδας είναι ίσος με το ένα τρίτο του γινομένου του εμβαδού της βάσης της πυραμίδας επί το ύψος της.
Άσκηση Ε6Α2 Οι αντιστάσεις έχουν έναν χρωματικό κώδικα που υποδεικνύει πόσα Ohms είναι η κάθε μια. Ο κώδικας αποτελείται από τρεις γραμμές και κάθε μία γραμμή υποδηλώνει ένα ψηφίο (black=0, brown=1, red=2, orange=3, yellow=4, green=5, blue=6 violet=7, grey=8, white=9). Η χωρητικότητα σε Ohms υπολογίζεται ως εξής. Η πρώτη γραμμή αντιστοιχεί στο πλέον αριστερό ψηφίο, η δεύτερη γραμμή στο αμέσως επόμενο και η τρίτη γραμμή σε ποσα μηδενικά ακολουθούν. Έτσι, για παράδειγμα ο συνδυασμός violet, grey, red υποδηλώνει 7800 Ohms. Γράψτε ένα πρόγραμμα σε Haskell που για μια αντίσταση ο χρήστης να δίνει τρία χρώματα στη σειρά και το πρόγραμμα να εμφανίζει τα Ohms της αντίστασης.
Άσκηση Ε6Α3
Κατασκευάστε μια συνάρτηση με όνομα inRange
που να δέχεται τρία ορίσματα min
, max
και x
(ακέραιες τιμές) και να επιστρέφει True
ή False
ανάλογα με το αν το x
βρίσκεται στο διάστημα [min,max] ή όχι. Καλέστε τη συνάρτηση από κύριο πρόγραμμα για 3 τιμές που θα δίνει ο χρήστης και εμφανίστε κατάλληλα μηνύματα. Γράψτε 3 επιπλέον εναλλακτικές υλοποιήσεις της inRange χρησιμοποιώντας α) let bindings, β) where και γ) guards.
Δεύτερο εργαστήριο Haskell
- Από το Haskell wikibook Elementary Haskell
Ενισχύστε τις γνώσεις σας για τα παραπάνω:
Άσκηση Ε7Α1 Γράψτε τις ακόλουθες αναδρομικές συναρτήσεις που αφορούν αριθμητικές τιμές.
doubleFactorial n
, που υπολογίζει το διπλό παραγοντικό ενός αριθμούn
. Το διπλό παραγοντικό ορίζεται ως το γινόμενο όλων των ακεραίων από το 1 μέχρι και τον αριθμόn
που είναι είτε άρτιοι είτε περιττοί, ανάλογα με το εάν τοn
είναι άρτιο ή περιττό αντίστοιχα (π.χ. το διπλό παραγοντικό του 7 είναι 1 * 3 * 5 * 7 = 105).power x, y
, που υπολογίζει τοx^y
(μεx
καιy
ακέραιες θετικές τιμές)- Έστω ότι δίνεται η συνάρτηση
plusOne x = x + 1
. Χωρίς να χρησιμοποιήσετε τον τελεστή+
, ορίστε τη συνάρτησηaddition
έτσι ώστε ηaddition x y
να προσθέτει ταx
καιy
. log2 x
, που υπολογίζει τον ακέραιο λογάριθμο με βάση 2 του ορίσματος που δέχεται (π.χ.log2 1 = 0
,log2 16 = 4
,log2 11 = 3
).
Άσκηση Ε7Α2 Γράψτε τις ακόλουθες αναδρομικές συναρτήσεις που αφορούν λίστες. Προσέξτε ότι όλες οι ακόλουθες συναρτήσεις υπάρχουν στο Prelude, άρα θα πρέπει να δοθούν διαφορετικά ονόματα για τους ελέγχους σας με το GHCi.
replicate :: Int -> a -> [a]
, που λαμβάνει έναν μετρητή και ένα στοιχείο και επιστρέφει μια λίστα στην οποία το στοιχείο επαναλαμβάνεταιcount
φορές. Για παράδειγμαreplicate 3 'a' = "aaa"
.valueAt :: [a] -> Int -> a
, που επιστρέφει το στοιχείο σε μια συγκεκριμένη θέση. Το πρώτο στοιχείο βρίσκεται στη θέση 0, το δεύτερο στη θέση 1, κ.λπ. (π.χ.valueAt [7,8,1,3] 2 = 1
). Η συνάρτηση αυτή υπάρχει στο Prelude και είναι η(!!)
.zip :: [a] -> [b] -> [(a, b)]
, που δέχεται δύο λίστες και τις συνδυάζει, έτσι ώστε, στη λίστα που προκύπτει, το πρώτο ζεύγος να σχηματίζεται από τα στοιχεία στην πρώτη θέση των δύο λιστών, το δεύτερο ζεύγος στη λίστα να σχηματίζεται από τα στοιχεία στη δεύτερη θέση των δύο λιστών κ.ο.κ. Για παράδειγμαzip [1,2,3] "abc" = [(1, 'a'), (2, 'b'), (3, 'c')]
. Αν οι δύο λίστες δεν έχουν το ίδιο μέγεθος τότε σταματάμε όταν μια από τις δύο λίστες δεν έχει πλέον στοιχεία.
Άσκηση Ε7Α3 Γράψτε τις ακόλουθες αναδρομικές συναρτήσεις, προσθέτοντας και τις κατάλληλες υπογραφές τύπων.
takeInt
, επιστρέφει τα πρώταn
στοιχεία μιας λίστας. Για παράδειγμα, ηtakeInt 4 [11,21,31,41,51,61]
θα πρέπει να επιστρέφει[11,21,31,41]
. Η συνάρτηση αυτή υπάρχει στο Prelude με όνομα take.dropInt
, αφαιρεί τα πρώτα n στοιχεία μιας λίστας και επιστρέφει τα υπόλοιπα. Για παράδειγμα, ηdropInt 3 [11,21,31,41,51]
θα πρέπει να επιστρέφει[41,51]
. Η συνάρτηση αυτή υπάρχει στο Prelude με όνομαdrop
.sumInt
, επιστρέφει το άθροισμα των στοιχείων μιας λίστας. Η συνάρτηση αυτή υπάρχει στο Prelude με όνομαsum
.scanSum
, προσθέτει τα στοιχεία μιας λίστας και επιστρέφει μια λίστα με τα συσσωρευτικά αθροίσματα. Για παράδειγμα, ηscanSum [2,3,4,5]
θα πρέπει να επιστρέφει[2,5,9,14]
.
Άσκηση Ε7Α4 Υλοποιήστε τα ακόλουθα:
- Χρησιμοποιήστε τη συνάρτηση
map
για να δημιουργήσετε συναρτήσεις που δεδομένης μιας λίσταςxs
με ακεραίους να επιστρέφει:- Μια λίστα με το αντίθετο κάθε στοιχείου. Χρησιμοποιήστε τη συνάρτηση
negate
. - Μια λίστα με λίστες ακεραίων
xss
, που για κάθε στοιχείο τουxs
, να περιέχει τους διαιρέτες τουxs
. Χρησιμοποιήστε τη συνάρτησηdivisors p = [ f | f <- [1..p], p `mod` f == 0 ]
για να λάβετε τους διαιρέτες.
- Μια λίστα με το αντίθετο κάθε στοιχείου. Χρησιμοποιήστε τη συνάρτηση
Πρώτο εργαστήριο Prolog
- Εγκατάσταση Prolog SWI-Prolog
- Από το Learn Prolog Now (LPN)
Ενισχύστε τις γνώσεις σας για τα παραπάνω:
Άσκηση Ε8Α1 Δημιουργήστε βάση γνώσης με τα παρακάτω γεγονότα (facts):
- Ο Σωκράτης είναι φιλόσοφος.
- Ο Πλάτωνας είναι φιλόσοφος.
- Ο Περικλής είναι πολιτικός.
Προσθέστε τους εξής κανόνες (rules):
- Οι φιλόσοφοι είναι άνθρωποι.
- Οι πολιτικοί είναι άνθρωποι.
- Οι άνθρωποι είναι θηλαστικά.
- Τα θηλαστικά είναι θνητά.
Κάντε τις εξής ερωτήσεις (queries):
- Είναι ο Σωκράτης φιλόσοφος;
- Είναι ο Περικλής φιλόσοφος;
- Είναι ο Σωκράτης θηλαστικό;
- Είναι ο Περικλής θνητός;
- Ποιοι οντότητες είναι θνητές στη βάση γνώσης;
Άσκηση Ε8Α2 Δημιουργήστε το κατηγόρημα half_adder/4 που να υλοποιεί ένα κύκλωμα ημιαθροιστή. Δώστε 2 εναλλακτικές υλοποιήσεις με βάση τις ακόλουθες πληροφορίες.
Δίνεται ο πίνακας αληθείας του ημιαθροιστή:
X | Y | C | S |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
Τα X, Y είναι τα bits εισόδου, C είναι το bit κρατουμένου και S είναι το bit αθροίσματος.
Κάντε τις ακόλουθες ερωτήσεις;
- Ποιες είναι οι είσοδοι που δίνουν στο bit αθροίσματος την τιμή 1;
- Τι τιμή λαμβάνει το bit αθροίσματος αν το bit κρατουμένου είναι 1;
Άσκηση Ε8Α3 Έστω το ακόλουθο γενεαλογικό δένδρο:
a
/ \
b c
/ \ |
d e f
parent(a,b).
parent(a,c).
parent(b,d).
parent(b,e).
parent(c,f).
Το κατηγόρημα parent(X,Y)
ερμηνεύεται ως ότι ο X
είναι γονέας του Υ
.
Ορίστε τα κατηγορήματα:
sibling(X,Y)
Ισχύει όταν οΧ
και οΥ
είναι αδέρφια.cousin(X,Y)
Ισχύει όταν οΧ
και οΥ
είναι ξαδέρφια.grandchild(X,Y)
Ισχύει όταν οΧ
είναι εγγονός τουΥ
.descendent(X,Y)
Ισχύει όταν οΧ
είναι απόγονος τουΥ
.
Υποβάλετε ερωτήματα που θα εμφανίζουν:
- τα ζεύγη των αδερφών
- τα ζεύγη των ξαδερφιών
- τα εγγόνια του a
- τους απογόνους του a
Άσκηση Ε8Α4 Δίνεται ο ορισμός του κατηγορήματος factorial/2
που υπολογίζει το παραγοντικό ενός ακεραίου αριθμού.
factorial(0,1).
factorial(N,F) :-
N>0,
N1 is N-1,
factorial(N1,F1),
F is F1*N.
Ορίστε κατηγόρημα doublefactorial/2
που να υπολογίζει το διπλό παραγοντικό ενός αριθμού n
. Το διπλό παραγοντικό ορίζεται ως το γινόμενο όλων των ακεραίων από το 1 μέχρι και τον αριθμό n
που είναι είτε άρτιοι είτε περιττοί, ανάλογα με το εάν το n
είναι άρτιο ή περιττό αντίστοιχα (π.χ. το διπλό παραγοντικό του 7 είναι 1 * 3 * 5 * 7 = 105).
Δεύτερο εργαστήριο Prolog
- Από το Learn Prolog Now (LPN)
Ενισχύστε τις γνώσεις σας για τα παραπάνω:
Άσκηση Ε9Α1
Έστω ένας χάρτης με αριθμημένες περιοχές. Η πληροφορία για τις περιοχές του χάρτη που συνορεύουν δίνεται με μια λίστα της μορφής [[1,2],[1,3],[1,4],[1,5],[2,3],[2,4],[3,4],[4,5]]
που σημαίνει ότι η περιοχή 1 συνορεύει με τις περιοχές 2, 3, 4, 5, κ.ο.κ. Κατασκευάστε το κατηγόρημα adjacent(X,Y,Map)
με ορίσματα X
και Y
, 2 αριθμούς περιοχών και Map
τη λίστα με τις περιοχές που συνορεύουν. Το κατηγόρημα adjacent/3
να επαληθεύεται όταν οι 2 περιοχές είναι γειτονικές.
, ο χάρτης
[[1,2],[1,3],[1,4],[1,5],[2,3],[2,4],[3,4],[4,5]]
Θέστε τα ακόλουθα ερωτήματα:
- Είναι οι περιοχές 4 και 2 γειτονικές στον παραπάνω χάρτη;
- Είναι οι περιοχές 5 και 2 γειτονικές στον παραπάνω χάρτη;
Έστω ότι επιθυμούμε να ελέγξουμε αν ένας χρωματισμός περιοχών είναι έγκυρος, δηλαδή αν δεν υπάρχουν γειτονικές περιοχές που να έχουν χρωματιστεί με το ίδιο χρώμα. Κατασκευάστε το κατηγόρημα conflict(Map, Coloring)
που δέχεται μια λίστα Map
όπως στο προηγούμενο κατηγόρημα και μια λίστα Coloring
της μορφής [[5,red],[4,red],[3,blue],[1,blue],[2,yellow]]
που σημαίνει ότι η περιοχή 5 χρωματίζεται κόκκινη κ.ο.κ. Το κατηγόρημα conflict/2
να επαληθεύεται αν υπάρχει σύγκρουση χρωμάτων.
Θέστε τα ακόλουθα ερωτήματα:
- Έχει ο χρωματισμός
[[5,red],[4,red],[3,blue],[1,blue],[2,yellow]]
για τον παραπάνω χάρτη σύγκρουση; - Έχει ο χρωματισμός
[[5,blue],[4,red],[3,yellow],[1,green],[2,blue]]
για τον παραπάνω χάρτη σύγκρουση;
Άσκηση Ε9Α2
Το κατηγόρημα max\3
πρέπει να επαληθεύεται όταν το τρίτο όρισμα είναι η μεγαλύτερη τιμή των 2 πρώτων ορισμάτων. Δίνεται η ακόλουθη υλοποίηση με χρήση cut. Μπορείτε να εντοπίσετε κάποιο παράδειγμα για το οποίο δεν λειτουργεί σωστά; Γιατί; Διορθώστε το.
max(X,Y,Y) :- Y>X, !.
max(X,_,X).
Άσκηση Ε9Α3
Με τη χρήση της βιβλιοθήκης CLPFD, εντοπίστε όλες τις τιμές των X
, Y
και Z
με πεδία τιμών ακέραιους από το 1 μέχρι και το 20 για τις οποίες το άθροισμά τους είναι 15, η X
είναι μεγαλύτερη από την Y
και η Ζ
είναι διπλάσια ή μεγαλύτερη της Y
.
Άσκηση Ε9Α4
Με τη χρήση της βιβλιοθήκης CLPFD, λύστε το κρυπταριθμητικό παζλ SEND + MORE = MONEY
στο οποίο κάθε χαρακτήρας πρέπει να αντικατασταθεί με ένα ψηφίο έτσι ώστε η παραπάνω πράξη να είναι ορθή.