calculadoraimc :- repeat, menu_principal, leer_opcion(Opcion), opcion(Opcion), Opcion \= 3, !. menu_principal :- write('\33\[2J'), write(' _____ _ _ _ ________ ________ '), nl, write('/ __ \\ | | | | | | |_ _| \\/ / __ \\'), nl, write('| / \\/ __ _| | ___ _ _| | __ _ __| | ___ _ __ __ _ | | | . . | / \\/ '), nl, write('| | / _` | |/ __| | | | |/ _` |/ _` |/ _ \\| \'__/ _` | | | | |\\/| | | '), nl, write('| \\__/\\ (_| | | (__| |_| | | (_| | (_| | (_) | | | (_| | _| |_| | | | \\__/\\'), nl, write(' \\____/\\__,_|_|\\___|\\__,_|_|\\__,_|\\__,_|\\___/|_| \\__,_| \\___/\\_| |_/\\____/'), nl, nl. leer_opcion(Opcion) :- write('1. Calcular Peso Ideal'), nl, nl, write('2. Calcular IMC'), nl, nl, write('3. Salir'), nl, nl, write('Ingrese su elección: '), read_line_to_string(user_input, String), atom_string(Atom, String), ( atom_number(Atom, Opcion) -> true ; writeln('Opción inválida. Intente nuevamente.'), leer_opcion(Opcion) ). opcion(1) :- nl, write('Has elegido calcular el peso ideal'), nl, peso_ideal, nl, capturador, esperar, calculadoraimc. opcion(2) :- nl, write('Has elegido calcular el IMC'), nl, calcular_imc, nl, capturador, esperar, calculadoraimc. opcion(3) :- nl, write('Cerrando calculadora...'), nl, nl, esperar, nl, halt, nl. opcion(_) :- nl, write('Opción inválida. Intente nuevamente.'), nl, nl, esperar, calculadoraimc. esperar :- write('Presione una tecla para continuar...'), get_code(_), nl. capturador :- get_code(_), nl. peso_ideal :- write('\33\[2J'), write('______ _ _ ______ _ '), nl, write('| ___ \\ | | | | _ \\ | | '), nl, write('| |_/ /___| | | ___ _ __ __ _ _ __ | | | |__ _| |_ ___ ___ '), nl, write('| // _ \\ | |/ _ \\ \'_ \\ / _` | \'__| | | | / _` | __/ _ \\/ __|'), nl, write('| |\\ \\ __/ | | __/ | | | (_| | | | |/ / (_| | || (_) \\__ \\'), nl, write('\\_| \\_\\___|_|_|\\___|_| |_|\\__,_|_| |___/ \\__,_|\\__\\___/|___/'), nl, write(' '), nl, write('_______________________________________________________________________'), nl, nl, write('Ingrese el nombre: '), read_line_to_string(user_input,Nombre), nl, write('Ingrese el sexo (F/M): '), read(Sexo), nl, write('Ingrese la altura (en cm): '), read(Altura), nl, write('Ingrese la edad: '), read(Edad), nl, write('\33\[2J'), write('______ _____ _ _ '), nl, write('| ___ \\ |_ _| | | | |'), nl, write('| |_/ /__ ___ ___ | | __| | ___ __ _| |'), nl, write('| __/ _ \\/ __|/ _ \\ | | / _` |/ _ \\/ _` | |'), nl, write('| | | __/\\__ \\ (_) | _| || (_| | __/ (_| | |'), nl, write('\\_| \\___||___/\\___/ \\___/\\__,_|\\___|\\__,_|_|'), nl, write(' '), nl, write(' '), nl, write('_______________________________________________________________________'), nl, nl, calcular_peso_ideal(Sexo, Altura, PesoMin, PesoMax), write('Nombre: '), write(Nombre), nl, nl, write('Edad: '), write(Edad), nl, nl, write('Altura: '), write(Altura), nl, nl, write('Peso Ideal: '), nl, nl, write(' ______'), nl, write(' .-\' . . .\'-. '), nl, write(' / \' \\ \' \\'), nl, write(' | \' \\ \' |'), nl, write(' | : () : |'), nl, write(' | . . |'), nl, write(' \\ . . . . /'), nl, write(' `-.______.-\' '), nl, write(' )( '), nl, write(' / \\ '), nl, write(' / KG \\ '), nl, write(' ( '),write(' ) '), nl, write(' ('), write(PesoMin), write('--'), write(PesoMax),write(') '), nl, write(' ( '),write(' ) '), nl, write(' ___)____(___ '), nl, write(' [____________] '), nl, nl, write('------------------------------------------------------------------------'), nl, write(Nombre),write(', su peso ideal es entre '), write(PesoMin), write(' kg y '), write(PesoMax), write(' kg.'), nl, write('------------------------------------------------------------------------'), nl. calcular_peso_ideal('F', Altura, PesoMin, PesoMax) :- peso_ideal_f(AlturaMin, AlturaMax, PesoMin, PesoMax), Altura >= AlturaMin, Altura =< AlturaMax. calcular_peso_ideal('M', Altura, PesoMin, PesoMax) :- peso_ideal_m(AlturaMin, AlturaMax, PesoMin, PesoMax), Altura >= AlturaMin, Altura =< AlturaMax. peso_ideal_f(144, 147, 49, 55). peso_ideal_f(148, 150, 50, 56). peso_ideal_f(150, 152, 51, 57). peso_ideal_f(153, 155, 52, 59). peso_ideal_f(156, 157, 54, 60). peso_ideal_f(158, 160, 55, 61). peso_ideal_f(161, 163, 56, 63). peso_ideal_f(164, 165, 58, 64). peso_ideal_f(166, 170, 59, 65). peso_ideal_f(171, 173, 62, 68). peso_ideal_f(174, 175, 63, 70). peso_ideal_f(176, 178, 60, 71). peso_ideal_f(179, 180, 66, 72). peso_ideal_f(181, 183, 67, 74). peso_ideal_m(156, 157, 59, 64). peso_ideal_m(158, 160, 60, 65). peso_ideal_m(161, 163, 61, 65). peso_ideal_m(164, 165, 62, 67). peso_ideal_m(166, 168, 63, 68). peso_ideal_m(169, 170, 64, 70). peso_ideal_m(171, 173, 65, 71). peso_ideal_m(174, 175, 67, 72). peso_ideal_m(176, 178, 68, 74). peso_ideal_m(179, 180, 70, 75). peso_ideal_m(181, 183, 71, 77). peso_ideal_m(184, 185, 72, 79). peso_ideal_m(186, 187, 74, 80). peso_ideal_m(188, 189, 75, 82). peso_ideal_m(190, 191, 77, 85). calcular_imc :- write('\33\[2J'), write('______ _ _ ______ _ '), nl, write('| ___ \\ | | | | _ \\ | | '), nl, write('| |_/ /___| | | ___ _ __ __ _ _ __ | | | |__ _| |_ ___ ___ '), nl, write('| // _ \\ | |/ _ \\ \'_ \\ / _` | \'__| | | | / _` | __/ _ \\/ __|'), nl, write('| |\\ \\ __/ | | __/ | | | (_| | | | |/ / (_| | || (_) \\__ \\'), nl, write('\\_| \\_\\___|_|_|\\___|_| |_|\\__,_|_| |___/ \\__,_|\\__\\___/|___/'), nl, write(' '), nl, write('_______________________________________________________________________'), nl, nl, write('Ingrese el nombre: '), read_line_to_string(user_input,Nombre), nl, write('Ingrese el sexo (F/M): '), read(Sexo), nl, write('Ingrese la edad: '), read(Edad), nl, write('Ingrese el peso (en kg): '), read(Peso), nl, write('Ingrese la altura (en cm): '), read(Altura), nl, AlturaMetros is Altura / 100, IMC is Peso / (AlturaMetros * AlturaMetros), write('\33\[2J'), write(' ________ ________ '), nl, write('|_ _| \\/ / __ \\'), nl, write(' | | | . . | / \\/'), nl, write(' | | | |\\/| | | '), nl, write(' _| |_| | | | \\__/\\'), nl, write(' \\___/\\_| |_/\\____/'), nl, write(' '), nl, write('________________________'), nl, nl, calcular_peso_ideal(Sexo, Altura, PesoMin, PesoMax), write('Nombre: '), write(Nombre), nl, nl, write('Edad: '), write(Edad), nl, nl, write('Altura: '), write(Altura), nl, nl, write('Peso Actual: '), write(Peso), nl, nl, write('Peso Ideal: '), write(PesoMin), write(' - '), write(PesoMax), nl, nl, indicar_estado(IMC, Nombre). indicar_estado(IMC, Nombre) :- IMC < 18.5, nl, write(Nombre), write(', estás por debajo de tu peso ideal. Te iría bien ganar algo de peso.'), nl, nl, nl, write(' ||'),nl, write(' \\/'), nl, write(' Bajo Peso Saludable Sobrepeso Obesidad'),nl, write('|------------|------------|------------|------------|'), nl. indicar_estado(IMC, Nombre) :- IMC >= 18.5, IMC =< 24.9, nl, write(Nombre), write(', estás en tu peso ideal. No tienes que subir ni bajar de peso.'), nl, nl, nl, write(' ||'),nl, write(' \\/'), nl, write(' Bajo Peso Saludable Sobrepeso Obesidad'),nl, write('|------------|------------|------------|------------|'), nl. indicar_estado(IMC, Nombre) :- IMC >= 25, IMC =< 30, nl, write(Nombre), write(', tienes un ligero sobrepeso. Sería saludable adelgazar entre 2 a 5 kilos.'), nl, nl, nl, write(' ||'),nl, write(' \\/'), nl, write(' Bajo Peso Saludable Sobrepeso Obesidad'),nl, write('|------------|------------|------------|------------|'), nl. indicar_estado(IMC, Nombre) :- IMC > 30, nl, write(Nombre), write(', tienes sobrepeso severo o incluso obesidad. Es importante cambiar tus hábitos y llevar una vida más saludable.'), nl, nl, nl, write(' ||'),nl, write(' \\/'), nl, write(' Bajo Peso Saludable Sobrepeso Obesidad'),nl, write('|------------|------------|------------|------------|'), nl.