Você está na página 1de 8

Universidad Nacional del Altiplano Puno

Escuela Profesional de Ingeniera de Sistemas CURSO: INTELIGENCIA ARTIFICIAL

GUA ACADMICA Nro. 6 TEMA: RECURSIVIDAD Y CICLOS Apellidos y Nombres: Aguilar Miranda Jeshlee Gabriela Matrcula: 030857 OBJETIVOS: Comprender las recursividades y ciclos en Prolog

REQUERIMIENTOS: PC con Windows y visual Prolog

PROCEDIMIENTO La presente contiene una serie de programas con las que se plantea implementar bucles y ciclos basados en programacin lgica, basada en recursividad. PARTE 1: Sumatoria de Nmeros. El siguiente programa calcula la suma de los N primeros nmeros: S = 1 + 2 + 3 + ... + (N-1) + N
Domains nro = integer Predicates nondeterm sumatoria(nro,nro). Clauses sumatoria(0,0). %predicado de parada sumatoria(Num,Suma):- Num>0, NewNum=Num-1, sumatoria(NewNum,NewSuma), Suma=NewSuma+Num.

Consultas: Calcular la suma de los 5 primeros nmeros:


GOAL sumatoria(5, X).

Respuesta: X=15 Explique paso a paso como funciona el programa: La primera linea de codigo hace la condicion de parada donde Num tiene que ser mayor o igual que 0, en la segunda linea de codgo estamos decrementante en 1 el NewNum en cada llamada a la funcion y llamamos recursivamente la misma funcion para el NewSuma se acumule desde la ultima funcion cuando NewNum tome el valor de 0, y asi hacemos la suma de los n primeros numeros de regresada.

Universidad Nacional del Altiplano Puno


Escuela Profesional de Ingeniera de Sistemas CURSO: INTELIGENCIA ARTIFICIAL

Mejore el programa anterior para que el nmero sea ingresado por teclado y el resultado sea mostrado de forma adecuada: Domains nro = integer Predicates nondeterm sumatoria(nro,nro). leer(nro). mostrar(nro). main. Clauses sumatoria(0,0). %predicado de parada sumatoria(Num,Suma):- Num>0, NewNum=Num-1, sumatoria(NewNum,NewSuma),Suma=NewSuma+Num. leer(X):-write("Ingrese el numero: "),readint(X). mostrar(X):-write("La sumatoria es: ",X),nl. main:-leer(X),sumatoria(X,Y),mostrar(Y),fail. GOAL main. A continuacin se muestra un programa que suma los nmeros pares de un nmero ingresado. Ejemplo: Ingresamos el nmero 7 y el programa debe de sumar: 2 + 4 + 6 = 12
Domains nro = integer Predicates nondeterm sumapar(nro,nro). Clauses sumapar(0,0). %predicado de parada sumapar(Num,Suma):- Num>0, Num mod 2 = 0, NewNum=Num-1, sumapar(NewNum,NewSuma), Suma=NewSuma+Num. sumapar(Num,Suma):- Num>0, Num mod 2 = 1, NewNum=Num-1, sumapar(NewNum,Suma).

Consultas: Calcular la suma de los nmeros pares del nmero 5:


GOAL sumapar(7, X).

Respuesta: X=12 Explique paso a paso como funciona el programa: En la primera lnea de codigo se delimita la condicion de parada donde Num es mayor o igual que 0, en la segunda linea de codigo controlamos que el Num sea un numero par asi: Num mod 2 = 0 y e
la cuarta linea de codigo controlamos que si es un numero impar sigue decrementando en 1 sin alterar el acumulador suma regresando a la segunda linea de codigo en la cual Suma va acumula la sumatoria de los numeros pares menores o iguales a Num.

Universidad Nacional del Altiplano Puno


Escuela Profesional de Ingeniera de Sistemas CURSO: INTELIGENCIA ARTIFICIAL

