82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
/*************************************************************************
 | 
						|
*									 *
 | 
						|
*	 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(Obj, Size) :-
 | 
						|
	'$create_array'(Obj, Size).
 | 
						|
 | 
						|
 | 
						|
% 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)).
 | 
						|
 | 
						|
 | 
						|
 | 
						|
	
 | 
						|
 |