martes, 23 de julio de 2013

Ejercicios propuestos de Prolog por Johnny Andrés Ochoa Parrales

              
            Ejemplo de listas en Prolog

1)
 lista([ana,juan,jose]).

inversa([],[]).
inversa([H|T],L):-inversa(T,S),append(S,[H],L).            
   
Consulta :inversa([1,2,3],L).
Revierte los elementos de la lista  de fin a inicio.

2)
            longitud([],0):-!.

longitud([X|Y],S):-longitud(Y,T),!, S is T + 1.

Consulta :longitud([1,2,3,4],S).

Devuelve los elementos que se encuentran dentro de la lista.

3)
       suma_elem([],0).
suma_elem([X|Y],S):-suma_elem(Y,T), S is T + X.

Consulta : suma_elem([1,2,3],S).
Devuelve la suma de los elementos que se enuentran dentro de la lista

 4)
4.       primer_elem([X|Y],X):-!.
Consulta :primer_elem([1,2,3],S)

Devuelve el primer elemento de la lista.

5)
        ultimo_elem(L,S):-inversa(L,T),primer_elem(T,S).

Consulta: ultimo_elem([1,2,3],S).
Devuelve el ultimo elemento de la lista.

6)
        pertenece(X,[X|M]):-!.
pertenece(X,[R|M]):-pertenece(X,M).
Consulta:pertenece(3,[1,2,3,4]).

 Verifica si el elemnto a pedir se encuentre o pertenece dentro de la lista.












        concatenar([],L,L).
concatenar([X|L1],L2,[X|L3]):-concatenar(L1,L2,L3).
Consulta :concatenar([1,2,3],[4,5,6],S).
Realiza la unión de dos listas o mas  con sus respectivos elementos .


2.       elimina(X,[X|T],T).
elimina(X,[H|T],[H|T1]):- elimina(X,T,T1).
%elimina(1,[1,2,3],S).

3.       árbol genealógico  familia :

       padrede('juan', 'maria'). % juan es padre de maria
       padrede('pablo', 'juan'). % pablo es padre de juan
padrede('pablo', 'marcela').
padrede('carlos', 'debora').
               hermanos (carlos,juan).

A es hijo de B si B es padre de A
hijode(A,B) :- padrede(B,A).
      A es abuelo de B si A es padre de C y C es padre B
abuelode(A,B) :-padrede(A,C), padrede(C,B).


A y B son hermanos si el padre de A es también el padre de B y si A y B no son lo mismo


hermanode(A,B) :-padrede(C,A) ,padrede(C,B),   A \== B.

              A y B son familiares si A es padre de B o A es hijo de B o A es hermano de B

             familiarde(A,B) :- padrede(A,B).
             familiarde(A,B) :- hijode(A,B).
             familiarde(A,B) :- hermanode(A,B).
 

Consultas:
hermanode('juan', 'marcela').
hermanode('carlos', 'juan').
abuelode('pablo', 'maria').
abuelode('maria', 'pablo').

Estadía ejemplo:
hospedaje(hotel_a,quito,30).
hospedaje(hotel_b,quito,40).
hospedaje(hotel_c,manta,50).
hospedaje(cancer,guayaquil,60).
transporte(reina,quito,30).

viaje(L,T,H):-hospedaje(H,L,PH) , transporte(T,L,PT), PF is PH + PT, write(PF).

