View on GitHub

dituoi_agp

Αρχές Γλωσσών Προγραμματισμού

ΑΡΧΕΣ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Πανεπιστήμιο Ιωαννίνων - Τμήμα Πληροφορικής και Τηλεπικοινωνιών

Γκόγκος Χρήστος - Άρτα@2022

e-course μαθήματος: http://ecourse.uoi.gr/course/view.php?id=1945

Τελευταία ενημέρωση: 3/6/2022

Εργασίες

1. ΘΕΩΡΙΑ

Σημειώσεις μελέτης και διαφάνειες για το Αρχές Γλωσσών Προγραμματισμού 11η εκδ., Robert W. Sebesta

2. ΕΡΓΑΣΤΗΡΙΟ

Πρώτο εργαστήριο Python

Ενισχύστε τις γνώσεις σας για τα παραπάνω :

Άσκηση 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, χωρίς διάκριση πεζών και κεφαλαίων, στο παραπάνω κείμενο.

Λύσεις ασκήσεων εργαστηρίου 1


Δεύτερο εργαστήριο Python

Ενισχύστε τις γνώσεις σας για τα παραπάνω :

Άσκηση 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 που να κάνουν τα ακόλουθα:

Τροποποιήστε το template2_4.py έτσι ώστε η λύση σας να επιτυγχάνει σε όλα τα unit tests.

Λύσεις ασκήσεων εργαστηρίου 2


Τρίτο εργαστήριο Python

Ενισχύστε τις γνώσεις σας για τα παραπάνω:

Άσκηση 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), μετατρέψτε το κείμενο σε πεζά γράμματα, και συμπληρώστε τις συναρτήσεις που απαντούν στα ακόλουθα ερωτήματα:

  1. Ποιο είναι το πλήθος των λέξεων του κειμένου; Για το ερώτημα αυτό όπως και για τα επόμενα θεωρήστε ως λέξεις τις συμβολοσειρές που περιέχουν μόνο χαρακτήρες του αγγλικού αλφαβήτου. Επίσης, μας ενδιαφέρουν μόνο οι διαφορετικές μεταξύ τους λέξεις.
  2. Ποιο είναι το πλήθος των λέξεων του κειμένου που ξεκινούν με τον χαρακτήρα ‘h’ και τελειώνουν με τον χαρακτήρα ‘e’;
  3. Ποιο είναι το πλήθος των λέξεων του κειμένου με 5 χαρακτήρες;
  4. Ποιο είναι το πλήθος λέξεων του κειμένου που περιέχουν συνεχόμενους τους χαρακτήρες ‘a’, ‘s’;
  5. Ποιο είναι το πλήθος λέξεων του κειμένου που περιέχουν συνεχόμενους τους χαρακτήρες ‘a’, ‘s’ σε οποιαδήποτε σειρά;
  6. Ποιο είναι το πλήθος λέξεων του κειμένου που ξεκινούν και τελειώνουν με τον ίδιο χαρακτήρα;
  7. Ποιο είναι το πλήθος λέξεων του κειμένου που ξεκινούν και τελειώνουν με τους δύο ίδιους χαρακτήρες;

Τροποποιήστε το 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 αγωνιστικές.

Λύσεις ασκήσεων εργαστηρίου 3


Τέταρτο εργαστήριο Python

Ενισχύστε τις γνώσεις σας για τα παραπάνω:

Άσκηση 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)

Άσκηση 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__.

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

Λύσεις ασκήσεων εργαστηρίου 4


Πέμπτο εργαστήριο Python

Ενισχύστε τις γνώσεις σας για τα παραπάνω:

Άσκηση 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).

Λύσεις ασκήσεων εργαστηρίου 5


Πρώτο εργαστήριο Haskell

Ενισχύστε τις γνώσεις σας για τα παραπάνω:

Άσκηση Ε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.

Λύσεις ασκήσεων εργαστηρίου 6


Δεύτερο εργαστήριο Haskell

Ενισχύστε τις γνώσεις σας για τα παραπάνω:

