36 lines
862 B
Prolog
36 lines
862 B
Prolog
|
|
:- module(bparrays, [new_array/2, a2_new/3, a3_new/4, is_array/1, '$aget'/3]).
|
|
|
|
:- use_module(library(lists), [flatten/2]).
|
|
|
|
new_array(X, Dim.Dims) :-
|
|
functor(X, '[]', Dim),
|
|
recurse_new_array(0, Dim, Dims, X).
|
|
|
|
recurse_new_array(_, _, [], _X) :- !.
|
|
recurse_new_array(Dim, Dim, _Dims, _X) :- !.
|
|
recurse_new_array(I0, Dim, Dims, X) :-
|
|
I is I0+1,
|
|
arg(I, X, A),
|
|
new_array(A, Dims),
|
|
recurse_new_array(0, Dim, Dims, X).
|
|
|
|
a2_new(X, Dim1, Dim2) :-
|
|
functor(X, '[]', Dim1),
|
|
recurse_new_array(0, Dim1, [Dim2], X).
|
|
|
|
a2_new(X, Dim1, Dim2, Dim3) :-
|
|
functor(X, '.', Dim1),
|
|
recurse_new_array(0, Dim1, [Dim2,Dim3], X).
|
|
|
|
is_array(X) :-
|
|
functor(X, '[]', _Dim).
|
|
|
|
'$aget'(A,[],A).
|
|
'$aget'(A,I.Is,A) :-
|
|
arg(I, A, X),
|
|
'$aget'(X,Is,A).
|
|
|
|
array_to_list(A, List) :-
|
|
flatten(A, List).
|