Periodos de clases  ejemplo:
Periodo(primero,03,2011,08,2011).
Periodo(segundo,08,2011,02,2012).
periodo(tercero,03,2012,08,2012).
periodo(cuarto,08,2012,02,2013).
periodo(quinto,03,2013,08,2013).
periodo(sexto,08,2013,02,2014).
periodo(septimo,03,2014,08,2014).
curso(Mes,An,Semestre):-periodo(Sem,M1,A1,M2,A2),((An=A1,Mes>=M1);(An=A2,Mes<=M2
árbol genealógico dos ejemplos 2):
padrede('Pablo', 'Juan').
padrede('Pablo', 'Jose').
padrede('Juan', 'Maria').
padrede('Jose', 'Debora').
padrede('Jose','Leonardo').
padrede('Jack','Pedro').
padrede('Lucas','Jorge').
  
tio(A,B):-hermanode(A,C) , padrede(C,B).
primo(A,B):-padrede(C,A),padrede(D,B),hermanode(C,D).
suegro(A,B):-hijode(C,A),esposos(B,C).
cunado(A,B):-esposos(A,C),hermanode(B,C).
esposos('Pedro','Maria').
esposos('Jorge','Debora').

hijode(A,B) :- padrede(B,A).

abuelode(A,B) :-padrede(A,C),padrede(C,B).

hermanode(A,B) :-padrede(C,A) ,padrede(C,B),A \== B.

tio(A,B):-hermanode(A,C) , padrede(C,B).
primo(A,B):-padrede(C,A),padrede(D,B),hermanode(C,D).
suegro(A,B):-hijode(C,A),esposos(B,C).
cunado(A,B):-esposos(A,C),hermanode(B,C).

horóscopo  ejemplo:
/* horoscopo(Signo,DiaIni,MesIni,DiaFin,MesFin) <- pertenecen al signo del horoscopo Signo los nacidos entre el Dia del Mes y el Dia Fin del Mes Fin */
horoscopo(aries,21,3,21,4).
horoscopo(tauro,21,4,21,5).
horoscopo(geminis,21,5,21,6).
horoscopo(cancer,21,6,21,7).
horoscopo(leo,21,7,21,8).
horoscopo(virgo,21,8,21,9).
horoscopo(libra,21,9,21,10).
horoscopo(escorpio,21,10,21,11).
horoscopo(sagitario,21,11,21,12).
horoscopo(capricornio,21,12,21,1).
horoscopo(acuario,21,1,21,2).
horoscopo(piscis,21,2,21,3).

/* signo(Dia,Mes,Signo) <- los nacidos el Dia de Mes pertenecen al
signo del zodiaco Signo */

signo(Dia,Mes,Signo) :- horoscopo(Signo,D1,M1,D2,M2),
( ( Mes=M1, Dia>=D1) ; ( Mes=M2, Dia=<D2) ).
  


EJERCICIOS DE RECURSIVIDAD EN PROLOG
Elimina Elemento
eliminaElem(X,[X|Xs],Xs).
eliminaElem(X,[Y|Ys],[Y|Zs]):-eliminaElem(X,Ys,Zs).
Factorial
factorial(0,1).
factorial(1,1).
factorial(X,Y) :- X>1,X1 is X-1,factorial(X1,Y1),Y is X*Y1.
Factorial (otra opción):
factorial(0, 1).
factorial(N, F):- N>0, N1 is N - 1, factorial(N1, F1), F is N * F1.
Pregunta Factorial(20,F);
Fibonacci
fibonacci(0,0).
fibonacci(1,1).
fibonacci(N,Y) :- N>1,N1 is N-1,fibonacci(N1,Y1),N2 is N-2,fibonacci(N2,Y2),
Y is Y1 + Y2.Longitud de una Lista
longitudLista([],0).
longitudLista([H|T],N):- longitudLista(T,N0),N is N0 + 1.
Mezcla de Vectores
mezcla(Xs,[],Xs).
mezcla([],[Y|Ys],[Y|Ys]).
mezcla([X|Xs],[Y|Ys],[X|Zs]):-X < Y,mezcla(Xs,[Y|Ys],Zs).
mezcla([X|Xs],[Y|Ys],[Y|Zs]):-X >= Y,mezcla([X|Xs],Ys,Zs).
Potencia
potencia(1,1,1).
potencia(X,1,X).
potencia(1,X,1).
potencia(X,N,Y):- N >1,N1 is N-1,potencia(X,N1,Y1),
Y is Y1*X.Producto Escalar
productoEscalar(Xs,Ys,P):- producto(Xs,Ys,0,P).
producto([],[],P,P).
producto([X|Xs],[Y|Ys],Pa,Pr):-PnisPa + X * Y,producto(Xs,Ys,Pn,Pr).
Repite elementos de un vector
repite(0,X,[]).
repite(N,X,[X|Xs]):-N > 0,N1 is N - 1,repite(N1,X,Xs).
Suma acumulada
sumAcum(Xs,Ys):-sumAc(Xs,0,Ys).
sumAc([],S,[]).
sumAc([X|Xs],Sa,[Sp|Ys]):-Sp is X + Sa,sumAc(Xs,Sp,Ys).
Sumatoria de elementos de un vector
sumatoria([],0).
sumatoria([X|Xs],S):-sumatoria(Xs,Sc), S is Sc + X.



Árbol SLD SUMATORIA RECURSIVIDAD UTILIZANDO EL PROGRAMA
SldDraw 3.4:
Procedimiento:
1)      En este paso se hace la declaración de la consulta
2)      En este paso N el cual es el numero que se ingreso para hacer la sumatoria es N-1, es decir 6-1 = 5 y este 5 se almacena en S = 6 + 5
3)      Muestra la nueva consulta recursiva , esta vez con valor de 5 en vez de 6
4)      En este caso N vale 5-1, este valor lo tomo S el cual lo suma al valor que ya tenia, es decir S = 11 + 4
5)      Muestra la nueva consulta donde en valor de N es 4
6)      En este caso N vale 4-1, este valor lo tomo S el cual lo suma al valor que ya tenia, es decir S = 15 + 3
7)      Muestra la nueva consulta donde en valor de N es 3
8)      En este caso N vale 3-1, este valor lo tomo S el cual lo suma al valor que ya tenia, es decir S = 18 + 2
9)      Muestra la nueva consulta donde en valor de N es 2
10)   En este caso N vale 2-1, este valor lo tomo S el cual lo suma al valor que ya tenia, es decir S = 20 + 1



Árbol SLD POTENCIA  RECURSIVIDAD UTILIZANDO EL PROGRAMA
SldDraw 3.4:

No hay comentarios: