Saltar al contenido

Cómo transponer una matriz en prolog

Basta ya de buscar por todo internet porque llegaste al espacio adecuado, contamos con la solución que deseas pero sin problema.

Solución:

No estoy seguro de que tu ejemplo sea correcto, pero entiendo la idea.

Si usa SWI-PROLOG, puede usar el módulo CLPFD, así:

:- use_module(library(clpfd)).

Permitiéndole utilizar el transpose/2 predicado, así:

1 ?- transpose([[1,2,3],[4,5,6],[6,7,8]], X).
X = [[1, 4, 6], [2, 5, 7], [3, 6, 8]].

De lo contrario (si no hay SWI-PROLOG), simplemente podría usar esta implementación (que resultó ser una antigua en el clpfd de SWI):

transpose([], []).
transpose([F|Fs], Ts) :-
    transpose(F, [F|Fs], Ts).

transpose([], _, []).
transpose([_|Rs], Ms, [Ts|Tss]) :-
        lists_firsts_rests(Ms, Ts, Ms1),
        transpose(Rs, Ms1, Tss).

lists_firsts_rests([], [], []).
lists_firsts_rests([[F|Os]|Rest], [F|Fs], [Os|Oss]) :-
        lists_firsts_rests(Rest, Fs, Oss).

Para obtener una versión actualizada que utiliza funciones integradas de foldl y maplist, consulte clpfd.pl.

Esta es la solución más pequeña que se me ocurrió.

Código

transpose([[]|_], []).
transpose(Matrix, [Row|Rows]) :- transpose_1st_col(Matrix, Row, RestMatrix),
                                 transpose(RestMatrix, Rows).
transpose_1st_col([], [], []).
transpose_1st_col([[H|T]|Rows], [H|Hs], [T|Ts]) :- transpose_1st_col(Rows, Hs, Ts).

Prueba

:- transpose([[1,2,3],
              [4,5,6],
              [7,8,9]], R),
   print(R).

Huellas dactilares:

[[1,4,7],
 [2,5,8],
 [3,6,9]]

Explicación

La forma en que funciona es que transpose llamará recursivamente transpose_1st_col que extrae y transpone la primera columna de la matriz. Por ejemplo:

:- transpose_1st_col([[1,2,3],
                      [4,5,6],
                      [7,8,9]], Row, RestMatrix),
   print(Row),
   print(RestMatrix).

imprimirá

[1,4,7]

y

[[2,3],
 [5,6],
 [8,9]]

Esto se repite hasta que la matriz de entrada esté vacía, momento en el que se han transpuesto todas las columnas. Las columnas transpuestas luego se unen en la matriz transpuesta.

Aquí hay un fragmento de una respuesta más grande:

% transposed(+A, ?B) iff matrix B is transposed matrix A
transposed(A, B) :- transposed(A, [], B).
transposed(M, X, X) :- empty(M), !.
transposed(M, A, X) :- columns(M, Hs, Ts), transposed(Ts, [Hs|A], X).

% empty(+A) iff A is empty list or a list of empty lists
empty([[]|A]) :- empty(A).
empty([]).

% columns(+M, ?Hs, ?Ts) iff Hs is the first column
%   of matrix M and Ts is the rest of matrix M
columns([[Rh|Rt]|Rs], [Rh|Hs], [Rt|Ts]) :- columns(Rs, Hs, Ts).
columns([[]], [], []).
columns([], [], []).

Sección de Reseñas y Valoraciones

Más adelante puedes encontrar las interpretaciones de otros programadores, tú de igual forma eres capaz insertar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *