(28-02-2014 21:07)reLlene escribió: Ahora...ALGUIEN sabe como resolver el 1.d) ?? Sobre todo el tratado que se tiene que hacer sobre los relojes sacando provecho del polimorfismo, tenia un ejemplo de esto pero no lo encuentro y no me sale
Primero, algo feo que se puede hacer para Fixear el problema de los puntos anteriores es agregar las reglas de "mecanismos", osea .
mecanismo(pila).
mecanismo(cuerda).
mecanismo(arena).
Se puede hacer "mejor", armando una lista sin repeticion de los mecanismos segun el pattern de fábrica, pero es un bardo y no es lo que sugerian en el final, simplemente enumerar los 3 y listo (estuve en la correccion).
Creo que apunta el D. a polimorfismo y pattern matching.
Te doy dos posibilidades que probé, una mas sencilla y otra más linda pero más larga.
la más larga:
%fabrica(pais, reloj)
fabrica(argentina, reloj(pila, analogico, pulsera)).
fabrica(egipto , reloj(pila, digital, pared)).
fabrica(suiza , reloj(cuerda, pulsera)).
fabrica(brasil , reloj(cuerda, pared)).
fabrica(suiza , reloj(pila, analogico)).
fabrica(argentina , reloj(pila, digital)).
fabrica(egipto , reloj(arena)).
%-----------------------------------
mecanismo(pila).
mecanismo(cuerda).
mecanismo(arena).
%-----------------------------------
%Para conocer la cantidad de relojes que funcionan bajo un mecanismo en particular
%alguien planteo lo siguiente:
esFabricado(R):-
fabrica(_, R).
usaMecanismo(M,R):-
mecanismo(M),
esFabricado(R),
R = reloj(M).
usaMecanismo(M,R):-
mecanismo(M),
esFabricado(R),
R = reloj(M,_).
usaMecanismo(M,R):-
mecanismo(M),
esFabricado(R),
R = reloj(M,_,_).
cantidad(X, C):-
mecanismo(X),
findall(X, fabrica(_, reloj(X)), L) , length(L, C).
cantidad(X, C):-
mecanismo(X),
findall(X, fabrica(_, reloj(X,_)), L) , length(L, C).
cantidad(X, C):-
mecanismo(X),
findall(X, fabrica(_, reloj(X,_, _)), L) , length(L, C).
cantidadPM(X,C):-
mecanismo(X),
findall(R, usaMecanismo(X,R), L) , length(L, C).
Que agrega el predicado "usaMecanismo\2" que está hecho inversible aunque podía dejarse no inversible si nunca lo usas directamente.
Lo que tiene de "lindo" es que por mecanismo obtenes las tuplas de relojes y cuando contas la cantidad en realidad tenes una lista de tuplas a contar.
La otra opcion es más simple (pongo solo la ultima parte):
usaMecanismo(M):-
fabrica(_, reloj(M)).
usaMecanismo(M):-
fabrica(_, reloj(M,_)).
usaMecanismo(M):-
fabrica(_, reloj(M,_,_)).
cantidadPM(X,C):-
mecanismo(X),
findall(X, usaMecanismo(X), L) , length(L, C).
Que cuando llamás al predicado CantidadPM devuelve exactamente lo mismo:
M = pila,
C = 4 ;
M = cuerda,
C = 2 ;
M = arena,
C = 1.
Pero los predicados auxiliares que agregué no hacen nada útil de por si, y no son inversibles, haces:
usaMecanismo(pila).
y te devuelve:
pila,pila,pila,pila.
Que te sirve para contar, porque al fin y al cabo es 4 veces pila... pero el resultado de la lista del findall no sirve para nada más que su length.