lab prog logica_04
TRANSCRIPT
Mgter. Juan Pablo Apaza Condori. 1
UUUNNNIIIVVVEEERRRSSSIIIDDDAAADDD TTTEEECCCNNNOOOLLLOOOGGGIIICCCAAA DDDEEELLL PPPEEERRRÚÚÚ FFAACCUULLTTAADD DDEE IINNGGEENNIIEERRÍÍAA IINNDDUUSSTTRRIIAALL YY SSIISSTTEEMMAASS
INGENIERÍA SISTEMAS E INFORMÁTICA PROGRAMACIÓN LÓGICA
OBJETIVOS
Desarrollar programas con Listas en PROLOG.
Aplicar el uso de expresiones y términos en la
solución de problemas en PROLOG.
LABORATORIO
4 PROLOG: MULTI LISTAS
Mgter. Juan Pablo Apaza Condori. 2
TEMAS
Listas en PROLOG.
Ejemplos de solución de problemas de multi listas en
PROLOG.
MARCO TEÓRICO
MULTI LISTAS
Estructuras de datos por excelencia de la Prog. Declarativa
L = [[9,2,3],[1,5,7],[4,8,6]].
9 2 3 1 5 7 4 8 6
Mgter. Juan Pablo Apaza Condori. 3
EJEMPLO: MULTI LISTAS LONGITUD.
len([],0).
len([_|T],N):-len(T,N1),N is N1+1.
lenm([],0).
lenm([H|T],N):-lenm(T,N1),len(H,NX),N is N1+NX.
EJEMPLO: EXISTE ELEMENTO EN LA MULTI LISTA.
member(_,[]).
member(X,[X|_]):-writeln('encontrado').
member(X,[_|T]):-member(X,T).
print([]).
print([H|T]):-print(T),write(H).
member2(_,[]).
member2(X,[H|T]):-print(H),writeln(''),member2(X,T),member(X,H).
EJEMPLO: IMPRIME LA MULTI LISTA.
print([]).
print([H|T]):-print(T),write('\t'),write(H).
printM([]).
printM([H|T]):-printM(T),print(H),writeln('').
9 2 3 1 5 7 4 8 6
9 2 3 1 5 7 4 8 6
Mgter. Juan Pablo Apaza Condori. 4
EJEMPLO: SUMA LA MULTI LISTA.
suma([],0).
suma([X|T],S):-suma(T,S1),S is S1+X.
sumam([],0).
sumam([H|T],N):-sumam(T,N1),suma(H,NX),N is N1+NX.
sumam([],0).
sumam([[3,4,5]|[[1,7,3],[4,8,12]]],N):-sumam(T,N1),suma(H,NX),
N is N1+NX. 35 [3,4,5] 12
47 35 + 12
sumam([[1,7,3]|[[4,8,12]]],N):-sumam(T,N1),suma(H,NX), N is N1+NX.
24 [1,7,3] 11 35 24 + 11
sumam([[4,8,12]|[[]]],N):-sumam(T,N1),suma(H,NX), N is N1+NX.
0 [4,8,12] 24 24 0 + 24
sumam([[]|[[]]],0).
suma([],0).
suma([4|[8,12]],S):-suma([8,12],S1),S is S1+X.
20 24 20 + 4
suma([8|[12]],S):-suma([12],S1),S is S1+X.
12 20 12+ 8
suma([12|[]],S):-suma([],S1),S is S1+X.
0 12 0 + 12
suma([]],0),
Mgter. Juan Pablo Apaza Condori. 5
EJEMPLO: SUMA LA MULTI LISTA.
suma([],0).
suma([H|T],SF):-suma(T,SFX),SF is SFX + H,write('\t'),write(H).
sumaM([],0).
sumaM([H|T],S):-sumaM(T,S1),suma(H,SF), S is SF+S1,writeln('').
dappend(A,B,C,D):-append(A,B,E),append(E,C,D).
dappend2([],A,B,C):-append(A,B,C).
dappend2([H|T],A,B,[H|C]):-dappend2(T,A,B,C).
Mgter. Juan Pablo Apaza Condori. 6
ACTIVIDADES
Analizar y explicar el funcionamiento de .cada uno de los ejemplos. EJEMPLO 1
Programa árbol binario en PROLOG.
SOLUCIÓN
%(t(t(t(nil,u,nil),s,t(nil,v,nil)),r,t(t(nil,w,t(t(nil,y,nil),x,t(nil,z,nil
))),t,nil))).
arbolbinario(nil).
arbolbinario(t(I,R,D)):- atom(R),arbolbinario(I),arbolbinario(D).
prof(nil,0).
prof(t(I,_,D),N):- prof(I,N1), prof(D,N2), maximo(N1,N2,M), N is M+1.
maximo(N1,N2,N1):- N1 > N2, !. maximo(_,N2,N2).
en(Nodo,t(I,Nodo,D)):- arbolbinario(I),arbolbinario(D).
en(Nodo,t(I,_,_)):- en(Nodo,I).
en(Nodo,t(_,_,D)):- en(Nodo,D).
alinea(A,L):-
bagof(_Nodo,en(_Nodo,A),L).
%t(t(t(nil,d,t(t(t(nil,m,nil),k,nil),g,t(nil,l,nil))),b,nil),a,t(t(t(nil,h,
nil),e,t(nil,i,nil)),c,t(nil,f,t(t(nil,n,nil),j,nil))))
EJEMPLO 2
Programa listas en PROLOG.
SOLUCIÓN
cabeza([X|Y],X).
cola([X|Y],Y).
miembro(X,[X|Y]).
miembro(X,[X|Z]):-miembro(X,Z).
concatenar([],L,L).
concatenar([X|Y],Z,[X|U]):- concatenar(Y,Z,U).
inversa([],[]).
inversa([X|Y],L):- inversa([Y,R]), concatenar(R,[X],L).
eliminar(X,[X|Xs],Xs).
Mgter. Juan Pablo Apaza Condori. 7
eliminar(X,[Y|Ys],[Y|Zs]:- (X,YS,Z,S).
rota([],[]).
rota([X|L1],L2):-concatenar(L1,[X],L2).
longitud([],0).
longitud([_|L],N):-longitud(L,N1), N is N1+1.
n_esimo(1,[Y|_],Y).
n_esimo(N,[Y|L],X):- longitud([Y|L],N1),N < N1+1, N > 1, N2 is N-
1,n_esimo(N2,L,X).
Mgter. Juan Pablo Apaza Condori. 8
EJEMPLO 1
Decimos que un número X es un residuo de otro número Y si verifica que X solo contiene dígitos de Y (aunque no necesariamente todos) y además ningún dígito se repite más veces en X que en Y. Por ejemplo, todos los residuos distintos del número 121 son: 1, 2, 11, 12, 21, 112, 121 y 211. Teniendo en cuenta este hecho, implementar los siguientes predicados en Prolog:
cambio(X,B,L), que se hará cierto cuando X sea un número (en base decimal) y L se
correponda con la secuencia de dígitos de X expresado en base B (menor o igual a la decimal).
residuo(X,Y), que por reevaluación devuelve en Y todos los residuos de X.
algunos(X,L), que devuelve una lista L compuesta por todos aquellos residuos de X cuya suma
de dígitos sea un número par. EJEMPLOS | ?- cambio(132,10,L).
L = [1,3,2] ? ;
no
| ?- cambio(X,2,[1,0,1,1,0]).
X = 22 ? ;
no
| ?- residuo(121,Y).
Y = 1 ? ;
Y = 12 ? ;
Y = 121 ? ;
Y = 11 ? ;
Y = 112 ? ;
Y = 2 ? ;
Y = 21 ? ;
Y = 211 ? ;
Y = 21 ? ;
Y = 211 ? ;
Y = 1 ? ;
Y = 11 ? ;
Y = 112 ? ;
Y = 12 ? ;
Y = 121 ? ;
No
| ?- algunos(121,L).
L = [211,2,112,11,121] ? ;
no
Mgter. Juan Pablo Apaza Condori. 9
SOLUCIÓN
1 Utilizando intérprete SWI-Prolog
2 El programa Prolog debe editarse en modo texto y contener la extensión “.pl”
Ejemplo: program1.pl
3 Una vez arrancado el intérprete Prolog , utilizar el predicado consult/1
Para cargar el conjunto de hechos y reglas que contiene el fichero.
No debe utilizarse la extensión .pl
4 Contenido del archivo ejemplo1.pl
cambio(X,B,L)
cambio(N,B,L):-1<B,B<11,
(number(N),!,cambio2(N,B,L1), rev(L1,L);
nonvar(L),rev(L,L1),cambio3(N,B,L1)).
cambio2(0,_,[]):-!.
cambio2(N,B,[H|T]):-H is N mod B,N1 is N//B,cambio2(N1,B,T).
cambio3(0,_,[]).
cambio3(N,B,[H|T]):-cambio3(N1,B,T),N is N1*B+H.
rev(L1,L2):-rev(L1,L2,[]).
rev([],L,L).
rev([H|T],L,S):-rev(T,L,[H|S]).
Mgter. Juan Pablo Apaza Condori. 10
5 Cargar el archivo
6 Para realizar preguntas simples al intérprete, podemos utilizar predicados simples que hayamos
predefinido en el programa, dejando alguno de sus términos sin instanciar.
7 residuo(X,Y)
residuo(X,Y):-cambio(X,10,L),gen(L,[H|T]),cambio(Y,10,[H|T]).
gen(_,[]).
gen(L1,[H|L]):-append(A,[H|B],L1),append(A,B,L2), gen(L2,L).
Mgter. Juan Pablo Apaza Condori. 11
EJEMPLO 2
Decimos que un número X es un derivado de otro número Y si está compuesto por una serie de dígitos de Y ordenados en el mismo orden relativo que en Y. Por ejemplo, todos los derivados distintos de 536 son 5, 3, 6, 53, 36, 56 y 536, mientras que los de 2202 son 0, 2, 20, 22, 202, 222, 220 y 2202. Nótese que en el último ejemplo, no se considera derivado el 2022 y el 02 se toma simplemente como 2. Teniendo en cuenta estos hechos, implementar los siguientes predicados en Prolog:
1 derivado(X,N,Y), que por reevaluación devuelve en Y todos los derivados de X cuyo número de
dígitos sea N.
2 todos(X,L), que haciendo un uso adecuado del predicado anterior y lista(s) acumuladora(s)
devuelve en L la lista con todos los derivados distintos (con cualquier número de dígitos) de X.
3 pares(X,L), que devuelve una lista con todos los pares de la forma par(A,B) tal que A es un
derivado de X que se repite B veces. 4 Indicar cual sería el resultado de (re)evaluar los tres objetivos siguientes: ?-derivado(111,_,Y),
?-todos(111,L)
?-pares(111,L).
SOLUCIÓN
1 derivado(X,N,Y)
derivado(X,N,Y):-name(X,L),coge(L,R),sin0(R,K),
len(K,N),N>0,name(Y,K).
sin0([X],[X]):-!.
sin0([48|T],S):-!,sin0(T,S).
sin0(L,L).
%sin0(L1,L2):-name(X,L1),name(X,L2).
coge([],[]).
coge([H|T],[H|S]):-coge(T,S).
coge([_|T],S):-coge(T,S).
len([],0).
len([_|T],N):-len(T,N1),N is N1+1.
Mgter. Juan Pablo Apaza Condori. 12
2 todos(X,L)
todos(X,L):-name(X,L1),len(L1,N),aux(X,N,L).
aux(_,0,[]):-!.
aux(X,N,L):-N1 is N-1,aux(X,N1,S),aux2(X,N,[],R),append(S,R,L).
aux2(X,N,A,L):-derivado(X,N,Y),\+(member(Y,A)),aux2(X,N,[Y|A],L),!.
aux2(_,_,L,L).
3 pares(X,L), que devuelve una lista con todos los pares de la forma par(A,B) tal que A es un
derivado de X que se repite B veces. 4 Indicar cual sería el resultado de (re)evaluar los tres objetivos siguientes:
Mgter. Juan Pablo Apaza Condori. 13
EJERCICIOS
1 Diseñar un algoritmo que llene una matriz de tamaño 3X4.
Calcular el promedio de 12 valores almacenados en dicha matriz.
2 Diseñar un algoritmo que llene una matriz de tamaño 3X4.
Calcular cuántos son mayores que al promedio de 12 valores almacenados en dicha matriz. Determinar.
3 Diseñar un algoritmo que llene una matriz de tamaño 3X4.
Listar los valores mayores que el promedio de 12 valores almacenados en dicha matriz.
4 Diseñar un algoritmo que llene una matriz de tamaño 3X4.
Imprimir los valores pares de la multilista..
5 Imprimir la suma de dos marices 3X3
+
6 Desarrolle un programa PROLOG que dada una matriz m X n:
Determine el mayor elemento y su posición.
Determine el menor elemento y su posición.
Sume todos los elementos de la matriz. 7 Desarrolle un programa PROLOG que dadas dos matrices A y B:
Calcule la matriz C1 = k X A, donde k > 0.
Calcule la matriz C2 = A + B.
Calcule la matriz C3 = A X B. 8 Hacer un algoritmo que llene una matriz de 10 * 10 y que almacene en la diagonal principal unos y
en las demás posiciones ceros. 9 Hacer un algoritmo que llene una matriz de 6 * 8 y que almacene toda la matriz en un vector.
Imprimir el vector resultante. 10 Hacer un algoritmo que llene una matriz de 5 * 6 y que imprima cuantos de los números
almacenados son ceros, cuántos son positivos y cuántos son negativos.
9 2 3 1 5 7 4 8 6
1 1 1 2 2 2 3 3 3
10 3 4 3 7 9 7 11 9