1:- module(data_frame, 2 [ columns_to_rows/2 % ?ListOfColumns,?ListOfRows 3 ]). 4:- autoload(library(apply), [maplist/4, maplist/3]). 5:- use_module(library(linear/algebra)).
[a=[1, 2], b=[3, 4]]
becomes
[[a-1, b-3], [a-2, b-4]]
Else fails if rows or columns do not match. The output list of lists suitably conforms to dict_create/3 Data payloads from which you can build dictionaries.
?- columns_to_rows([a=[1, 2], b=[3, 4]], A), maplist([B, C]>>dict_create(C, row, B), A, D). A = [[a-1, b-3], [a-2, b-4]], D = [row{a:1, b:3}, row{a:2, b:4}].
27columns_to_rows(ListOfColumns, ListOfRows) :- 28 var(ListOfColumns), 29 !, 30 rows(Keys, Rows, ListOfRows), 31 matrix_transpose(Columns, Rows), 32 columns(ListOfColumns, Keys, Columns). 33columns_to_rows(ListOfColumns, ListOfRows) :- 34 columns(ListOfColumns, Keys, Columns), 35 matrix_transpose(Columns, Rows), 36 rows(Keys, Rows, ListOfRows). 37 38columns(ListOfColumns, Keys, Columns) :- 39 maplist([Key=Column, Key, Column]>>true, ListOfColumns, Keys, Columns). 40 41rows(Keys, Rows, ListOfRows) :- maplist(zip(Keys), Rows, ListOfRows). 42 43zip([], [], []). 44zip([H1|T1], [H2|T2], [H1-H2|T]) :- zip(T1, T2, T)