Ejercicios Prolog
any_s3 de Abril de 2014
1.747 Palabras (7 Páginas)940 Visitas
Ejercicios PROLOG
1- Determina si lo que recibe es una lista
lista([]):-!.
lista([X|Y]):-lista(Y). lista([12,5,3,7,4]).
true.
lista(4).
false.
2- Concatena dos listas
concatenar([],L,L).
concatenar([X|M],L,[X|Z]):-concatenar(M,L,Z). concatenar([a,n,a],[21],A).
A = [a, n, a, 21]
3- Invierte la lista que recibe en el primer nivel
invertir([X],[X]).
invertir([X|M],Z):-invertir(M,S), concatenar(S,[X],Z). invertir([1,2,3,4],A).
A = [4, 3, 2, 1]
4- Calcula la longitud de la lista
long([],0):-!.
long([X|Y],S):-long(Y,T),!, S is T + 1. long([a,n,a],A).
A = 3.
5- Suma los elementos de la lista
suma_elem([X],X):-!.
suma_elem([X|Y],S):-suma_elem(Y,T), S is T + X. suma_elem([1,2,5],A).
A = 8.
6- Devuelve el posición que se encuentra en la enésima posición
posición_n([],N,[]):-¡.
posición_n([X|N],1,X):-¡.
posicion_n([X|R],N,S):-M is N – 1,posicion_n(R,M,S). posicion_n([1,3,6,9],4,A).
A = 9.
7- Dan como resultado el primer y el último elemento de la lista
primer_elem([X|Y],X):-!.
ultimo_elem(L,S):-invertir(L,T),primer_elem(T,S).
primer_elem([2,5,3,7,a],A).
A = 2.
ultimo_elem([2,5,3,7,a],A).
A = a
8- Calcula la primer posición donde aparece el elemento X en la lista
prim_pos(X,[],0):-!.
prim_pos(X,[X|M],1):-!.
prim_pos(X,[Y|M],S):-prim_pos(X,M,T),S is T + prim_pos(3,[1,2,1,3,a],A).
A = 4.
9- Elimina el elemento x de la lista en todos los niveles
elimina_x([],X,[]):-!.
elimina_x([X],X,[]):-!.
elimina_x([X|M],X,S):-elimina_x(M,X,S),!.
elimina_x([R|M],X,S):-lista(R), elimina_x(R,X,T), elimina_x(M,X,P), concatenar([T],P,S).
elimina_x([R|M],X,S):-elimina_x(M,X,T), concatenar([R],T,S).
elimina_x([1,3,4,56,23,12],4,A).
A = [1, 3, 56, 23, 12]
10- Invierte una lista en todos sus niveles
invertir_tot([],[]):-!.
invertir_tot([X|M],S):-lista(X),invertir_tot(X,P),invertir_tot(M,T),concatenar(T,[P],S).
invertir_tot([X|M],S):-invertir_tot(M,T),concatenar(T,[X],S),!. invertir_tot([23,5,3,6,78,4,12],A).
A = [12, 4, 78, 6, 3, 5, 23].
11- Saca los n primeros elementos de una lista y devuelve el resto
sac_n_pri([],N,[]):-!.
sac_n_pri([X|M],1,M):-!.
sac_n_pri([X|M],N,S):-N1 is N-1,sac_n_pri(M,N1,S).
sac_n_pri([1,45,23,45],2,A).
A = [23, 45].
12- Da como resultado los n primeros elementos de una lista
da_n_pri(L,0,[]):-!.
da_n_pri([],N,[]):-!.
da_n_pri([X|M],1,[X]):-!.
da_n_pri([X|M],N,S):-N1 is N - 1,da_n_pri(M,N1,T),concatenar([X],T,S).
da_n_pri([1,4,23,6,4,3,2],3,A).
A = [1, 4, 23] .
13- Muestra los últimos n elementos de la lista
da_n_ultim(L,N,S):-invertir_tot(L,T),da_n_pri(T,N,R),invertir_tot(R,S).
da_n_ultim([a,n,a],2,A).
A = [n, a] .
14- Determina si dos listas son iguales en todos los niveles
lista_igual([],[]):-!.
lista_igual([X|M],[X|R]):-lista_igual(M,R).
lista_igual([X|M],[T|R]):-lista(X), lista(T), lista_igual(X,T),lista_igual(M,R).
lista_igual([1,2,3],[1,2,3]).
true.
15- Determina si la primer lista es prefijo de la segunda
prefijo([],M):-!.
prefijo([X],[X|M]):-!.
prefijo([X|L],[X|M]):-prefijo(L,M).
prefijo([X|T],[L|M]):-lista(X),prefijo(X,L),prefijo(T,M).
prefijo([a],[na,n,b]).
false.
16-Determina si la primer lista es sub-lista de la segunda
sublista([],L):-!.
sublista(L,[X|M]):-prefijo(L,[X|M]).
sublista(L,[X|M]):-lista(X), sublista(L,X).
sublista(L,[X|M]):-sublista(L,M).
sublista(A,[1,23,45,23,45,23]).
A = [].
17- Elimina todos los elementos de la lista 1 que están en la 2
elim_l1_de_l2([],L,L):-!.
elim_l1_de_l2([X|M],L,S):-elimina_x(L,X,T),elim_l1_de_l2(M,T,S)
elim_l1_de_12([1,3,24,5,6,7,3],B,A).
B = A, A = [].
18- Elimina los elementos repetidos que están en una lista
elim_repet([],[]):-!.
elim_repet([X|M],S):-not lista(X), elimina_x(M,X,T),elim_repet(T,Y),
concatenar([X],Y,S).
elim_repet([X|M],S):-lista(X), elim_l1_de_l2(X,M,T),elim_repet(X,Y),
elim_repet(T,J),concatenar([Y],J,S).
elim_repet([1,3,24,5,6,7,3],A).
A = [1, 3, 24, 5, 6, 7]
19- Arma una lista con todos los elementos que se encuentran antes de elemento x en la lista
hasta_x([X|M],X,[]):-!.
hasta_x([Y|M],X,[Y|S]):-hasta_x(M,X,S).
hasta_x([1,3,2,4,2,5,3,6,5],2,A).
A = [1, 3].
20- Arma una lista con todos los elementos que se encuentran después del elemento x
desde_x([Y|M],X,S):-X=\=Y,desde_x(M,X,S),!.
desde_x([X,Y|M],X,[Y|M]):-X=\=Y,!.
desde_x([Y|M],X,S):-desde_x(M,X,S),!.
desde_x([1,3,2,4,2,5,3,6,5],2,A).
A = [4, 2, 5, 3, 6, 5].
21- Determina si una lista se encuentra en orden creciente o decreciente
creciente([X,Y|Z]):- X<Y,
creciente([Y|Z]).
creciente([X]).
decreciente([X,Y|Z]):- X>Y,
decreciente([Y|Z]).
decreciente([X]).
creciente([1,2,3,4,5,6,7]).
true.
decreciente([7,6,5,4,3,2]).
true.
22- Cuenta la ocurrencia de una lista atómica en otra lista
secuencia([],L,L):-!.
secuencia([X|Y],[X|L],[X|L]):-secuencia(Y,L,L).
cta_ocurr(L,[],0):-!.
cta_ocurr([X|Y],[X|M],N):-secuencia(Y,M,L1), cta_ocurr([X|Y],L1,T), N is T + 1.
cta_ocurr([X|Y],[R|M],N):-cta_ocurr([X|Y],M,N),!.
cta_ocurr([1,2,3],[1,2,3],A).
A = 1
23- Determina si una lista puede analizarse del derecho o del revés
reversible([]):-!.
reversible(L):-invertir(L,R),lista_igual(L,R).
reversible([a,n,a]).
true.
24- Calcula la cantidad de elementos que se encuentran en la misma posición en dos listas
orden(L,[],0):-¡.
Orden([],L,0):-¡.
Orden([X],[X],1):-¡.
Orden([X|Y],[X|Z],S):-orden(Y,Z,T),!, S is T+1.
Orden([X|Y],[R|Z],S):-orden(Y,Z,S).
orden([3,2,5],[1,2,4],A).
A = 1.
25- Arma una lista con todas las posiciones del elemento X en la lista
list_posic(X,[],N,[]):-!.
list_posic(X,[X|M],N,L):-N1 is N + 1,list_posic(X,M,N1,G),P is N + 1,
concatenar([P],G,L).
list_posic(X,[Y|M],N,L):-N1 is N + 1,list_posic(X,M,N1,L).
concatenar([],L,L):-!.
concatenar([X|Y],L,[X|Z]):-concatenar(Y,L,Z).
list_posic(2,[1,2,3,23,4,2],5,A).
A = [7, 11] .
26- Arma una lista con la primera posición de cada elemento de l1 en l2
posic_l1_l2([],L,[]):-!.
posic_l1_l2([X|Y],L,F):-posic_l1_l2(Y,L,L2),prim_pos(X,L,S),concatenar([S],L2,F).
posic_l1_l2([1,2,3,4,5,6,7],[1,3,45,6],B).
B = [1, 4, 2, 4, 4, 4, 4]
27- Arma una lista con todos los elementos en secuencia creciente a partir de X
mayores(X,[],[]).
mayores(X,[Y|M],[Y|S]):-X=(mayores(X,[Y|M],S):-mayores(X,M,S)).
mayores(10,[4,5,2],[1,2,3]).
false.
28- Arma una lista en orden decreciente a partir del elemento X
menores(X,[],[]).
menores(X,[Y|Z],[Y|R]):-X>=Y,menores(Y,Z,R).
menores(X,[Y|Z],R):-menores(X,Z,R).
menores(4,[4,5,2],A).
A = [4, 2] .
29- Arma una lista con todos los elementos menores que el elemento X
menores_x(X,[],[]):-!.
menores_x(X,[Y|W],[Y|Z]):-X>Y,menores_x(X,W,Z),!.
menores_x(X,[Y|W],Z):-menores_x(X,W,Z),!.
menores_x(3,[4,2,1,5,2],A).
A = [2, 1, 2].
30- Arma una lista con todos los elementos mayores que el elemento X
mayores_x(X,[],[]):-!.
mayores_x(X,[Y|W],[Y|Z]):-X<Y,mayores_x(X,W,Z),!.
mayores_x(X,[Y|W],Z):-mayores_x(X,W,Z),!.
mayores_x(3,[4,2,1,5,2],A).
A = [4, 5].
31- Obtener una lista de los elementos menores que X y otra con los elementos mayores que X
obtenerlista(X,L,Men,May):-menores_x(X,L,Men),mayores_x(X,L,May).
obtenerlista(3,[2,3,4,3,4,5,4],Menor,Mayor).
Menor = [2],
Mayor = [4, 4, 5, 4].
32- Arma una lista con las posiciones de la sub-secuencia creciente en la lista de longitud
long([],0):-¡.
Long([X|M],S):-long(M,T), S is T+1.
Subsec([X|Y],N,L):-mayores(X,[X|Y],S),long(S,N),posic_l1_l2(S,[X|Y],L).
subsec([X|Y],N,L):-subsec(Y,N,L).
subsec([1,2,3,4,5,6],2,A).
false.
33- Calcula el cociente y el resto entre dos números positivos
cociente(0,N,0,0):-!.
cociente(N1,N,C,R):-C is N1//N,T is C*N,R is N1-T
cociente(18,5,_,R).
R = 3.
34- Transforma un número decimal a binario en forma de lista
dec_bin(1,[1]):-!.
dec_bin(0,[]):-!.
dec_bin(N,S):-cociente(N,2,C,R),dec_bin(C,T),concatenar(T,[R],S),!.
dec_bin(10,A).
A = [1, 0, 1, 0].
35- Calcula la potencia de un número, N elevado a la N1
potencia(0,0,'No se puede calcular'):-!.
potencia(N,0,1):-N=\=0.
potencia(N,N1,S):-N2 is N1 -1,potencia(N,N2,R),!, S is R*N.
potencia(10,2,A).
A = 100.
36- Transforma un número decimal a binario en forma
...