Prolog - Un par de prácticas...

 
Vista:

Un par de prácticas...

Publicado por Jb (1 intervención) el 07/09/2002 01:02:29
Buenas, a ver si me podian echar una mano para realizar un Cuadrado Mágico en Prolog, de manera que pasándole una lista de 9 enteros, compruebe si se puede realizar un cuadrado mágico y lo dibuje por pantalla.... y la segunda es un circuito análogico de resistencias, con un medidor de amperios, a ver si me pueden dar alguna idea con ellos....
saludos....
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

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).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Un par de prácticas...

Publicado por Rafael (1 intervención) el 18/06/2011 03:01:52
buenas, este codigo me da dos errores, el primero es
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.
donde esta Cab::1..Dim2.

y el segundo es
sumaL([Cab|Cola],S):-sumaL(Cola,S1), S #= Cab + S1, indomain(Cab).
donde esta #
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Un par de prácticas...

Publicado por Erudito (1 intervención) el 22/10/2008 05:43:45
¿Porque coño usas prolog (mierdos y asqueroso) para hacer algo algebraico? ¡Si este lenguaje de gracias de que sepa lo que es una AND! XDDDD
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar