Buenas, paso a dejar mi solución para este final para comparar respuestas .
Parte lógico:
1)
%Relaciona a una persona, el producto que busca y la cantidad que requiere
%busca(Persona,Producto,Cantidad)
busca(matias,mesa(circular,vidrio),1)
busca(matias,silla(metal),4)
busca(leo,sillon(cama,2),1)
busca(leo,sillon(reclinable,1),1)
No hace falta usar listas para modelar la información ya que se puede usar un hecho por cada producto que requiera en vez de hacer un hecho del estilo:
busca(matias, [mesa(circular,vidrio),etc])
2)
sucursalTrabajaMaterial(Sucursal,Material):-
stock(Sucursal,Producto,_),
esDeMaterial(Material,Producto).
esDeMaterial(madera,sillon(_,_)).
esDeMaterial(Material,silla(Material)).
esDeMaterial(Material,mesa(_,Material)).
El concepto que resalta es el principio de universo cerrado, donde todo lo que no este definido dentro de nuestro dominio será interpretado como FALSO por el motor de consultas. En el caso de que no se hubiese especificado que todos los sillones son de madera, este predicado nunca hubiese ofrecido una respuesta TRUE para una consulta de sillones.
3)
sucursalIdealParaCliente(Sucursal,Cliente):-
esCliente(Cliente),
esSucursal(Sucursal),
forall(busca(Cliente,Producto,Cantidad), (stock(Sucursal,Producto,CantidadStock) , Cantidad >= CantidadStock)).
En este punto aparecen los predicados de orden superior como el Forall, el cual recibe como argumento a otros predicados.
También ligo las variables Cliente y Sucursal mediante los predicados esCliente y esSucursal, para que la consulta resulte inversible para sus dos parámetros.
esCliente(Cliente):-
busca(Cliente,_,_).
esSucursal(Sucursal):-
stock(Sucursal,_,_).
Parte funcional:
1) Analizo por partes:
X: al estar siendo utilizado en una condición de "Mayor", deduzco que el tipo de X es un ORD.
Y: Es un valor que es pasado por parámetro.
Lista: es una lista de funciones, demostrado en el MAP, ya que cada elemento de la lista toma como parámetro a Y y devuelve un valor ORD, que luego es comparado con X.
funcion :: (Ord a) => a -> b -> [(b -> a)] -> a
funcion comparador transformador lista = (filter (> comparador) . map (\ f -> f transformador)) lista
2) Falso, es imposible ya que el MAP nunca va a finalizar de transformar todos los valores de la lista.
3) a) Valida, ya que 3 al ser numérico es ORD
3) b) Invalido, es necesario pasar una lista, sino no puede hacer map ni filter.
3) c) 'Chau' al ser un Char no es un valor ORD, por lo que no funciona.
Parte objetos:
1)a) Verdadero. En vez de utilizar un único método "tiempo()" común para toda las prendas, realiza una discriminación entre falda, blusa y short.
1)b) Falso. El tiempo base de la falda se podría abstraer en un método o en una variable.
1)c) Falso, el problema en este caso es el uso de la herencia, ya que en vez de utilizar el tipo de falda como un atributo, las hace heredar a todas de una clase padre "Falda" lo que impide cambiar su tipo de falda de forma dinámica.
1)d) Verdadero. En la clase pedido hay mucho detalle algorítmico sobre como obtener el tiempo total.
2)
class Pedido{
public Prenda[] prendas;
public float tiempoDeConfeccion(){
return prendas.sum({ prenda -> prenda.tiempo()}
}
}
public Abstract Class Prenda{
public Material material;
public float tiempo(){
return self.tiempoBase() + material.tiempo(self.tiempoBase());
}
public float tiempoBase();
}
public class Falda extends Prenda{
public float tiempoBase(){
return 120;
}
}
public class Blusa extends Prenda{
public float cantBotones;
public float tiempoBase(){
return 200 + 5 * cantBotones;
}
}
public class Short extends Prenda{
public float tiempoNecesario;
public float tiempoBase(){
return self.tiempoNecesario;
}
}
public interface Material{
public float tiempo(float tiempoBasePrenda);
}
public Class Modal implements Material{
public float tiempo(float tiempoBasePrenda){
return 0;
}
}
public Class Lycra implements Material{
public float tiempo(float tiempoBasePrenda){
return tiempoBasePrenda*0.2;
}
}
public Class Denim implements Material{
public float tiempo(float tiempoBasePrenda){
return 25;
}
}
Saludos!