Ευφυής Προγραμματισμός Ενότητα 1: Εισαγωγή στη Γλώσσα Lisp Ιωάννης Χατζηλυγερούδης Πολυτεχνική Σχολή Τμήμα Μηχανικών Η/Υ & Πληροφορικής
Περιεχόμενα ενότητας Εισαγωγή στη Lisp : 1. Εισαγωγή 2. Θεμελιώδεις Συναρτήσεις 2
Εισαγωγή
Εισαγωγή Η Γλώσσα Lisp είναι μια από τις παλαιότερες Γλώσσες και δημιουργήθηκε το 1948 από τον John McCarthy. Ανήκει στην κατηγορία των συναρτησιακών γλωσσών (functional languages), στηρίζεται δηλ. στη μαθηματική θεωρία των αναδρομικών συναρτήσεων. Βασική Δομή Δεδομένων στη Lisp είναι η λίστα (LiSt Processing) 4
LISP Γλώσσα ΤΝ Εισαγωγή Συμβολικός υπολογισμός (δημιουργία και διαχείριση συμβολικών δομών) Συναρτησιακή γλώσσα Βασικό στοιχείο προγράμματος η συνάρτηση Απουσία πλευρικών αποτελεσμάτων (με εξαιρέσεις) Αναδρομική φύση 5
Εισαγωγή Συμβολικές εκφράσεις ή Σ-εκφράσεις (Sexpressions) Τα δομικά στοιχεία της γλώσσας Αναπαριστούν και δεδομένα (μη εκτιμήσιμα στοιχεία) και προγράμματα (εκτιμήσιμα στοιχεία) 6
Εισαγωγή Συναρτησιακός Τύπος ή Τύπος (Form) Σ-έκφραση προς εκτίμηση Πρόγραμμα LISP: Σύνολο συναρτήσεων, που εκφράζονται ως συναρτησιακοί τύποι, όπου η μια συνάρτηση μπορεί να καλεί μια ή περισσότερες συναρτήσεις και τον εαυτό της. 7
Εισαγωγή Κύκλος εκτέλεσης διερμηνευτή: ΑΝΑΓΝΩΣΗ-ΕΚΤΙΜΗΣΗ-ΕΚΤΥΠΩΣΗ (READ-EVAL-PRINT) ΑΝΑΓΝΩΣΗ: Ανάγνωση του προγράμματος και κρατούνται θέσεις μνήμης για τις μεταβλητές και τις παραμέτρους λέγεται δέσμευση( binding) ΕΚΤΙΜΗΣΗ: Βρίσκεται το αποτέλεσμα των συμβολικών εκφράσεων και των συναρτησιακών τύπων ΕΚΤΥΠΩΣΗ:Εκτυπώνεται στην οθόνη το αποτέλεσμα ή (η έξοδος) του προγράμματος 8
Σ-Εκφράσεις Ακέραιος Πχ. 3, 5,7 Αριθμός Ρητός Πχ. 15/4 Σ-Εκφράσεις Άτομο Ακολουθία Δομή Σύμβολο Πχ. x,y,b2f,w Λίστα Πχ. (1 2 d 3),(a (1 2) (b d) Συμβολοσειρά Πχ. "a","giannis, My name is Πραγματικός Πχ. -7.53, 10.5 9
Σ-Εκφράσεις Ειδικά σύμβολα: Τ (true) -Αληθές NIL (κενή λίστα: () ) και αντιπροσωπεύει το ψευδές Λίστα: (e 1 e 2 e n ), όπου e i άτομο ή λίστα Μπορεί να είναι απεριόριστου βάθους και μήκους. Συναρτησιακός τύπος ή Τύπος: (<function-name> <arg 1 > <arg n >) <function-name>=όνομα της συνάρτησης <arg i > = συμβολική έκφραση ή συναρτησιακός τύπος 10
Εκτίμηση 1/3 Κανόνες Εκτίμησης-Χρήση Quote Κάθε αριθμός εκτιμάται στον εαυτό του. Π.χ. > 8 8 Τα ειδικά σύμβολα εκτιμώνται στον εαυτό τους. Π.χ. > t T > nil NIL Κάθε σύμβολο εκτιμάται στην τιμή του, πλην χρήσης quote ('), οπότε εκτιμάται στον εαυτό του. 11
Εκτίμηση 2/3 Κάθε σύμβολο χωρίς quote είναι μια μεταβλητή (ή παράμετρος). Με quote είναι μια σταθερά. Μεταβλητή που δεν της έχει δοθεί τιμή, έχει την τιμή NIL. Π.χ. > x 7 (η τιμή της) > 'x X Κάθε λίστα εκτιμάται στην τιμή της, πλην χρήσης quote ('), οπότε εκτιμάται στον εαυτό της. Μια λίστα χωρίς quote είναι ένας συναρτησιακός τύπος, αλλιώς μια τιμή 12
Εκτίμηση 3/3 Εκτίμηση ενός τύπου σημαίνει εκτίμηση των ορισμάτων του και εφαρμογή της αντίστοιχης συνάρτησης στα αποτελέσματα. Π.χ. > (+ 4 8) 12 > (* 4 (+ 3 5)) 32 > '(1 2 3) (1 2 3) Εκτίμηση κατ απαίτηση-χρήση eval :Η συνάρτηση eval εκτελεί αναγκαστική εκτίμηση μιας σ-έκφρασης. Π.χ. > ' (/ 9 3) (/ 9 3) > (eval '(/ 9 3)) 3 13
Εσωτερική Αναπαράσταση Άτομο Μια θέση μνήμης Ζεύγος Δύο θέσεις μνήμης Μια κυψέλη cons Λίστα Μια συλλογή θέσεων μνήμης Σύνδεση με κυψέλες cons (δυαδικό δένδρο) 14
Εσωτερική Αναπαράσταση Κυψέλη cons Διεύθυνση θέσης μνήμης ή NIL (A) A NIL (A B C) A B C NIL 15
Θεμελιώδεις Συναρτήσεις
Συναρτήσεις Διαχείρισης Λιστών(1) Συναρτήσεις Προσπέλασης: car (first): (car <list>) επιστρέφει το πρώτο στοιχείο. Πχ. >(car '(1 2 3 4)) 1 >(car '( (1 2) a b)) (1 2) cdr (rest): (cdr <list>) επιστρέφει λίστα χωρίς το πρώτο στοιχείο. Πχ. >(cdr '(1 2 3 4)) (2 3 4) >(cdr '( (1 2) a b)) (A B ) >(cdr '( 1 (2 a b)) ((2 A B)) 17
Συναρτήσεις Διαχείρισης Λιστών(2) cxxxxr (x a, d): (στοιχείο ή τμήμα λίστας) (caadr lista) (car (car (cdr lista))) Πχ. >(caar '( (1 2) (3 4))) 1 > (cdar '((a b c) ((d)) e f g h)) (B C) last: (last <list>) επιστρέφει μια λίστα με μόνο το τελευταίο στοιχείο. Πχ. >(last '( a d 3 f)) (F) >(last '( 1 2 (3 4))) ((3 4)) 18
Συναρτήσεις Διαχείρισης Λιστών(3) butlast: (butlast <list> <n>) επιστρέφει μια λίστα χωρίς τα τελευταία n στοιχεία. Πχ. >(butlast '( a d 3 f) 2) (A D) >(butlast '( 1 2 3 4) 4) NIL nthcdr: (nthcdr <n> <list>) επιστρέφει μια λίστα χωρίς τα πρώτα n στοιχεία. Πχ. >(nthcdr 2 '( a d 3 f) ) (3 F) >(nthcdr 2 '( 1 2 3 (4 5)) ) (3 (4 5)) 19
Συναρτήσεις Διαχείρισης Λιστών(4) length: (length <list>) επιστρέφει το μήκος της λίστας Πχ. >(length '( a d 3 f) ) 4 >(length '( 1 2 3 (4 5)) ) 4 reverse: (reverse <list>) επιστρέφει την ανάστροφη λίστα Πχ. >(reverse '( a d 3 f) ) (F 3 D A) >(reverse '( 1 2 3 (4 5)) ) ((4 5) 3 2 1) 20
Συναρτήσεις Σύνθεσης Λιστών (1) cons: (cons <atom> <atom>) ή (cons <list> <atom>) επιστρέφει το αντίστοιχο ζεύγος Πχ. >(cons 'a 'b ) (A. B) >(cons '( a b) 'c) ((A B). C) cons: (cons <s-expression> <list>) τη λίστα με επιπλέον πρώτο στοιχείο την s-expression Πχ. >(cons 'a ' (c d) ) (A C D) 21
Συναρτήσεις Σύνθεσης Λιστών (2) list: (list <s-expression>*) επιστρέφει μια λίστα εκφράσεων. Πχ. >(list 'a '(b c) '5 ) (A (B C) 5) >(list '( a b) '(c 2) '(4 6) ) ((A B) (C 2) (4 6)) append: (append <list>*) επιστρέφει μια λίστα που συγχωνεύει όλες τις λίστες Πχ. >(append '(a b) '(c d) ) (A B C D) >(append '( a b) '(c 2) '(4 6) ) (A B C 2 4 6) 22
Συναρτήσεις Τροποποίησης push: (push <s-expression> <symbol>) επιστρέφει την λίστα με πρώτο στοιχείο την <s-expression>. Π.χ. > x (A B C) > (push 1 x) (1 A B C) pop: (pop <symbol>) επιστρέφει την λίστα χωρίς το πρώτο στοιχείο της. Π.χ. > x (A B C) >(pop x) Α >x (B C) 23
Συναρτήσεις Διαχείρισης Λιστών Ζευγών assoc: (assoc <s-expression> <alist>) επιστέφει το ζεύγος που έχει σαν πρωτο στοιχείο την <s-expression> Π.χ. > (assoc 'x '((y. b) (x. a) (z. c)) ) (X. Α) rassoc: (rassoc <s-expression> <alist>) (ζεύγος) Π.χ. > (rassoc 'c ' ((y. b) (x. a) (z. c))) (Z. C) acons: (acons <atom1> <atom2> <alist>) (λίστα ζευγών) Π.χ. > (acons 'z 'c ' ((x. a))) ((Z. C) (X. A)) 24
Συναρτήσεις Καταχώρησης Άμεσης Καταχώρησης: setq : (setq [<symbol> <s-expression>]) Εκτιμά κάθε <s-expression> και το αποτέλεσμα καταχωρείται στο αντίστοιχο σύμβολο Επιστρέφει το αποτέλεσμα της εκτίμησης της τελευταίας <s-expression> Πχ. >(setq x '(a b c) ) (A B C) >x (A B C) (setq name "Giannis") >name "Giannis") Πχ. >(setq x '(1 2 3) w 4 y (+ 8 5)) 13 >x ( 1 2 3) >w 4 >y 13 25
Συναρτήσεις Καταχώρησης Έμμεσης Καταχώρησης: set : (set [<s-expression> <s-expression>]) <symbol> Π.χ. >(setq weekday 'monday) > weekday Monday > (set weekday ' (1)) (1) > weekday Monday > monday (1) 26
Συναρτήσεις Καταχώρησης Γενικευμένη Καταχώρηση setf : (setf [<s-expression> <s-expression>]) <s-expression> Π.χ. > (setf x ' (a 3 d)) (A 3 D) > x (A 3 D) > (setf (car x) ' 1) 1 > x (1 3 D) > (setf (cdr x) '(2 3)) (2 3) > x (1 2 3) >(setf x '(a b) y ' (1 2)) > x (A B) > y (1 2) 27
Αριθμητικές Συναρτήσεις Βασικές Συναρτήσεις: +, -, *, /, float Π.χ. > (/ 20 4) 5 > (/ 4.16 1.3) 3.2 >(/ 16 3) 16/3 >(float (/ 16 3)) 5.33.. Συναρτήσεις Υπολογισμός : round, max, min, expt, sqrt, abs Π.χ. (round(/ 16 3) ) 5 (πλησιέστερος ακέραιος) 1/3 (υπόλοιπο) 28
Συναρτήσεις Αναγνώρισης Τύπων atom: T αν το όρισμα είναι άτομο (δηλ. αριθμός ή σύμβολο) numberp: Τ αν το όρισμα του είναι αριθμός symbolp: Τ αν το όρισμα του είναι σύμβολο listp: Τ αν το όρισμα του είναι λίστα null: Τ αν το όρισμα του είναι κενή λίστα 29
Συναρτήσεις Σύγκρισης Ισότητας = : επιστρέφει Τ όταν πρόκειται για δύο αριθμούς ίδιας τιμής. Π.χ. > (= 2 2.0) T eq : επιστρέφει Τ όταν πρόκειται για δύο ίδια σύμβολα. Π.χ. > (eq `exit `exit) T eql : επιστρέφει Τ όταν πρόκειται για δύο ίδια σύμβολα ή δύο αριθμούς ίδιας τιμής και τύπου. Π.χ. > (eql 2 2.0) NIL, (eql 2 2) T 30
Συναρτήσεις Σύγκρισης equal : επιστρέφει Τ όταν πρόκειται για δύο απόλυτα ίδιες σ- εκφράσεις. Π.χ. > (equal '(+ a b) '(+ a b)) T > (equal (+ 2 6) 8) T equalp : ό,τι και η equal χωρίς το «απόλυτα». Π.χ. > (equal (+ 2 3) 5.0) NIL > (equalp (+ 2 3) 5.0) T Ανισότητας <, <=, >, >= (μόνο με αριθμούς). Π.χ. (> 3 2.5) Τ (<= 5.0 5) Τ 31
Συνάρτηση Συμμετοχής member: ελέγχει αν ένα στοιχείο ανήκει σε μια λίστα σε πρώτο επίπεδο (member <element><list-form>) Π.χ. > (member 2 '(1 2 3)) (2 3) >(member 'g '(a g 3 b c)) (G 3 B C) >(member ' g '((a g) 3b c)) NIL 32
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στo πλαίσιo του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Αθηνών» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους. 33
Σημείωμα Ιστορικού Εκδόσεων Έργου Το παρόν έργο αποτελεί την έκδοση 1.0. 34
Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Πατρών, Ιωάννης Χατζηλυγερούδης 2015. «Ευφυής Προγραμματισμός». Έκδοση: 1.0. Πάτρα 2015. Διαθέσιμο από τη δικτυακή διεύθυνση: https://eclass.upatras.gr/courses/ceid1095/ 35
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί. 36
Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς το Σημείωμα Αδειοδότησης τη δήλωση Διατήρησης Σημειωμάτων το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει) μαζί με τους συνοδευόμενους υπερσυνδέσμους. 37