:- module(array,[array_create/3,array_create/4, array_get/4,array_set/5, array_height/2,array_width/2,array_legal/3, array_print/1]). %%%%%%%%%%%%%%%%% % construction array_create(M,N, Array) :- functor(Array, a, M), make_rows(M,N, Array). make_rows(0,_, _):-!. make_rows(I,N, A) :- functor(Row, r, N), arg(I, A, Row), J is I - 1, make_rows(J,N, A). array_create(M, N, Item, Array) :- functor(Array, a, M), make_rows(M, N, Item, Array). make_rows(0,_, _, _):-!. make_rows(I,N, Item, A) :- functor(Row, r, N), make_cols(N, Item, Row), arg(I, A, Row), J is I - 1, make_rows(J,N, Item, A). make_cols(0, _, _):-!. make_cols(I, Item, Row) :- arg(I, Row, Item), J is I - 1, make_cols(J, Item, Row). %%%%%%%%%%%%%%%%% % access array_get(Array, M, N, I) :- arg(M, Array, Row), arg(N, Row, I). array_set(Arr, M, N, Item, Arr1) :- functor(Arr, a, Arity), functor(Arr1, a, Arity), Arr =.. [a|Rs], Arr1 =.. [a|Rs1], elements(Rs, Rs1, M, Row1), arg(M, Arr, Row), Row =.. [r|Args], elements(Args, Args1, N, Item), Row1 =.. [r|Args1]. % local predicate _elements(Src,Dst, I, Item). % % preconditions: % - Src is a list of N elements % - Dst is a list of N unbound variables % - I0, J>0, array_height(A,M), array_width(A,N), I=