Segundo Parcial 1er Cuat 2006 (Paradigmas)

De Cuba-Wiki
Saltar a: navegación, buscar
Back.png Volver a la página de la materia

Ejercicio 1: Resolución[editar]

Item A[editar]

Definir el predicado filtrarPorCantidad(+Lista, +Cantidad, -ListaFiltrada) que dada una lista Lista heterogenea que puede contener numeros enteros o listas y un numero Cantidad, debe ser verdadero cuando ListaFiltrada sea una lista con los elementos de Lista que cumplen que su cantidad sea igual a Cantidad. Para ello se tendra en cuenta que la cantidad esta representada por:

  1. en los numeros, por su valor absoluto.
  2. en las listas, por su cantidad de elementos.
?- filtrarPorCantidad([5, [2,3], 8, [4,8,9], [5,4], 2], 2, L).
L = [[2, 3],[5,4],2] ;
No.

Respuesta 1

filtrarPorCantidad([],_,[]).
filtrarPorCantidad([X|XS],C,L) :- cantidadCorrecta(X,C), filtrarPorCantidad(XS,C,L1), append([X],L1,L).
filtrarPorCantidad([X|XS],C,L) :- not(cantidadCorrecta(X,C)), filtrarPorCantidad(XS,C,L).
 
cantidadCorrecta(C, C) :- number(C).
cantidadCorrecta(L, C) :- length(L, C).

Respuesta 2 (con un poco más de pattern matching)

filtrarPorCantidad([], _, []).
filtrarPorCantidad([E|Xs], N, [E|Rs]) :- cantidadCorrecta(E, N), filtrarPorCantidad(Xs, N, Rs).
filtrarPorCantidad([E|Xs], N, Rs) :- not(cantidadCorrecta(E, N)), filtrarPorCantidad(Xs, N, Rs).

Item B[editar]

Definir el predicado fixture(+ListaEquipos, +Goles, -Fixture) que dada una lista de atomos ListaEquipos y un numero maximo de goles a favor Goles, debe ser verdadero cuando Fixture representa los resultados de un campeonato de todos contra todos entre los equipos de ListaEquipos y donde cada equipo puede tener a lo sumo Goles a favor en todo el torneo. Para representar un Fixture se debe utilizar una lista de listas de functores res(GolesEq1, GolesEq2). Asimismo se debe respetar que si la ListaEquipos es [eq1, eq2, ..., eqn], el Fixture correspondiente sera [[r12, r13, ..., r1n], [r23, r24, ..., r2n], ..., [r(n−1)n]], donde rij representa el resultado entre el i-esimo equipo contra el j-esimo equipo.

Respuesta:

fixture([],_,[]).
fixture(L,G,L1) :- todosLosPartidos(L,G,L1), length(L,N), goles(N,L1,G).
 
todosLosPartidos([_],_,[]).
todosLosPartidos([_|XS],G,L) :- XS \= [], mismoLocal(XS,G,L1), todosLosPartidos(XS,G,L2), append([L1],L2,L).

mismoLocal([],_,[]).
mismoLocal([_|YS],G,L) :- entre(0,G,L2), entre(0,G,V), mismoLocal(YS,G,L1), append([res(L2,V)],L1,L).
 
goles(0,_,_).
goles(N,L,G) :- N > 0, golesDe(N,L,M), M =< G, N1 is N-1, goles(N1,L,G).
 
golesDe(E,L,N) :- ultimoEquipo(E,L), N1 is E-1, visitante(E,N1,L,L1), contarGoles(L1,N).
golesDe(E,L,N) :- primerEquipo(E), local(E,L,L1), contarGoles(L1,N).
golesDe(E,L,N) :- not(ultimoEquipo(E,L)), not(primerEquipo(E)), local(E,L,L1), N1 is E-1, visitante(E,N1,L,L2), append(L1,L2,L3), contarGoles(L3,N).
 
