e5f4633c39
which included commits to RCS files with non-trunk default branches. git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
68 lines
1.7 KiB
Prolog
68 lines
1.7 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(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).
|
|
|
|
|