Άσκηση Ε7Α1 Γράψτε τις ακόλουθες αναδρομικές συναρτήσεις που αφορούν αριθμητικές τιμές.

  1. doubleFactorial n , που υπολογίζει το διπλό παραγοντικό ενός αριθμού n. Το διπλό παραγοντικό ορίζεται ως το γινόμενο όλων των ακεραίων από το 1 μέχρι και τον αριθμό n που είναι είτε άρτιοι είτε περιττοί, ανάλογα με το εάν το n είναι άρτιο ή περιττό αντίστοιχα (π.χ. το διπλό παραγοντικό του 7 είναι 1 * 3 * 5 * 7 = 105).
  2. power x, y, που υπολογίζει το x^y (με x και y ακέραιες θετικές τιμές)
  3. Έστω ότι δίνεται η συνάρτηση plusOne x = x + 1. Χωρίς να χρησιμοποιήσετε τον τελεστή +, ορίστε τη συνάρτηση addition έτσι ώστε η addition x y να προσθέτει τα x και y.
  4. log2 x, που υπολογίζει τον ακέραιο λογάριθμο με βάση 2 του ορίσματος που δέχεται (π.χ. log2 1 = 0, log2 16 = 4, log2 11 = 3).

Άσκηση Ε7Α2 Γράψτε τις ακόλουθες αναδρομικές συναρτήσεις που αφορούν λίστες. Προσέξτε ότι όλες οι ακόλουθες συναρτήσεις υπάρχουν στο Prelude, άρα θα πρέπει να δοθούν διαφορετικά ονόματα για τους ελέγχους σας με το GHCi.

  1. replicate :: Int -> a -> [a], που λαμβάνει έναν μετρητή και ένα στοιχείο και επιστρέφει μια λίστα στην οποία το στοιχείο επαναλαμβάνεται count φορές. Για παράδειγμα replicate 3 'a' = "aaa".
  2. valueAt :: [a] -> Int -> a, που επιστρέφει το στοιχείο σε μια συγκεκριμένη θέση. Το πρώτο στοιχείο βρίσκεται στη θέση 0, το δεύτερο στη θέση 1, κ.λπ. (π.χ. valueAt [7,8,1,3] 2 = 1). Η συνάρτηση αυτή υπάρχει στο Prelude και είναι η (!!).
  3. zip :: [a] -> [b] -> [(a, b)], που δέχεται δύο λίστες και τις συνδυάζει, έτσι ώστε, στη λίστα που προκύπτει, το πρώτο ζεύγος να σχηματίζεται από τα στοιχεία στην πρώτη θέση των δύο λιστών, το δεύτερο ζεύγος στη λίστα να σχηματίζεται από τα στοιχεία στη δεύτερη θέση των δύο λιστών κ.ο.κ. Για παράδειγμα zip [1,2,3] "abc" = [(1, 'a'), (2, 'b'), (3, 'c')]. Αν οι δύο λίστες δεν έχουν το ίδιο μέγεθος τότε σταματάμε όταν μια από τις δύο λίστες δεν έχει πλέον στοιχεία.

Άσκηση Ε7Α3 Γράψτε τις ακόλουθες αναδρομικές συναρτήσεις, προσθέτοντας και τις κατάλληλες υπογραφές τύπων.

  1. takeInt, επιστρέφει τα πρώτα n στοιχεία μιας λίστας. Για παράδειγμα, η takeInt 4 [11,21,31,41,51,61] θα πρέπει να επιστρέφει [11,21,31,41]. Η συνάρτηση αυτή υπάρχει στο Prelude με όνομα take.
  2. dropInt, αφαιρεί τα πρώτα n στοιχεία μιας λίστας και επιστρέφει τα υπόλοιπα. Για παράδειγμα, η dropInt 3 [11,21,31,41,51] θα πρέπει να επιστρέφει [41,51]. Η συνάρτηση αυτή υπάρχει στο Prelude με όνομα drop.
  3. sumInt, επιστρέφει το άθροισμα των στοιχείων μιας λίστας. Η συνάρτηση αυτή υπάρχει στο Prelude με όνομα sum.
  4. scanSum, προσθέτει τα στοιχεία μιας λίστας και επιστρέφει μια λίστα με τα συσσωρευτικά αθροίσματα. Για παράδειγμα, η scanSum [2,3,4,5] θα πρέπει να επιστρέφει [2,5,9,14].

Άσκηση Ε7Α4 Υλοποιήστε τα ακόλουθα:

  1. Χρησιμοποιήστε τη συνάρτηση map για να δημιουργήσετε συναρτήσεις που δεδομένης μιας λίστας xs με ακεραίους να επιστρέφει:
    • Μια λίστα με το αντίθετο κάθε στοιχείου. Χρησιμοποιήστε τη συνάρτηση negate.
    • Μια λίστα με λίστες ακεραίων xss, που για κάθε στοιχείο του xs, να περιέχει τους διαιρέτες του xs. Χρησιμοποιήστε τη συνάρτηση divisors p = [ f | f <- [1..p], p `mod` f == 0 ] για να λάβετε τους διαιρέτες.

