lab prog logica_04

14
Mgter. Juan Pablo Apaza Condori. 1 U U N N I I V V E E R R S S I I D D A A D D T T E E C C N N O O L L O O G G I I C C A A D D E E L L P P E E R R Ú Ú FACULTAD DE INGENIERÍA INDUSTRIAL Y SISTEMAS 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

Upload: harold-salas

Post on 28-Oct-2015

64 views

Category:

Documents


1 download

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

Mgter. Juan Pablo Apaza Condori. 14