RE:Un par de prácticas...
Publicado por
jaipuig (1 intervención) el 21/05/2007 21:17:12
Estoy haciendo un programa en Prolog al que le dices el tamaño de la matriz y te calcula el cuadrado mágico. De momento solo consigue calcular la suma de todas las filas y las columnas, pero no he conseguido hacer que sume también las diagonales. Se que no es del todo lo que pides, pero a lo mejor te sirve de algo. Lo dejo aquí por si a alguien mas le sirve.
:-lib(fd). %Para tkEclipse
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% main/0
%
% Programa para lanzar un cuadrado magico
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
main:-
writeln('Dime la dimension del cuadrado magico:'),
read(Dim),
crea_matriz(Dim, M),
cuadrado(M, S),
traspuesta(M, M2),
cuadrado(M2, S),
mostrar_matriz(M2).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% mostrar_matriz/1
%
% Predicado para mostrar una lista en forma de matriz
%
% mostrar_matriz(+L)
% L: Lista
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
mostrar_matriz([Cab|Cola]):-
mostrar_matriz(Cola),
writeln(Cab).
mostrar_matriz([]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% crea_matriz/2
%
% Predicado para crear una matriz
%
% crea_matriz(+Dim, +M)
% Dim: Dimension de la matriz
% M: Lista que le pasamos para que cree la matriz
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
crea_matriz(Dim, M):-
crea_matriz(Dim,Dim,M).
crea_matriz(Dim,N,[Cab|Cola]):-
N > 0,
X is N - 1,
Dim2 is Dim * Dim,
crea_matriz(Dim, X ,Cola),
crea_lista(Dim,Cab),
Cab::1..Dim2.
crea_matriz(_,0,[]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% crea_lista/2
%
% Predicado para crear una lista
%
% crea_lista(+Dim, +L)
% Dim: Dimension que tendra la matriz
% L: Lista
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
crea_lista(Dim,[_|Cola]):-
Dim > 0,
D is Dim - 1,
crea_lista(D,Cola).
crea_lista(0,[]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% sumaL/2
%
% Predicado para sumar todos los numeros de la lista
%
% sumaL(+L, ?S)
% L: Lista
% S: Suma de los elementos de la lista
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sumaL([Cab|Cola],S):-
sumaL(Cola,S1),
S #= Cab + S1,
indomain(Cab).
sumaL([],0).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Cuadrado/2
%
% Predicado para crear un cuadrado magico
%
% Cuadrado(+L, ?S)
% L: Lista de listas
% S: Suma de los elementos de la lista
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cuadrado([Cab|Cola], S):-
flatten([Cab|Cola], L),
cuadrado(Cola, S),
sumaL(Cab, S),
no_repetidos(L).
cuadrado([], _).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% no_repetidos/1
%
% Predicado para comprobar que los numeros de una lista no estan repetidos
%
% no_repetidos(+L)
% L: Lista
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
no_repetidos([]).
no_repetidos([Cab|Cola]):-
no_repetidos(Cola),
no_repe(Cola, Cab).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% no_repe/2
%
% Predicado para comprobar que los numeros de una lista no estan repetidos
%
% no_repe(+L, -Num)
% L: Lista
% Num: Numero con el que se comparará toda la lista
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
no_repe([], _).
no_repe([Ca|Col], Cab):-
no_repe(Col, Cab),
Ca \== Cab.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% traspuesta/2
%
% Predicado que crea una matriz traspuesta
%
% traspuesta(+M1, ?M2)
% M1: Matriz original
% M2: Matriz traspuesta
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
traspuesta([[]|_],[]).
traspuesta(M,[Cab|Cola]):-
tras_fila(M,Cab,Aux),
traspuesta(Aux,Cola).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% tras_fila/3
%
% Predicado que convierte en columna la primera
% fila de una matriz
%
% tras_fila(+M1, ?F, ?M2)
% M1: Matriz original
% F: Primera fila de la matriz convertida a columna
% M2: Copia de la matriz original pero sin la primera columna
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tras_fila([],[],[]).
tras_fila([[Cabf|Colaf]|Cola],[Cabf|Aux1],[Colaf|Aux2]):-
tras_fila(Cola,Aux1,Aux2).