Λύσεις ασκήσεων εργαστηρίου 7


Πρώτο εργαστήριο Prolog

Ενισχύστε τις γνώσεις σας για τα παραπάνω:

Άσκηση Ε8Α1 Δημιουργήστε βάση γνώσης με τα παρακάτω γεγονότα (facts):

  1. Ο Σωκράτης είναι φιλόσοφος.
  2. Ο Πλάτωνας είναι φιλόσοφος.
  3. Ο Περικλής είναι πολιτικός.

Προσθέστε τους εξής κανόνες (rules):

  1. Οι φιλόσοφοι είναι άνθρωποι.
  2. Οι πολιτικοί είναι άνθρωποι.
  3. Οι άνθρωποι είναι θηλαστικά.
  4. Τα θηλαστικά είναι θνητά.

Κάντε τις εξής ερωτήσεις (queries):

  1. Είναι ο Σωκράτης φιλόσοφος;
  2. Είναι ο Περικλής φιλόσοφος;
  3. Είναι ο Σωκράτης θηλαστικό;
  4. Είναι ο Περικλής θνητός;
  5. Ποιοι οντότητες είναι θνητές στη βάση γνώσης;

Άσκηση Ε8Α2 Δημιουργήστε το κατηγόρημα half_adder/4 που να υλοποιεί ένα κύκλωμα ημιαθροιστή. Δώστε 2 εναλλακτικές υλοποιήσεις με βάση τις ακόλουθες πληροφορίες.

Half adder

Δίνεται ο πίνακας αληθείας του ημιαθροιστή:

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 αθροίσματος.

Κάντε τις ακόλουθες ερωτήσεις;

  1. Ποιες είναι οι είσοδοι που δίνουν στο bit αθροίσματος την τιμή 1;
  2. Τι τιμή λαμβάνει το 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 είναι γονέας του Υ.

Ορίστε τα κατηγορήματα:

Υποβάλετε ερωτήματα που θα εμφανίζουν:

  1. τα ζεύγη των αδερφών
  2. τα ζεύγη των ξαδερφιών
  3. τα εγγόνια του a
  4. τους απογόνους του a

Άσκηση Ε8Α4 Δίνεται ο ορισμός του κατηγορήματος factorial/2 που υπολογίζει το παραγοντικό ενός ακεραίου αριθμού.

factorial(0,1).
factorial(N,F) :-
    N>0,
    N1 is N-1,
    factorial(N1,F1),
    F is F1*N.

factorial.pl

Ορίστε κατηγόρημα doublefactorial/2 που να υπολογίζει το διπλό παραγοντικό ενός αριθμού n. Το διπλό παραγοντικό ορίζεται ως το γινόμενο όλων των ακεραίων από το 1 μέχρι και τον αριθμό n που είναι είτε άρτιοι είτε περιττοί, ανάλογα με το εάν το n είναι άρτιο ή περιττό αντίστοιχα (π.χ. το διπλό παραγοντικό του 7 είναι 1 * 3 * 5 * 7 = 105).

Λύσεις ασκήσεων εργαστηρίου 8

Δεύτερο εργαστήριο Prolog

Ενισχύστε τις γνώσεις σας για τα παραπάνω:

Άσκηση Ε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]]

Θέστε τα ακόλουθα ερωτήματα:

Έστω ότι επιθυμούμε να ελέγξουμε αν ένας χρωματισμός περιοχών είναι έγκυρος, δηλαδή αν δεν υπάρχουν γειτονικές περιοχές που να έχουν χρωματιστεί με το ίδιο χρώμα. Κατασκευάστε το κατηγόρημα conflict(Map, Coloring) που δέχεται μια λίστα Map όπως στο προηγούμενο κατηγόρημα και μια λίστα Coloring της μορφής [[5,red],[4,red],[3,blue],[1,blue],[2,yellow]] που σημαίνει ότι η περιοχή 5 χρωματίζεται κόκκινη κ.ο.κ. Το κατηγόρημα conflict/2 να επαληθεύεται αν υπάρχει σύγκρουση χρωμάτων.

Θέστε τα ακόλουθα ερωτήματα:

Άσκηση Ε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 στο οποίο κάθε χαρακτήρας πρέπει να αντικατασταθεί με ένα ψηφίο έτσι ώστε η παραπάνω πράξη να είναι ορθή.

Λύσεις ασκήσεων εργαστηρίου 9