Desarrollar un programa que realice la siguiente suma: S = 10 + 20 + 30 + 40 + + (N-1) + N Domains nro = integer Predicates nondeterm sumatoria(nro,nro). leer(nro). mostrar(nro). main. Clauses sumatoria(0,0). %predicado de parada sumatoria(Num,Suma):- Num>0, NewNum=Num-1, sumatoria(NewNum,NewSuma),Suma=NewSuma+Num*10. leer(X):-write("Ingrese el numero: "),readint(X). mostrar(X):-write("La sumatoria es: ",X),nl. main:-leer(X),sumatoria(X,Y),mostrar(Y),fail. GOAL main. PARTE 2: FACTORIAL DE NMEROS. El siguiente programa calcula el factorial de un nmero: F = N*N-1*N-2+......5*4*3*2*1
Domains nro = integer Predicates nondeterm factorial(nro,nro) leer(nro) mostrar(nro) main. Clauses factorial(1,1). %simbolo de Parada factorial(Num,Fact):-Num>1, NewNum=Num-1, factorial(NewNum,NewFact), Fact=Num*NewFact. leer(X):-write("ingrese Nro: "), readint(X). mostrar(S):-write("El Factorial es: ", S), nl. main:-write("FACTORIAL DE UN NMERO: "), nl, leer(Num), factorial(Num,Fact), mostrar(Fact), fail. goal main.

Ejecute el programa, ingrese datos y muestre los resultados que se obtienen: FACTORIAL DE UN NMERO: ingrese Nro: 5 El Factorial es: 120 Explique como funciona la recursividad. La primera linea de codigo hace la condicion de parada donde Num tiene que ser mayor o igual que 1, en la segunda linea de codigo

Universidad Nacional del Altiplano Puno


Escuela Profesional de Ingeniera de Sistemas CURSO: INTELIGENCIA ARTIFICIAL

estamos decrementando en 1 el NewNum en cada llamada a la funcion y llamamos recursivamente la misma funcion para el NewFact se acumule el producto desde la ultima funcion cuando NewFact tome el valor de 1, y asi hacemos el factorial de un numero. Explique que son los smbolos o predicados de parada. Son condiciones que limitan la llamada recursiva de una funcion dandole un valor limite al decremento de la variable. PARTE 3: SUMAS SUCESIVAS: El programa le pedir que ingrese cierta cantidad de nmeros por teclado, los cuales sern sumados.
Domains nro = integer Predicates nondeterm sumasu(nro, nro) leer(nro) mostrar(nro) Clauses sumasu(Veces,Suma):-Veces>0, NewVeces=Veces-1, leer(Num), sumasu(NewVeces,NewSuma), Suma=NewSuma+Num. sumasu(0,0). leer(Num):-write("Ingrese Nmero: "), readint(Num). mostrar(Num):-write("El resultado es: ", Num).

Consultas: Calcular la suma de 3 nmeros ingresados por teclado:


GOAL write("SUMAS SUCESIVAS: "), nl, sumasu(3, Suma), mostrar(Suma), nl, fail.

Respuesta: SUMAS SUCESIVAS: Ingrese Nmero: 9 Ingrese Nmero: 4 Ingrese Nmero: 4 El resultado es: 17 Mejore el programa de modo que sume n nmeros (n ingresado por teclado). Domains nro = integer Predicates nondeterm sumasu(nro, nro) ingresar(nro) leer(nro) mostrar(nro) main

Universidad Nacional del Altiplano Puno


Escuela Profesional de Ingeniera de Sistemas CURSO: INTELIGENCIA ARTIFICIAL

Clauses sumasu(Veces,Suma):-Veces>0, NewVeces=Veces-1, leer(Num), sumasu(NewVeces,NewSuma), Suma=NewSuma+Num. sumasu(0,0). leer(Num):-write("Ingrese Nmero: "), readint(Num). ingresar(Nume):-write("Ingrese la cantidad de numeros que desee sumar: "),readint(Nume). mostrar(Num):-write("El resultado es: ", Num). main:-write("SUMAS SUCESIVAS: "), nl,ingresar(X) ,sumasu(X, Suma),mostrar(Suma), nl, fail. GOAL main. Mejore el programa de modo que halle el promedio de los n nmeros: Domains nro = integer Predicates nondeterm sumasu(nro, nro) ingresar(nro) leer(nro) mostrar(nro) promedio(nro,nro) main Clauses sumasu(Veces,Suma):-Veces>0, NewVeces=Veces-1, leer(Num), sumasu(NewVeces,NewSuma), Suma=NewSuma+Num. sumasu(0,0). leer(Num):-write("Ingrese Nmero: "), readint(Num). ingresar(Nume):-write("Ingrese la cantidad de numeros que desee sumar: "),readint(Nume). mostrar(Num):-write("El resultado es: ", Num). promedio(Num,Num1):-NewNum= Num/Num1, write("El promedio es: ", NewNum). main:-write("SUMAS SUCESIVAS: "), nl,ingresar(X) ,sumasu(X, Suma),mostrar(Suma),nl,promedio(Suma,X),nl, fail. GOAL main. Mejore el programa de modo que halle el mayor y el menor de n nmeros

CONCLUSIONES

Universidad Nacional del Altiplano Puno


Escuela Profesional de Ingeniera de Sistemas CURSO: INTELIGENCIA ARTIFICIAL

Se ha visto que la recursividad en una funcion es una gran ayuda para los procesos progresivos ya que reeemplazas a la utilizacin de bucles y nos es imprescindible para programar.

RECOMENDACIONES

Se recomiendo utilizar las condiciones de parada ya que si no las usamos hay un desborde de pila o simplemente hay un llamado infito de la misma funcion, provocando que el programa se cuelgue.

TRABAJO APLICATIVO Desarrolle un programa que: 1. Muestre los n primeros trminos de la siguiente sucesin: -20, 20, -18, 19, -16, 18, -14, 17, Domains nro = integer. Predicates sucesion(nro,nro,nro). lee(nro). Clauses lee(Ind):-write("ingrese la cantidad de numeros que desea para la sucesion: "),readint(Ind),nl. sucesion(0,-20,20). sucesion(Ind,Ini1,Ini2):-Ind>0,Res = Ind mod 2,Res=1,Ind2=Ind1,sucesion(Ind2,Val,Ini2),Ini1=Val+2,write(Val,"\t"). sucesion(Ind,Ini1,Ini2):-Ind>0,Res = Ind mod 2,Res=0,Ind2=Ind1,sucesion(Ind2,Ini1,Val),Ini2=Val-1,write(Val,"\t"). Goal lee(Ind),sucesion(Ind,Q,W),nl. 2. Muestre los n primeros trminos de la siguiente sucesin: 1, 3, 4, 7, 11, 18, domains nro = integer. predicates

Universidad Nacional del Altiplano Puno


Escuela Profesional de Ingeniera de Sistemas CURSO: INTELIGENCIA ARTIFICIAL

sucesion(nro,nro,nro). lee(nro). clauses lee(Ind):-write("ingrese la cantidad de numeros que desea para la sucesion: "),readint(Ind),nl. sucesion(0,1,3). sucesion(Ind,Ini1,Ini2):-Ind>0,Res = Ind mod 2,Res=1,Ind2=Ind1,sucesion(Ind2,Val,Ini2),Ini1=Val+3,write(Val,"\t"). sucesion(Ind,Ini1,Ini2):-Ind>0,Res = Ind mod 2,Res=1,Ind2=Ind1,sucesion(Ind2,Val,Ini2),Ini1=Val+7,write(Val,"\t"). sucesion(Ind,Ini1,Ini2):-Ind>0,Res = Ind mod 2,Res=0,Ind2=Ind1,sucesion(Ind2,Ini1,Val),Ini2=Val+4,write(Val,"\t"). goal lee(Ind),sucesion(Ind,Q,W),nl. 3. Halle la sumatoria de los n primeros trminos de la siguiente sucesin: S = 1 + 3 + 4 + 7 + 11 + 18 + 4. Ingresar la talla de n estudiantes (en centmetros), calcular el promedio de los estudiantes. Luego si el promedio en mayor 170cm mostrar Estudiantes altos, si en menor o igual a 170cm mostrar Estudiantes normales y si es menor a 150cm mostrar Estudiantes pequeos. Domains nro = real Predicates nondeterm sumasu(nro, nro) ingresar(nro) leer(nro) mostrar(nro) promedio(nro,nro) comparar(nro) main Clauses sumasu(Veces,Suma):-Veces>0, NewVeces=Veces-1, leer(Num), sumasu(NewVeces,NewSuma), Suma=NewSuma+Num. sumasu(0,0). leer(Num):-write("Ingrese Nmero: "), readreal(Num).

Universidad Nacional del Altiplano Puno


Escuela Profesional de Ingeniera de Sistemas CURSO: INTELIGENCIA ARTIFICIAL

ingresar(Nume):-write("Ingrese la cantidad de numeros que desee sumar: "),readreal(Nume). mostrar(Num):-write("El resultado es: ", Num). promedio(Num,Num1):-NewNum= Num/Num1, write("El promedio es: ", NewNum). comparar(A):-A>1.70,write("Estiduantes altos"),nl. comparar(A):-A<=1.70,A>=1.50,write("Estudiantes normales"),nl. comparar(A):-A<1.50,write("Estudiantes pequeos"),nl. main:-write("SUMAS GOAL main. SUCESIVAS: "), nl,ingresar(X) ,sumasu(X,

Suma),mostrar(Suma),nl,promedio(Suma,X),comparar(X) ,nl, fail.

Nota: todos los datos debe se ser ingresados por teclado.

Você também pode gostar