/*************************************************************************
*									 *
*	 YAP Prolog 							 *
*									 *
*	Yap Prolog was developed at NCCUP - Universidade do Porto	 *
*									 *
* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997	 *
*									 *
**************************************************************************
*									 *
* File:		arrays.yap						 *
* Last rev:								 *
* mods:									 *
* comments:	Array Manipulation					 *
*									 *
*************************************************************************/

% 
% These are the array built-in predicates. They will only work if
% YAP_ARRAYS is defined in Yap.h.m4.
%

array(Size, Obj) :-
	'$create_array'(Size, Obj).


% arithmetical optimization
'$c_arrays'((P:-Q),(NP:-QF)) :- !,
	'$c_arrays_body'(Q, QI),
	'$c_arrays_head'(P, NP, QI, QF).
'$c_arrays'(P, NP) :-
	'$c_arrays_fact'(P, NP).

'$c_arrays_body'(P, P) :-
	var(P), !.
'$c_arrays_body'((P0,Q0), (P,Q)) :- !,
	'$c_arrays_body'(P0, P),
	'$c_arrays_body'(Q0, Q).
'$c_arrays_body'((P0;Q0), (P;Q)) :- !,
	'$c_arrays_body'(P0, P),
	'$c_arrays_body'(Q0, Q).
'$c_arrays_body'((P0->Q0), (P->Q)) :- !,
	'$c_arrays_body'(P0, P),
	'$c_arrays_body'(Q0, Q).
'$c_arrays_body'(P, NP) :- '$c_arrays_lit'(P, NP).

%
% replace references to arrays to references to built-ins.
%
'$c_arrays_lit'(G, GL) :-
	'$array_references'(G, NG, VL),
	'$add_array_entries'(VL, NG, GL).

'$c_arrays_head'(G, NG, B, NB) :-
	'$array_references'(G, NG, VL),
	'$add_array_entries'(VL, B, NB).

'$c_arrays_fact'(G, NG) :-
	'$array_references'(G, IG, VL),
	(VL = [] -> NG = G;
	    NG = (IG :- NB), '$add_array_entries'(VL, true, NB)).

'$add_array_entries'([], NG, NG).
'$add_array_entries'([Head|Tail], G, (Head, NG)) :-
	'$add_array_entries'(Tail, G, NG).


static_array_properties(Name, Size, Type) :-
	atom(Name), !,
	'$static_array_properties'(Name, Size, Type).
static_array_properties(Name, Size, Type) :-
	var(Name), !,
	current_atom(Name),
	'$static_array_properties'(Name, Size, Type).
static_array_properties(Name, Size, Type) :-
	'$do_error'(type_error(atom,Name),static_array_properties(Name,Size,Type)).



	

