move length to lists
This commit is contained in:
parent
a3a6386353
commit
83a3c52a75
52
pl/lists.yap
52
pl/lists.yap
@ -1,3 +1,13 @@
|
||||
/**
|
||||
* @file pl/lists.yap
|
||||
* @author VITOR SANTOS COSTA <vsc@VITORs-MBP.lan>
|
||||
* @date Thu Nov 19 09:54:00 2015
|
||||
*
|
||||
* @brief core lisy operations
|
||||
*
|
||||
* @ingroup lists
|
||||
* @{
|
||||
*/
|
||||
|
||||
:- system_module( '$_lists', [], []).
|
||||
|
||||
@ -88,4 +98,46 @@ lists:delete([Head|List], Elem, [Head|Residue]) :-
|
||||
|
||||
:- set_prolog_flag(source, false). % disable source.
|
||||
|
||||
|
||||
|
||||
% length of a list.
|
||||
|
||||
/** @pred length(? _L_,? _S_)
|
||||
|
||||
|
||||
Unify the well-defined list _L_ with its length. The procedure can
|
||||
be used to find the length of a pre-defined list, or to build a list
|
||||
of length _S_.
|
||||
|
||||
*/
|
||||
|
||||
prolog:length(L, M) :-
|
||||
'$skip_list'(L, M, M0, R),
|
||||
( var(R) -> '$$_length'(R, M, M0) ;
|
||||
R == []
|
||||
).
|
||||
|
||||
%
|
||||
% in case A1 is unbound or a difference list, things get tricky
|
||||
%
|
||||
'$$_length'(R, M, M0) :-
|
||||
( var(M) -> '$$_length1'(R,M,M0)
|
||||
; M >= M0 -> '$$_length2'(R,M,M0) ).
|
||||
|
||||
%
|
||||
% Size is unbound, generate lists
|
||||
%
|
||||
'$$_length1'([], M, M).
|
||||
'$$_length1'([_|L], O, N) :-
|
||||
M is N + 1,
|
||||
'$$_length1'(L, O, M).
|
||||
|
||||
%
|
||||
% Size is bound, generate single list
|
||||
%
|
||||
'$$_length2'(NL, O, N) :-
|
||||
( N =:= O -> NL = [];
|
||||
M is N + 1, NL = [_|L], '$$_length2'(L, O, M) ).
|
||||
|
||||
%% @}
|
||||
|
||||
|
41
pl/sort.yap
41
pl/sort.yap
@ -37,47 +37,6 @@
|
||||
|
||||
*/
|
||||
|
||||
% length of a list.
|
||||
|
||||
/** @pred length(? _L_,? _S_)
|
||||
|
||||
|
||||
Unify the well-defined list _L_ with its length. The procedure can
|
||||
be used to find the length of a pre-defined list, or to build a list
|
||||
of length _S_.
|
||||
|
||||
|
||||
|
||||
|
||||
*/
|
||||
length(L, M) :-
|
||||
'$skip_list'(L, M, M0, R),
|
||||
( var(R) -> '$$_length'(R, M, M0) ;
|
||||
R == []
|
||||
).
|
||||
|
||||
%
|
||||
% in case A1 is unbound or a difference list, things get tricky
|
||||
%
|
||||
'$$_length'(R, M, M0) :-
|
||||
( var(M) -> '$$_length1'(R,M,M0)
|
||||
; M >= M0 -> '$$_length2'(R,M,M0) ).
|
||||
|
||||
%
|
||||
% Size is unbound, generate lists
|
||||
%
|
||||
'$$_length1'([], M, M).
|
||||
'$$_length1'([_|L], O, N) :-
|
||||
M is N + 1,
|
||||
'$$_length1'(L, O, M).
|
||||
|
||||
%
|
||||
% Size is bound, generate single list
|
||||
%
|
||||
'$$_length2'(NL, O, N) :-
|
||||
( N =:= O -> NL = [];
|
||||
M is N + 1, NL = [_|L], '$$_length2'(L, O, M) ).
|
||||
|
||||
/** @pred sort(+ _L_,- _S_) is iso
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user