Ejemplo de listas en Prolog
1)
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.
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:
Publicar un comentario