You are on page 1of 4

Departamento de Informática

Lenguajes de Programación
Universidad Técnica Federico Santa María
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Pregunta. La expresión ( (lambda ( x . y) (list x y) ) 3 4) entrega


como resultado:

a) ( 3 . 4)
Ejercicios de Scheme b) ( 3 4)
c) ((34))
d) ( 3 (4) )
e) N.A.

1
XX-2

Departamento de Informática Departamento de Informática


Lenguajes de Programación Lenguajes de Programación
Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María

Pregunta. Dado el siguiente procedimiento Scheme: Pregunta. Dada la definición del siguiente procedimiento:

( define myst (define otro


(lambda (x) (lambda (ls) (define x 1)
(let ( (t ( car x))) (let aux ((l ls))
(set-car! x (cdr x)) (if (null? l)
(set-cdr! x t) x
x))) (begin (set! x (* x (car l))) (aux (cdr l)))))))

¿Qué entrega la evaluación de: (myst (cons 'a 'b)) ? La evaluación de (otro ´(1 2 3)) entrega:
a) (a b)
b) (b a) a) 1
c) (a . b) b) 3
d) (b . a) c) 6
e) Ninguna de las anteriores d) (1 2 3)
XX-3
e) Ninguna de las anteriores XX-4

Departamento de Informática Departamento de Informática


Lenguajes de Programación Lenguajes de Programación
Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María

Problema. Escriba en Scheme el procedimiento (concatenar l1 l2) que Problema. Defina en Scheme un procedimiento recursivo que encuentre
recibe dos listas l1 y l2 como argumento y retorna una única el primer elemento de una lista que es un número. Debe retornar
lista que contiene primero todos los elementos de l1 seguido el número si lo encuentra, sino retornar null.
de todos los elementos de l2 (no puede usar el procedimiento
interno append que viene en algunas implementaciones de Scheme).
(define primer-numero
(define concatenar (lambda (ls)
(lambda (l1 l2) (cond
(if (null? l1) ((null? ls) #f)
l2 ((number? (car ls)) (car ls))
(cons (car l1) (concatenar (cdr l1) l2))))) (else (primer-numero (cdr ls))))))

XX-5 XX-6

1
Departamento de Informática Departamento de Informática
Lenguajes de Programación Lenguajes de Programación
Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María

Problema.
Problema. Escriba en Scheme un procedimiento que al
Escriba en Scheme procedimiento (filtrar ls) que recibe
corresponde predicado (miembro? x ls) (retorna #t o #f) que
como único argumento una lista ls y retorna una lista con
permite verificar si x es un elemento que está en la lista ls
los mismos elementos de la lista, pero eliminando
usando equal? para comparar (no puede usar procedimiento
elementos repetidos.
member).

(define miembro? (define filtrar


(lambda (a ls) (lambda (ls)
(cond (cond
((null? ls) #f) ((null? ls) `())
((equal? a (car ls)) #t) ((miembro? (car ls) (cdr ls)) (filtrar (cdr ls)))
(else (miembro? a (cdr ls)))))) (else (cons (car ls) (filtrar (cdr ls)))))))

XX-7 XX-8

Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Problema.
Defina en Scheme un procedimiento con recursión de cola
que permita contar la ocurrencia de un determinado valor en
una lista.

Por ejemplo: (ocurrencia `a `(b a c a 4 a)) => retorna: 3 Ejercicios de Prolog


(define ocurrencia
(lambda (val ls)
(let ocur ((v val) (l ls) (cont 0))
(cond
((null? l) cont)
((equal? (car l) v) (ocur v (cdr l) (+ 1 cont)))
(else (ocur v (cdr l) cont)))))
10

XX-9

Departamento de Informática Departamento de Informática


Lenguajes de Programación Lenguajes de Programación
Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María

Pregunta. El calce: Pregunta. ¿Cuántos llamados recursivos genera el siguiente reglas


conjunto de Prolog, para una lista de n números enteros?
persona(juan, [Y | L]) = F(X, [alegre, aplicado])
quehago( [], R):- R is 0.
arroja como resultado: quehago( [X], R):- R is X.
quehago( [X, Y | Z ] , R):- quehago(Z, R1), R is (X + Y + R1).
a) F=persona, X=juan, Y=alegre, L=aplicado
b) F=persona, X=juan, Y=alegre, L=[aplicado] a) n
c) X=juan, Y=alegre, L=aplicado
b) n/2
d) X=juan, Y=alegre, L=[aplicado]
n
e) Ninguna de las anteriores c)  2 

d)  n 
 2 

e) N. A

XX-11 XX-12

2
Departamento de Informática Departamento de Informática
Lenguajes de Programación Lenguajes de Programación
Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María

Problema.
Pregunta. Dado el siguiente programa Prolog:
Escriba una relación en Prolog que permita traducir una lista
de números entre 0 y 6 inclusive en los correspondientes días
fun(Val, 0) :- Val > 0, Val < 5, !.
de la semana, considerando el día domingo como 0 y el
fun (Val, 1) :- Val < 14, !.
sábado como 6.
fun (Val, 2). map(0, domingo).
Ejemplo: map(1, lunes).
¿Cuántas soluciones tiene la consulta? map(2, martes).
?- traducir([1, 4], X).
?- fun (6, X).
X = [lunes,jueves] map(3, miercoles).
map(4, jueves).
a) 0 map(5, viernes).
b) 1 map(6, sabado).
c) 2
d) No tiene solución traducir([], []).
e) Ninguna de las anteriores traducir([X | R], [Y | S]) :- map(X, Y), traducir(R, S).
XX-13 XX-14

Departamento de Informática Departamento de Informática


Lenguajes de Programación Lenguajes de Programación
Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María

Problema.
Problema. Defina en Prolog un predicado split que permite dividir
Determine si dos números enteros son coprimos. una lista en dos partes, donde se especifica el largo de
Dos números son coprimos si su máximo común divisor la primera parte.
es igual a 1. ¡No use otro predicado definido anteriormente!
Ejemplo: ?- coprimo(35, 64). Ejemplo de uso:
yes ?- split([a,b,c,d,e,f,g,h,i,k], 3, L1, L2).
% mcd(X,Y,G) :- G es el máximo común divisor de X e Y L1 = [a,b,c]
L2 = [d,e,f,g,h,i,k]
mcd(X, 0, X):- X > 0.
mcd(X, Y, G):- Y > 0, Z is X mod Y, mcd(Y,Z,G). % split(L,N,L1,L2) : La lista L1 contiene los primeros N elementos de la
% lista L, L2 contiene el resto de los elementos
% coprimo(X, Y) :- X es coprimo con Y
split(L,0,[],L).
coprimo(X,Y) :- mcd(X,Y,1). split([X|Xs],N,[X|Ys],Zs) :- N > 0, N1 is N - 1, split(Xs,N1,Ys,Zs).
XX-15 XX-16

Departamento de Informática Departamento de Informática


Lenguajes de Programación Lenguajes de Programación
Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María

Respuesta
Problema.
Escriba en Prolog un programa que genere una combinación de
% combinacion(K,L,C) : C es lista de K elementos distintos elegidos
K objetos de una lista que tiene N elementos. Para ello implemente
% de lista L
el predicado: combinacion(K, L, C), donde K es el número de
elementos de la combinación C y L es la lista de N elementos
combinacion(0,_,[]).
desde donde se genera la combinación.
combinacion(K, L, [X | Xs]) :- K > 0, el( X, L, R),
K1 is K-1, combinacion(K1, R, Xs).
Ejemplo:
% el (X, L, R) : R es el resto de la lista L después de donde
?- combinacion(3, [a,b,c,d,e,f], Comb).
% aparece X
Comb = [a,b,c] ;
Comb = [a,b,d] ;
el(X, [X | L], L).
Comb = [a,b,e] ;
el(X, [ _| L], R) :- el(X, L, R).
% hasta 6!/ (3! * (6-3)!) = 20 respuestas diferentes
XX-17 XX-18

3
Departamento de Informática
Lenguajes de Programación
Universidad Técnica Federico Santa María

Problema.
Dado el siguiente programa:

persona(maria).
persona(pedro).
flaco(maria).

macizo(P) :- flaco(P), !, fail.


macizo(P) :- persona(P).

Se tienen las siguientes respuestas para cada una de las consultas

?- macizo(pedro).
yes

?- macizo(maria).
no

?- macizo(X).
no

¿Cómo se explica que la tercera consulta no encuentre la respuesta a la


primera consulta? XX-19

You might also like