Paradigme de programare · 2012 · Sesiune
- Profesor
- Cristian Giumale
- Anul examenului
- 2012
- Sesiune
- Sesiune
- Serie
- CA
- Grupă
- 324
- Adăugat
- 7 iunie 2012 de Sorina Sandu
Subiecte PP 07 Iunie 2012, 324 CA, din amintiri:
Grile:
1. Care din următoarele tipuri e polimorfic:
a) data Lista a = Vid ...
b) data Nat = Zero | Succ Nat
c) data Ceva = Constr | AltConstr
2. (lambda x.(x x) lambda y.(y y))
a) evaluarea normală se termină, ce aplicativă nu
b) se evaluează la (x y) (sau ceva asemănător)
c) nici evaluarea normală nici cea aplicativă nu se termină
3. (define x 5)
(define f (delay (let ((y = 1) (z = x)) (set! x (+ z y)))))
(begin (force f) (force f)) ; sau ceva de genul, ideea e că erau 2 force
Ce valoare are x la final:
a) 5
b) 6
c) 7
4. Haskel, tipuri la ceva de genul:
f x y = let (a:_) = x (sau aproximativ)
(încă ceva..)
in (a:y)
Chiar nu mai știu exact cum era, dar era destul de evidentă.
a) [a] -> [b] -> [a]
b) [a] -> [a] -> [b]
c) [a] -> [a] -> [a]
5. (deffacts facts (f 1) (f 2) (f 3))
(defrule r1
(declare (salience 1))
(f ?x)
=>
(assert (f ?x ?x)))
(defrule r2
(declare (salience 0))
?f <- (f $?)
=>
(retract ?f))
De câte ori se execută r2:
a) 3
b) 6
c) ciclează
6. Horn, echivalent în Prolog
(not g (x)) or (not g(y)) or f(x, y)
a) f(x, y) :- g(x), g(y).
b) g(x), g(y) :- f(x, y).
c) nu este o clauză Horn
7. Expresia:
p(x) and q(x) or (not q(x)) or (not p(x))
a) satisfiabilă
b) validă
c) nesatisfiabilă (sau un cuvânt asemănător)
8.
(define f (lambda (x) (lambda (y z) (x y z))))
Care dintre următoarele este o aplicație corectă:
a) ceva greșit
b) ceva greșit
c) ((f map) (lambda (x) x) \'(1, 2, 3))
Nici la asta nu mai știu exact variantele. Scuze.
9.
(define f
(lambda (x)
(let* ((f 5) (g (+f 4) și alte multe chestii unrelated) x))))
Ce returnează (f \'(1 2 3))?
a) \'(3 2 1)
b) \'(1 2 3)
c) \'(3 1 2)
10.
fold + 10 [1, 2, 3, 4, 5]
a) 25
b) 35
c) 15
Probleme:
1. Funcție în Scheme cu tail recursion care calculează suma primelor n numere.
2. CLIPS, se dau două seturi reprezentate ca:
(set-one 1 7 3 alte_numere)
(set-two 8 3 1 3 alte_numere)
(alte_numere chiar înseamnă alte numere, un număr finit de numere, care erau
precizate)
Să se scrie un program CLIPS care calculează intersecția celor 2 mulțimi.
Rezultatul putea fi reprezentat oricum vroiam, doar să povestim cum am ales
să reprezentăm.
3. Se dă:
(define c (lambda () (lambda (x) (force x))))
Folosind doar c (și paranteze) scrieți ceva care să forțeze (delay 3).
4. X = [H|T], H is 1, Y = [1, 2, 3], X = Y
Se poate satisface? Dacă da, care sunt legările, dacă nu de ce?
5. Se dă tipul:
data Lista a =
Vid | Cons a (Lista a)
Scrieți o funcție care returnează numărul de elem din listă și precizați
tipul funcției.
Rezolvări, deasemenea aproximative:
Grile - am păstrat ordinea în care le-am pus, în subiectul de examen erau în total altă ordine.
1. a)
2. c)
3. b)
4. c)
5. b)
6. a)
7. b)
8. c)
9. b)
10. a)
Probleme (nu am testat, posibile erori):
1.
(define SumN (lambda (n acc)
(if (eq? n 0)
acc
(SumN (- n 1) (+ acc n)))))
2.
(defrule r1
(set-one $? ?x $?)
(set-two $? ?x $?)
=>
(assert (intersect ?x)))
La final o să fie multe fapte (intersect ?x), și totalitatea lor reprezintă intersecția.
3.
((c) (delay 3))
4.
Da, T = [2, 3], X = [1, 2, 3]
5.
count Vid = 0
count Cons el li = 1 + (count li)
count:: Lista a -> Integer
Grile:
1. Care din următoarele tipuri e polimorfic:
a) data Lista a = Vid ...
b) data Nat = Zero | Succ Nat
c) data Ceva = Constr | AltConstr
2. (lambda x.(x x) lambda y.(y y))
a) evaluarea normală se termină, ce aplicativă nu
b) se evaluează la (x y) (sau ceva asemănător)
c) nici evaluarea normală nici cea aplicativă nu se termină
3. (define x 5)
(define f (delay (let ((y = 1) (z = x)) (set! x (+ z y)))))
(begin (force f) (force f)) ; sau ceva de genul, ideea e că erau 2 force
Ce valoare are x la final:
a) 5
b) 6
c) 7
4. Haskel, tipuri la ceva de genul:
f x y = let (a:_) = x (sau aproximativ)
(încă ceva..)
in (a:y)
Chiar nu mai știu exact cum era, dar era destul de evidentă.
a) [a] -> [b] -> [a]
b) [a] -> [a] -> [b]
c) [a] -> [a] -> [a]
5. (deffacts facts (f 1) (f 2) (f 3))
(defrule r1
(declare (salience 1))
(f ?x)
=>
(assert (f ?x ?x)))
(defrule r2
(declare (salience 0))
?f <- (f $?)
=>
(retract ?f))
De câte ori se execută r2:
a) 3
b) 6
c) ciclează
6. Horn, echivalent în Prolog
(not g (x)) or (not g(y)) or f(x, y)
a) f(x, y) :- g(x), g(y).
b) g(x), g(y) :- f(x, y).
c) nu este o clauză Horn
7. Expresia:
p(x) and q(x) or (not q(x)) or (not p(x))
a) satisfiabilă
b) validă
c) nesatisfiabilă (sau un cuvânt asemănător)
8.
(define f (lambda (x) (lambda (y z) (x y z))))
Care dintre următoarele este o aplicație corectă:
a) ceva greșit
b) ceva greșit
c) ((f map) (lambda (x) x) \'(1, 2, 3))
Nici la asta nu mai știu exact variantele. Scuze.
9.
(define f
(lambda (x)
(let* ((f 5) (g (+f 4) și alte multe chestii unrelated) x))))
Ce returnează (f \'(1 2 3))?
a) \'(3 2 1)
b) \'(1 2 3)
c) \'(3 1 2)
10.
fold + 10 [1, 2, 3, 4, 5]
a) 25
b) 35
c) 15
Probleme:
1. Funcție în Scheme cu tail recursion care calculează suma primelor n numere.
2. CLIPS, se dau două seturi reprezentate ca:
(set-one 1 7 3 alte_numere)
(set-two 8 3 1 3 alte_numere)
(alte_numere chiar înseamnă alte numere, un număr finit de numere, care erau
precizate)
Să se scrie un program CLIPS care calculează intersecția celor 2 mulțimi.
Rezultatul putea fi reprezentat oricum vroiam, doar să povestim cum am ales
să reprezentăm.
3. Se dă:
(define c (lambda () (lambda (x) (force x))))
Folosind doar c (și paranteze) scrieți ceva care să forțeze (delay 3).
4. X = [H|T], H is 1, Y = [1, 2, 3], X = Y
Se poate satisface? Dacă da, care sunt legările, dacă nu de ce?
5. Se dă tipul:
data Lista a =
Vid | Cons a (Lista a)
Scrieți o funcție care returnează numărul de elem din listă și precizați
tipul funcției.
Rezolvări, deasemenea aproximative:
Grile - am păstrat ordinea în care le-am pus, în subiectul de examen erau în total altă ordine.
1. a)
2. c)
3. b)
4. c)
5. b)
6. a)
7. b)
8. c)
9. b)
10. a)
Probleme (nu am testat, posibile erori):
1.
(define SumN (lambda (n acc)
(if (eq? n 0)
acc
(SumN (- n 1) (+ acc n)))))
2.
(defrule r1
(set-one $? ?x $?)
(set-two $? ?x $?)
=>
(assert (intersect ?x)))
La final o să fie multe fapte (intersect ?x), și totalitatea lor reprezintă intersecția.
3.
((c) (delay 3))
4.
Da, T = [2, 3], X = [1, 2, 3]
5.
count Vid = 0
count Cons el li = 1 + (count li)
count:: Lista a -> Integer