Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών — Ιούνιος 2022¶
Μεταγραφή από τις σελίδες 1.jpg και 2.jpg· τα υπόλοιπα αρχεία είναι αντίγραφα ή ανακατασκευή της ίδιας εξέτασης. Όπου η σελίδα 1.jpg ή 2.jpg είναι δυσανάγνωστη, το κείμενο συμπληρώνεται από το ευανάγνωστο αντίγραφο που αναφέρεται.
1.jpg¶
ΑΡΧΕΣ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΚΑΙ ΜΕΤΑΦΡΑΣΤΩΝ Εξέταση Περιόδου Ιουνίου 2022
ΘΕΜΑ 1 – Λεξική και Συντακτική Ανάλυση (40%)¶
[συμπληρώθηκε από sel1.PNG]
Δίνεται η παρακάτω BNF γραμματική με αλφάβητο a b
(a) Περιγράψτε όλα τα χαρακτηριστικά των μελών της γλώσσας που παράγεται από την παραπάνω γραμματική. Παρουσιάστε παραδείγματα, καθώς και το/τα μικρότερο/α σε μήκος μέλος/η. (b) Είναι το \(aabbaa\) μέλος της γλώσσας; Απαντήστε παρουσιάζοντας τη Στοίβα Ολίσθησης – Ελάττωση Bottom-Up συντακτικής ανάλυσης για το string. (c) Τι τύπου είναι η γραμματική στην ιεραρχία Chomsky; Αιτιολογήστε την απάντησή σας. (d) Μπορείτε να φτιάξετε μια κανονική έκφραση αντιστοιχη της γραμματικής και γιατί; Αν ναι, παρουσιάστε την. (e) Επιπλέον, υπάρχει ντετερμινιστικό πεπερασμένο αυτόματο αντιστοιχο της κανονικής έκφρασης; Αν ναι, παρουσιάστε το διάγραμμα καταστάσεων – μεταβάσεων του αυτόματου. (f) Είναι η γραμματική LL(1); Αιτιολογήστε την απάντησή σας. Αν δεν είναι LL(1), μετασχηματίστε την σε μια ισοδύναμη LL(1) γραμματική.
Σημείωση: η φωτογραφία περιέχει χειρόγραφες απαντήσεις φοιτητή.
ΘΕΜΑ 2 – Εμβέλεια και Μεταβίβαση Παραμέτρων (20%)¶
Δίνεται το παρακάτω πρόγραμμα σε μια γλώσσα τύπου Pascal:
program MAIN;
var A: array [0..9] of integer;
var j, k: integer;
procedure f(x, y, Lo, Hi: integer);
var k: integer;
begin
for k:= Lo to Hi do
y:= k+1;
x:= x+1;
end;
BEGIN
for k:= 0 to 9 do
A[k]:= 0;
j:= 3;
f(j, A[j], 0, 5);
for k:= 0 to 9 do
writeln(A[k]);
END.
Ποιες τιμές θα εκτυπωθούν κατά την εκτέλεση του προγράμματος αν η μεταβίβαση παραμέτρων στη συνάρτηση f γίνεται:
1. Κλήση με τιμή (call by value)
2. Κλήση με αναφορά (call by reference)
3. Κλήση με όνομα (call by name)
Αιτιολογήστε πλήρως τις απαντήσεις σας.
ΘΕΜΑ 3 (a) – Μεταβλητές, Τύποι Δεδομένων κ.α. (20%)¶
[συμπληρώθηκε από thema_3.PNG]
(a) Δίνεται η παρακάτω εντολή της C, στην οποία χρησιμοποιούνται ακέραιες μεταβλητές:
c = a > ++b && b++ && --a;
Χρησιμοποιήστε παρενθέσεις για να δείξετε με ποια σειρά θα γίνουν οι υπολογισμοί στην παραπάνω εντολή. Λαμβάνοντας υπόψη την ιδιότητα υπολογισμού περιορισμένης έκτασης (short circuit evaluation), ποιες τιμές θα έχουν οι μεταβλητές a, b, c μετά την εκτέλεση της παραπάνω εντολής όταν οι αρχικές τιμές των μεταβλητών a, b είναι:
(i) \(a = 2;\ b = 5;\) (ii) \(a = 5;\ b = 2;\)
ΚΑΛΗ ΕΠΙΤΥΧΙΑ!!! Τα θέματα επιστρέφονται μαζί με το γραπτό Απαντήστε σε όλα τα θέματα Η διάρκεια της εξέτασης είναι 2,5 ώρες
2.jpg¶
Σημείωση: η σελίδα είναι θολή. Οι γραμμές κώδικα C++ και οι ερωτήσεις Θέματος 4 και 5 είναι μερικώς δυσανάγνωστες και μεταγράφονται με βάση τα sel1.PNG και sel2.PNG όπου είναι ευανάγνωστα.
ΘΕΜΑ 3 (b) – Μεταβλητές, Τύποι Δεδομένων κ.α. (συνέχεια)¶
Δίνεται το παρακάτω τμήμα κώδικα σε C++:
int main()
{
int data[6] = {1, 2, 3, 4, 5, 6};
int *p, *q;
int a, b, c;
p = data;
q = p + 2;
a = *p + *q;
b = q[2] + data[2];
*(q - 1) = 0;
p++;
q++;
c = *p - *q + data[3];
cout << a << " " << b << " " << c << "\n";
return 0;
}
- Εξηγήστε γραμμή-γραμμή τους αριθμούς και τη λειτουργία του παραπάνω προγράμματος.
- Τι θα τυπωθεί με την εκτέλεση του προγράμματος;
ΘΕΜΑ 4 – Python (10%)¶
(a) Με τι πρέπει να συμπληρώσετε τον κώδικα ώστε να δίνει στην έξοδο: 1234
def f(x):
for a in x:
[δυσανάγνωστο]
f([1, 2, 3, 4])
(b) Ποιο είναι το αποτέλεσμα της εκτέλεσης του παρακάτω τμήματος προγράμματος;
for i in range(1, 4):
for j in range(i, 4):
[δυσανάγνωστο]
[δυσανάγνωστο]
(c) Με τι πρέπει να συμπληρώσετε τον κώδικα ώστε να δίνει στην έξοδο: [5, 6, 12, 13]
print([x [δυσανάγνωστο] for x in range(15) [δυσανάγνωστο]])
ΘΕΜΑ 5 – Functional Programming (20%)¶
(a) Είναι γνωστό ότι στις συναρτησιακές γλώσσες η αναδρομή αντικαθιστά την επανάληψη. Κάντε ακριβώς το ίδιο (γράψτε την αναδρομική συνάρτηση και την πρώτη κλήση) για τον παρακάτω βρόχο (η εντολή ^ σημαίνει ύψωση της μεταβλητής j σε δύναμη με εκθέτη i):
k = 0; i = 0; j = 1000;
while i < 100 do
k = k + j^i; i = i + 1;
j = j - 1
end while;
return k
Σημείωση: το κείμενο της εκφώνησης του (a) και ο κώδικας του βρόχου είναι δυσανάγνωστα σε μέρη [δυσανάγνωστο].
(b) Με τι θα συμπληρώνατε τις αποτιμήσεις ?1 και ?2 των παρακάτω εκφράσεων συνθήκης σε γλώσσα Scheme;
(cond ((< 9 4) [δυσανάγνωστο])
((< 8 7) 9)
(else 10)) ; → ?1
[δυσανάγνωστο]: η δεύτερη έκφραση (?2) δεν είναι ευανάγνωστη.
(c) Έστω σε Lisp οι παρακάτω Map/Fold (Reduce) higher-order functions:
(map (lambda (x) (* x 2)) '(1 2 3 4 5)) ; → ?1
(fold-left + 0 (map (lambda (x) (* x 2)) '(1 2 3 4 5))) ; → ?2
(fold-right [δυσανάγνωστο]) ; → ?3
(define (sum-of-doubles v)
(fold-left + 0 (map (lambda (x) (* x 2)) v)))
(sum-of-doubles '(1 2 3 4 5)) ; → ?4
(d) Παρουσιάστε όλο το βήμα σταδιακής αποτίμησης της παρακάτω έκφρασης σε λ-λογισμό:
Σημείωση: το κείμενο των ερωτήσεων (b) και (c) του Θέματος 5 και η αποτίμηση ?2–?4 είναι δυσανάγνωστα· οι γραμμές μεταγράφονται ως έχουν εκτός από τα σημεία [δυσανάγνωστο].
Λύσεις (⚪ AI, μη επαληθευμένο)
Κατάσταση: ⚪ AI, μη επαληθευμένο Πηγή: λύσεις AI (antigravity-gemini, gemini-3.7-flash, sonnet), ανεξάρτητη επανάληψη και αντιπαραβολή· καμία δεν έχει ελεγχθεί από άνθρωπο
Προσοχή
Λύση από AI — ελέγξτε την· δεν έχει επαληθευτεί από άνθρωπο. Η ένδειξη «δύο λύσεις συμφωνούν» δεν σημαίνει ότι η απάντηση είναι σωστή.
AI λύσεις — 2022-06¶
Οι λύσεις γράφτηκαν από μοντέλα AI και δεν έχουν ελεγχθεί από άνθρωπο. Η αρίθμηση ακολουθεί το αρχείο θεμάτων.
Θέμα 1¶
Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: υψηλή
Κανόνες: \(S\to aA\mid bB\), \(A\to aS\mid a\), \(B\to bS\mid b\).
(a) Από το \(S\) διαβάζεται ένα γράμμα και πρέπει να ακολουθήσει το ίδιο γράμμα (από A ή B), και μετά είτε τέλος είτε ξανά \(S\). Άρα η γλώσσα είναι συνενώσεις των ζευγαριών aa και bb: \((aa\mid bb)^+\). Χαρακτηριστικά: μη κενές, άρτιου μήκους, κάθε διαδοχικό ζεύγος χαρακτήρων (θέσεις 1-2, 3-4, …) αποτελείται από ίδιους χαρακτήρες. Μικρότερα: aa, bb (μήκος 2). Παραδείγματα: aabb, bbaa, aaaa, aabbaa.
(b) Παραγωγή της aabbaa: \(S\Rightarrow aA\Rightarrow aaS\Rightarrow aabB\Rightarrow aabbS\Rightarrow aabbaA\Rightarrow aabbaa\). Η γραμματική είναι δεξιά αναδρομική, οπότε γίνονται πρώτα όλες οι ολισθήσεις και μετά οι αναγωγές από δεξιά προς τα αριστερά (η \(A\to a\) εφαρμόζεται μόνο στον τελευταίο χαρακτήρα):
| Στοίβα | Είσοδος | Ενέργεια |
|---|---|---|
| $ | aabbaa$ | ολίσθηση a |
| $a | abbaa$ | ολίσθηση a |
| $aa | bbaa$ | ολίσθηση b |
| $aab | baa$ | ολίσθηση b |
| $aabb | aa$ | ολίσθηση a |
| $aabba | a$ | ολίσθηση a |
| $aabbaa | $ | ελάττωση A→a |
| $aabbaA | $ | ελάττωση S→aA |
| $aabbS | $ | ελάττωση B→bS |
| $aabB | $ | ελάττωση S→bB |
| $aaS | $ | ελάττωση A→aS |
| $aA | $ | ελάττωση S→aA |
| $S | $ | αποδοχή |
Η aabbaa είναι μέλος της γλώσσας (\(=aa\,bb\,aa\)).
(c) Όλοι οι κανόνες έχουν τη μορφή τερματικό + το πολύ ένα μη τερματικό: δεξιά γραμμική ⇒ Τύπου 3 (κανονική).
(d) Ναι (η γλώσσα είναι κανονική): \((aa\mid bb)^+\) (ισοδύναμα \((aa\mid bb)(aa\mid bb)^*\)).
(e) Ναι· DFA με 5 καταστάσεις (q0 αρχική, qa, qb, qf τελική, νεκρή ν):
| Κατάσταση | με a | με b |
|---|---|---|
| q0 (αρχή, μη τελική) | qa | qb |
| qa (είδαμε a) | qf | ν |
| qb (είδαμε b) | ν | qf |
| qf (τελική: ολοκληρώθηκε ζεύγος) | qa | qb |
| ν | ν | ν |
Αρχική q0, τελική μόνο η qf. (Η qf συμπεριφέρεται όπως η q0 αλλά είναι τελική, γι' αυτό δεν συγχωνεύονται.)
(f) Δεν είναι LL(1): οι \(A\to aS\mid a\) έχουν κοινό πρόθεμα a (FIRST και των δύο = {a}), και το ίδιο οι \(B\to bS\mid b\). Παραγοντοποίηση: \(S\to aA\mid bB\), \(A\to aA'\), \(A'\to S\mid\epsilon\), \(B\to bB'\), \(B'\to S\mid\epsilon\). Έλεγχος: FIRST(\(S\))={a,b}, FOLLOW(\(A'\))=FOLLOW(\(B'\))={$}: οι εναλλακτικές των \(A'\), \(B'\) έχουν FIRST {a,b} και {ε}/FOLLOW {$}, ξένα ⇒ η νέα γραμματική είναι LL(1).
Θέμα 2¶
Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: χαμηλή
Ο κώδικας του θέματος σημειώνεται ως μη πλήρως επιβεβαιωμένος· οι απαντήσεις ισχύουν για τον κώδικα όπως μεταγράφηκε: η f(x,y,Lo,Hi) έχει τοπικό k, εκτελεί for k:=Lo to Hi do y:=k+1 και μετά x:=x+1. Το κυρίως πρόγραμμα μηδενίζει τον A[0..9], θέτει j=3 και καλεί f(j, A[j], 0, 5).
- Κλήση με τιμή: οι αλλαγές γίνονται σε αντίγραφα. Ο πίνακας μένει μηδενικός: 0 0 0 0 0 0 0 0 0 0.
- Κλήση με αναφορά:
x↔j,y↔A[3](η διεύθυνση καθορίζεται στην κλήση). Ο βρόχος θέτειyδιαδοχικά 1..6, άρα \(A[3]=6\). Μετά \(j=4\) (δεν επηρεάζει τον πίνακα). Τοπικόkτηςfκρύβει το καθολικόk. Έξοδος (μία τιμή ανά γραμμή): 0 0 0 6 0 0 0 0 0 0. - Κλήση με όνομα:
y≡A[j],x≡j. Κατά τον βρόχο τοjδεν αλλάζει (ηx:=x+1γίνεται μετά), άρα κάθεy:=k+1γράφει στοA[3], τελικά 6· μετάj:=4. Ίδιο αποτέλεσμα: 0 0 0 6 0 0 0 0 0 0. (Θα διέφερε από την αναφορά μόνο αν τοjάλλαζε πριν από τις αναθέσεις στοy.)
Θέμα 3 (a)¶
Αξιοπιστία: 2 από 3 ανεξάρτητες λύσεις συμφωνούν (η άλλη διαφωνούσε) · εμπιστοσύνη λύτη: υψηλή
Δίνεται η εντολή:
c = a > ++b && b++ && --a;
Σειρά υπολογισμών με χρήση παρενθέσεων¶
Λαμβάνοντας υπόψη την προτεραιότητα και την προσεταιριστικότητα των τελεστών στη C:
1. Προθεματικοί τελεστές αύξησης/μείωσης (++b, --a) και επιθεματικός (b++): μέγιστη προτεραιότητα.
2. Τελεστής σύγκρισης (>): μεγαλύτερη προτεραιότητα από το &&.
3. Λογικό ΚΑΙ (&&): συνδέεται από αριστερά προς τα δεξιά (left-to-right) με υπολογισμό περιορισμένης έκτασης (short-circuit).
4. Ανάθεση (=): χαμηλότερη προτεραιότητα.
Η πλήρης παρενθεσιοποίηση είναι:
c = (((a > (++b)) && (b++)) && (--a));
Αποτίμηση με Short-Circuit Evaluation¶
(i) Αρχικές τιμές: \(a = 2, b = 5\)¶
- Αποτιμάται ο πρώτος όρος του πρώτου
&&:(a > (++b)) - Πρώτα εκτελείται το
++b, άρα το \(b\) γίνεται \(6\) και επιστρέφει \(6\). - Ελέγχεται η συνθήκη: \(a > 6 \implies 2 > 6\), η οποία είναι ψευδής (\(0\)).
- Λόγω του υπολογισμού περιορισμένης έκτασης (short-circuit) του λογικού τελεστή
&&, ολόκληρη η παράσταση γίνεται \(0\) αμέσως. Οι επόμενες υποεκφράσεις (b++και--a) δεν αποτιμώνται. - Η τιμή \(0\) ανατίθεται στη μεταβλητή \(c\).
Τελικές τιμές: $\(a = 2, \quad b = 6, \quad c = 0\)$
(ii) Αρχικές τιμές: \(a = 5, b = 2\)¶
- Αποτιμάται ο πρώτος όρος:
(a > (++b)) - Εκτελείται το
++b, άρα το \(b\) γίνεται \(3\) και επιστρέφει \(3\). - Ελέγχεται η συνθήκη: \(a > 3 \implies 5 > 3\), η οποία είναι αληθής (\(1\)).
- Επειδή ο πρώτος όρος είναι αληθής, αποτιμάται ο δεύτερος όρος:
(b++) - Ο επιθεματικός τελεστής επιστρέφει την τρέχουσα τιμή του \(b\), δηλαδή \(3 \neq 0\) (αληθής).
- Ως παρενέργεια, το \(b\) αυξάνεται και γίνεται \(4\).
- Επειδή και ο δεύτερος όρος είναι αληθής, αποτιμάται ο τρίτος όρος:
(--a) - Εκτελείται το
--a, άρα το \(a\) μειώνεται και γίνεται \(4\), επιστρέφοντας την τιμή \(4 \neq 0\) (αληθής). - Όλοι οι όροι είναι αληθείς, επομένως η συνολική λογική παράσταση αποτιμάται σε \(1\).
- Η τιμή \(1\) ανατίθεται στη μεταβλητή \(c\).
Τελικές τιμές: $\(a = 4, \quad b = 4, \quad c = 1\)$
Θέμα 3 (b)¶
Αξιοπιστία: 2 από 3 ανεξάρτητες λύσεις συμφωνούν (η άλλη διαφωνούσε) · εμπιστοσύνη λύτη: υψηλή
Δίνεται η εντολή:
c = a > ++b && b++ && --a;
Σειρά υπολογισμών με χρήση παρενθέσεων¶
Λαμβάνοντας υπόψη την προτεραιότητα και την προσεταιριστικότητα των τελεστών στη C:
1. Προθεματικοί τελεστές αύξησης/μείωσης (++b, --a) και επιθεματικός (b++): μέγιστη προτεραιότητα.
2. Τελεστής σύγκρισης (>): μεγαλύτερη προτεραιότητα από το &&.
3. Λογικό ΚΑΙ (&&): συνδέεται από αριστερά προς τα δεξιά (left-to-right) με υπολογισμό περιορισμένης έκτασης (short-circuit).
4. Ανάθεση (=): χαμηλότερη προτεραιότητα.
Η πλήρης παρενθεσιοποίηση είναι:
c = (((a > (++b)) && (b++)) && (--a));
Αποτίμηση με Short-Circuit Evaluation¶
(i) Αρχικές τιμές: \(a = 2, b = 5\)¶
- Αποτιμάται ο πρώτος όρος του πρώτου
&&:(a > (++b)) - Πρώτα εκτελείται το
++b, άρα το \(b\) γίνεται \(6\) και επιστρέφει \(6\). - Ελέγχεται η συνθήκη: \(a > 6 \implies 2 > 6\), η οποία είναι ψευδής (\(0\)).
- Λόγω του υπολογισμού περιορισμένης έκτασης (short-circuit) του λογικού τελεστή
&&, ολόκληρη η παράσταση γίνεται \(0\) αμέσως. Οι επόμενες υποεκφράσεις (b++και--a) δεν αποτιμώνται. - Η τιμή \(0\) ανατίθεται στη μεταβλητή \(c\).
Τελικές τιμές: $\(a = 2, \quad b = 6, \quad c = 0\)$
(ii) Αρχικές τιμές: \(a = 5, b = 2\)¶
- Αποτιμάται ο πρώτος όρος:
(a > (++b)) - Εκτελείται το
++b, άρα το \(b\) γίνεται \(3\) και επιστρέφει \(3\). - Ελέγχεται η συνθήκη: \(a > 3 \implies 5 > 3\), η οποία είναι αληθής (\(1\)).
- Επειδή ο πρώτος όρος είναι αληθής, αποτιμάται ο δεύτερος όρος:
(b++) - Ο επιθεματικός τελεστής επιστρέφει την τρέχουσα τιμή του \(b\), δηλαδή \(3 \neq 0\) (αληθής).
- Ως παρενέργεια, το \(b\) αυξάνεται και γίνεται \(4\).
- Επειδή και ο δεύτερος όρος είναι αληθής, αποτιμάται ο τρίτος όρος:
(--a) - Εκτελείται το
--a, άρα το \(a\) μειώνεται και γίνεται \(4\), επιστρέφοντας την τιμή \(4 \neq 0\) (αληθής). - Όλοι οι όροι είναι αληθείς, επομένως η συνολική λογική παράσταση αποτιμάται σε \(1\).
- Η τιμή \(1\) ανατίθεται στη μεταβλητή \(c\).
Τελικές τιμές: $\(a = 4, \quad b = 4, \quad c = 1\)$
Θέμα 4¶
Αξιοπιστία: λύθηκε με βάση τις φωτογραφίες του θέματος· μία λύση AI
Από την εικόνα sel2.PNG ο κώδικας του Θέματος 4 διαβάζεται καθαρά:
(a) Συμπλήρωση ώστε η έξοδος να είναι 1234:
Στο σώμα του βρόχου πρέπει να τυπώνεται κάθε στοιχείο a χωρίς ενδιάμεσο κενό ή αλλαγή γραμμής:
def f(x):
for a in x:
print(a, end='')
f([1, 2, 3, 4])
1234
(b) Αποτέλεσμα εκτέλεσης του τμήματος προγράμματος: Ο κώδικας όπως εμφανίζεται στην εικόνα sel2.PNG είναι:
for i in [3, 4]:
for j in [1, 3]:
if i + j > 3: break
print(i + j, end=' ')
print(i - 1, end=' ')
print(i - 1, end=' ')
Βήματα εκτέλεσης:
1. \(i = 3\):
- \(j = 1\): \(i + j = 4 > 3\), άρα εκτελείται η break και ο εσωτερικός βρόχος τερματίζει αμέσως (το print(i + j) δεν εκτελείται ποτέ).
- Εκτελείται η εντολή του εξωτερικού βρόχου: print(i - 1, end=' ') \(\implies\) τυπώνει 2.
2. \(i = 4\):
- \(j = 1\): \(i + j = 5 > 3\), άρα εκτελείται η break και ο εσωτερικός βρόχος τερματίζει.
- Εκτελείται η print(i - 1, end=' ') \(\implies\) τυπώνει 3.
3. Μετά τον τερματισμό των βρόχων:
- Στην Python, η μεταβλητή \(i\) διατηρεί την τελευταία της τιμή (\(i = 4\)).
- Εκτελείται η εξωτερική εντολή print(i - 1, end=' ') \(\implies\) τυπώνει 3.
Τελική έξοδος:
2 3 3
(c) Συμπλήρωση ώστε η έξοδος να είναι [5, 6, 12, 13]:
Συμπληρώνουμε τη συνθήκη φιλτραρίσματος στο list comprehension:
print([x for x in range(15) if x % 7 >= 5])
if x % 7 in [5, 6] ή if x % 7 > 4 ή if x in [5, 6, 12, 13]).
Για \(x \in \{0, 1, \dots, 14\}\), οι τιμές που ικανοποιούν τη συνθήκη είναι ακριβώς οι \(x \in \{5, 6, 12, 13\}\), δίνοντας την επιθυμητή λίστα.
Θέμα 5¶
Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν
(a) Ο βρόχος (με \(k=0,i=0,j=1000\), όσο \(i<100\): \(k\mathrel{+}=j^i\), \(i\mathrel{+}=1\), \(j\mathrel{-}=1\)) γίνεται αναδρομή με τις μεταβλητές του ως ορίσματα:
(define (loop k i j)
(if (< i 100)
(loop (+ k (expt j i)) (+ i 1) (- j 1))
k))
(loop 0 0 1000)
(ισοδύναμα σε Python: def loop(k,i,j): return loop(k+j**i, i+1, j-1) if i<100 else k· κλήση loop(0,0,1000)).
(b) Για το πρώτο: (< 9 4) είναι ψευδές, άρα η πρώτη πρόταση παραλείπεται· (< 8 7) ψευδές· ισχύει το else. ?1 = 10. Το ?2 δεν διαβάζεται· δεν λύθηκε.
(c) ?1 = (2 4 6 8 10). ?2 = 30 (άθροισμα 2+4+6+8+10). Το ?3 είναι δυσανάγνωστο· δεν λύθηκε. ?4 = 30 (sum-of-doubles '(1 2 3 4 5)).
(d) Αποτίμηση με β-αναγωγές:
\((\lambda x.\lambda y.\lambda z.\,x+y+z)\;3\;4\;5 \to (\lambda y.\lambda z.\,3+y+z)\;4\;5 \to (\lambda z.\,3+4+z)\;5 \to 3+4+5 \to \mathbf{12}\)