ultimoEquipo(E,L) :- length(L,N), E =:= N + 1.
primerEquipo(E) :- E =:= 1.
 
local(E,L,L1) :- E1 is E-1, iesimo(E1,L,L1).
 
visitante(_,0,_,[]).
visitante(E,N,L,L1) :- N > 0, N1 is N-1, iesimo(N1,L,L2), N2 is E-N-1, iesimo(N2,L2,P), cambiarLocalia(P,P1), visitante(E,N1,L,L4), append([P1],L4,L1).
 
cambiarLocalia(res(G1,G2),res(G2,G1)).
 
contarGoles([],0).
contarGoles([res(G1,_)|XS],N) :- contarGoles(XS,N1), N is N1+G1.


Ejercicio 2: Resolucion[editar]

Demostrar que ¬r se deduce del siguiente conjunto de formulas proposicionales utilizando el metodo de resolucion para la logica proposicional:

  1. r => (p v q v s)
  2. q => ¬r
  3. s => p
  4. p => ¬r

Respuesta:

{(¬r,p,q,s), (¬q,¬r), (¬s,p), (¬p,¬r), (r)}

{(¬r,p,q,s), (¬q,¬r), (¬s,p), (¬p,¬r), (r), (¬p)} (con 4 y 5)

{(¬r,p,q,s), (¬q,¬r), (¬s,p), (¬p,¬r), (r), (¬p), (¬s)} (con 3 y 6)

{(¬r,p,q,s), (¬q,¬r), (¬s,p), (¬p,¬r), (r), (¬p), (¬s), (¬q)} (con 2 y 5)

{(¬r,p,q,s), (¬q,¬r), (¬s,p), (¬p,¬r), (r), (¬p), (¬s), (¬q), (p,q,s)} (con 1 y 5)

{(¬r,p,q,s), (¬q,¬r), (¬s,p), (¬p,¬r), (r), (¬p), (¬s), (¬q), (p,q,s), (p,q)} (con 1 y 7)

{(¬r,p,q,s), (¬q,¬r), (¬s,p), (¬p,¬r), (r), (¬p), (¬s), (¬q), (p,q,s), (p,q), (p)} (con 1 y 8)

{(¬r,p,q,s), (¬q,¬r), (¬s,p), (¬p,¬r), (r), (¬p), (¬s), (¬q), (p,q,s), (p,q), (p), vacia} (con 6 y 11)

Ejercicio 3: Colecciones[editar]

Agregar en Smalltalk a la clase Collection el siguiente método:

generateBlock: aBlockList

Este método recibe una lista de bloques de un parámetro (instancias de la clase BlockClosure) que evalúan a Bool. Se debe devolver un nuevo bloque b de un parámetro que evalúe a Bool tal que:

b value:p es verdadero si y sólo si

  • b1 value:p es True,
  • b2 value:p es False,
  • b3 value:p es True,
  • b4 value:p es False
  • ...etc. (valores de verdad intercalados)

donde [b1,b2,...,bn] son todos los bloques de aBlockList que son satisfechos por al menos un elemento de la colección receptora.

Ejemplo:

s := # (1 2 3 4).
sb := (List new) add:[:p | p odd]; add:[:p | p == 3]; add:[:p | p ==7]; yourself.
(s generateBlock: sb) value:5    devuelve true
(s generateBlock: sb) value:3    devuelve false

Respuesta

generateBlock: aBlockList
 |secuenciaFiltrada alter|
 secuenciaFiltrada := aBlockList select: [:b | self anySatisfy: b].
 alter := false.
 ˆsecuenciaFiltrada inject: [:p | true] into:
     [:b :m |
         (alter := (alter not)).
             alter ifTrue:
                 [ [:p | (b value: p) & (m value: p)] ]
             ifFalse:
                 [ [:p | (b value: p) & ((m value: p) not)] ]
     ].


Ejercicio 4: Herencia[editar]

Item A[editar]

Item B[editar]

Item C[editar]

Item D[editar]