/* ------------------------- * Práctica de Prolog 2004 * Lenguajes de Programación * ------------------------- * Carmen Blanco Vives * Rubén Toribio Aldeguer * Alejandro Sobrino Beltrán */ /* Función básica que indica si un elemento se encuentra dentro de una lista */ pertany(X,[X|L]). pertany(X,[Y|L]) :- pertany(X,L). /* Función que indica si un elemento es un dígito que cumpla los requisitos del enunciado: * - Debe ser >0 ya que al menos cada hijo debe tener 1 vaca de cada color. * - Debe ser <6 ya que ningún hijo debe tener mas de la mitad de las vacas de un color. */ digit(X) :- pertany(X,[0,1,2,3,4,5,6,7,8,9]),X>0,X<6. /* Distribución de las vacas entre los tres hijos */ distribucion1(B1,B2,B3,N1,N2,N3,M1,M2,M3) :- /* El número total de vacas de cada color es 10 */ digit(B1), digit(B2), digit(B3), 10 is B1+B2+B3, digit(N1), digit(N2), digit(N3), 10 is N1+N2+N3, digit(M1), digit(M2), digit(M3), 10 is M1+M2+M3, /* Cada hijo debe tener exáctamente 10 vacas en total */ 10 is B1+N1+M1, 10 is B2+N2+M2, 10 is B3+N3+M3, /* Cada hijo debe tener exáctamente 20 terneros en total sin separarse de sus madres */ 20 is 3*B1+2*N1+M1, 20 is 3*B2+2*N2+M2, 20 is 3*B3+2*N3+M3. /* Todas las posibles distribuciones de las vacas entre los tres hijos */ distribucion2(B1,B2,B3,N1,N2,N3,M1,M2,M3) :- /* El número total de vacas de cada color es 10 */ digit(B1), digit(B2), digit(B3), 10 is B1+B2+B3, digit(N1), digit(N2), digit(N3), 10 is N1+N2+N3, digit(M1), digit(M2), digit(M3), 10 is M1+M2+M3, /* Cada hijo debe tener exáctamente 10 vacas en total */ 10 is B1+N1+M1, 10 is B2+N2+M2, 10 is B3+N3+M3, /* Cada hijo debe tener exáctamente 20 terneros en total sin separarse de sus madres */ 20 is 3*B1+2*N1+M1, 20 is 3*B2+2*N2+M2, 20 is 3*B3+2*N3+M3, /* Imprimimos los resultados */ write('Hijo 1 (vacas blancas, negras, marrones): '), write(B1), write(', '), write(N1), write(', '), write(M1), nl, write('Hijo 2 (vacas blancas, negras, marrones): '), write(B2), write(', '), write(N2), write(', '), write(M2), nl, write('Hijo 3 (vacas blancas, negras, marrones): '), write(B3), write(', '), write(N3), write(', '), write(M3), nl, nl, fail. /* Todas las posibles distribuciones de las vacas (enumeradas) entre los tres hijos */ distribucion3(B1,B2,B3,N1,N2,N3,M1,M2,M3) :- /* Inicializamos el número de distribuciones distintas */ retractall(solucions(X)), asserta(solucions(0)), /* El número total de vacas de cada color es 10 */ digit(B1), digit(B2), digit(B3), 10 is B1+B2+B3, digit(N1), digit(N2), digit(N3), 10 is N1+N2+N3, digit(M1), digit(M2), digit(M3), 10 is M1+M2+M3, /* Cada hijo debe tener exáctamente 10 vacas en total */ 10 is B1+N1+M1, 10 is B2+N2+M2, 10 is B3+N3+M3, /* Cada hijo debe tener exáctamente 20 terneros en total sin separarse de sus madres */ 20 is 3*B1+2*N1+M1, 20 is 3*B2+2*N2+M2, 20 is 3*B3+2*N3+M3, /* Actualizamos el número de distribuciones distintas */ solucions(X), Y is X+1, retractall(solucions(X)), asserta(solucions(Y)), /* Imprimimos los resultados */ write('Hijo 1 (vacas blancas, negras, marrones): '), write(B1), write(', '), write(N1), write(', '), write(M1), nl, write('Hijo 2 (vacas blancas, negras, marrones): '), write(B2), write(', '), write(N2), write(', '), write(M2), nl, write('Hijo 3 (vacas blancas, negras, marrones): '), write(B3), write(', '), write(N3), write(', '), write(M3), nl, write('Solución número: '), write(Y), nl, nl, fail. /* Para la distribución de terneros se ha tenido en cuenta: * - Cada ternero estará con su madre * - Las vacas blancas tienen 3 terneros, las negras 2, y las marrones 1. * Así, aunque no se impriman por pantalla, se sabe en todo momento cuantos terneros, y de que color, tiene cada hijo. */