Μετάβαση στο περιεχόμενο

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών — Ιούνιος 2022

Μεταγραφή από τις σελίδες 1.jpg και 2.jpg· τα υπόλοιπα αρχεία είναι αντίγραφα ή ανακατασκευή της ίδιας εξέτασης. Όπου η σελίδα 1.jpg ή 2.jpg είναι δυσανάγνωστη, το κείμενο συμπληρώνεται από το ευανάγνωστο αντίγραφο που αναφέρεται.

1.jpg

ΑΡΧΕΣ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΚΑΙ ΜΕΤΑΦΡΑΣΤΩΝ Εξέταση Περιόδου Ιουνίου 2022

ΘΕΜΑ 1 – Λεξική και Συντακτική Ανάλυση (40%)

[συμπληρώθηκε από sel1.PNG]

Δίνεται η παρακάτω BNF γραμματική με αλφάβητο a b

\[<S> ::= a<A> \mid b<B>$$ $$<A> ::= a<S> \mid a$$ $$<B> ::= b<S> \mid 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;
}
  1. Εξηγήστε γραμμή-γραμμή τους αριθμούς και τη λειτουργία του παραπάνω προγράμματος.
  2. Τι θα τυπωθεί με την εκτέλεση του προγράμματος;

ΘΕΜΑ 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) Παρουσιάστε όλο το βήμα σταδιακής αποτίμησης της παρακάτω έκφρασης σε λ-λογισμό:

\[(\lambda x.\; \lambda y.\; \lambda z.\; x + y + z)\; 3\; 4\; 5\]

Σημείωση: το κείμενο των ερωτήσεων (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).

  1. Κλήση με τιμή: οι αλλαγές γίνονται σε αντίγραφα. Ο πίνακας μένει μηδενικός: 0 0 0 0 0 0 0 0 0 0.
  2. Κλήση με αναφορά: 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.
  3. Κλήση με όνομα: 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\)

  1. Αποτιμάται ο πρώτος όρος του πρώτου &&: (a > (++b))
  2. Πρώτα εκτελείται το ++b, άρα το \(b\) γίνεται \(6\) και επιστρέφει \(6\).
  3. Ελέγχεται η συνθήκη: \(a > 6 \implies 2 > 6\), η οποία είναι ψευδής (\(0\)).
  4. Λόγω του υπολογισμού περιορισμένης έκτασης (short-circuit) του λογικού τελεστή &&, ολόκληρη η παράσταση γίνεται \(0\) αμέσως. Οι επόμενες υποεκφράσεις (b++ και --a) δεν αποτιμώνται.
  5. Η τιμή \(0\) ανατίθεται στη μεταβλητή \(c\).

Τελικές τιμές: $\(a = 2, \quad b = 6, \quad c = 0\)$

(ii) Αρχικές τιμές: \(a = 5, b = 2\)

  1. Αποτιμάται ο πρώτος όρος: (a > (++b))
  2. Εκτελείται το ++b, άρα το \(b\) γίνεται \(3\) και επιστρέφει \(3\).
  3. Ελέγχεται η συνθήκη: \(a > 3 \implies 5 > 3\), η οποία είναι αληθής (\(1\)).
  4. Επειδή ο πρώτος όρος είναι αληθής, αποτιμάται ο δεύτερος όρος: (b++)
  5. Ο επιθεματικός τελεστής επιστρέφει την τρέχουσα τιμή του \(b\), δηλαδή \(3 \neq 0\) (αληθής).
  6. Ως παρενέργεια, το \(b\) αυξάνεται και γίνεται \(4\).
  7. Επειδή και ο δεύτερος όρος είναι αληθής, αποτιμάται ο τρίτος όρος: (--a)
  8. Εκτελείται το --a, άρα το \(a\) μειώνεται και γίνεται \(4\), επιστρέφοντας την τιμή \(4 \neq 0\) (αληθής).
  9. Όλοι οι όροι είναι αληθείς, επομένως η συνολική λογική παράσταση αποτιμάται σε \(1\).
  10. Η τιμή \(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\)

  1. Αποτιμάται ο πρώτος όρος του πρώτου &&: (a > (++b))
  2. Πρώτα εκτελείται το ++b, άρα το \(b\) γίνεται \(6\) και επιστρέφει \(6\).
  3. Ελέγχεται η συνθήκη: \(a > 6 \implies 2 > 6\), η οποία είναι ψευδής (\(0\)).
  4. Λόγω του υπολογισμού περιορισμένης έκτασης (short-circuit) του λογικού τελεστή &&, ολόκληρη η παράσταση γίνεται \(0\) αμέσως. Οι επόμενες υποεκφράσεις (b++ και --a) δεν αποτιμώνται.
  5. Η τιμή \(0\) ανατίθεται στη μεταβλητή \(c\).

Τελικές τιμές: $\(a = 2, \quad b = 6, \quad c = 0\)$

(ii) Αρχικές τιμές: \(a = 5, b = 2\)

  1. Αποτιμάται ο πρώτος όρος: (a > (++b))
  2. Εκτελείται το ++b, άρα το \(b\) γίνεται \(3\) και επιστρέφει \(3\).
  3. Ελέγχεται η συνθήκη: \(a > 3 \implies 5 > 3\), η οποία είναι αληθής (\(1\)).
  4. Επειδή ο πρώτος όρος είναι αληθής, αποτιμάται ο δεύτερος όρος: (b++)
  5. Ο επιθεματικός τελεστής επιστρέφει την τρέχουσα τιμή του \(b\), δηλαδή \(3 \neq 0\) (αληθής).
  6. Ως παρενέργεια, το \(b\) αυξάνεται και γίνεται \(4\).
  7. Επειδή και ο δεύτερος όρος είναι αληθής, αποτιμάται ο τρίτος όρος: (--a)
  8. Εκτελείται το --a, άρα το \(a\) μειώνεται και γίνεται \(4\), επιστρέφοντας την τιμή \(4 \neq 0\) (αληθής).
  9. Όλοι οι όροι είναι αληθείς, επομένως η συνολική λογική παράσταση αποτιμάται σε \(1\).
  10. Η τιμή \(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}\)

✔ Επιβεβαίωσε · ✖ Βρήκα λάθος


✖ Βρήκα λάθος στη μεταγραφή