fix new version of length/2.
This commit is contained in:
parent
805ad7f958
commit
aef7555e02
29
pl/sort.yap
29
pl/sort.yap
|
@ -27,26 +27,31 @@
|
||||||
length(L, M) :-
|
length(L, M) :-
|
||||||
'$skip_list'(M0, L, R),
|
'$skip_list'(M0, L, R),
|
||||||
( R == [] -> M = M0 ;
|
( R == [] -> M = M0 ;
|
||||||
var(R) -> '$$_length1'(R, M, M0) ;
|
var(R) -> '$$_length'(R, M, M0) ;
|
||||||
'$do_error'(type_error(list,L),length(L,M))
|
'$do_error'(type_error(list,L),length(L,M))
|
||||||
).
|
).
|
||||||
|
|
||||||
|
%
|
||||||
|
% 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'([], M, M).
|
||||||
'$$_length1'([_|L], O, N) :-
|
'$$_length1'([_|L], O, N) :-
|
||||||
M is N + 1,
|
M is N + 1,
|
||||||
'$$_length1'(L, O, M).
|
'$$_length1'(L, O, M).
|
||||||
|
|
||||||
'$$_length2'(L, N) :-
|
%
|
||||||
( N =:= 0
|
% Size is bound, generate single list
|
||||||
->
|
%
|
||||||
L = []
|
'$$_length2'(NL, O, N) :-
|
||||||
;
|
( N =:= O -> NL = [];
|
||||||
N > 0,
|
M is N + 1, NL = [_|L], '$$_length2'(L, O, M) ).
|
||||||
N1 is N - 1,
|
|
||||||
L = [_|L1],
|
|
||||||
'$$_length2'(L1, N1)
|
|
||||||
).
|
|
||||||
|
|
||||||
|
|
||||||
sort(L,O) :-
|
sort(L,O) :-
|
||||||
'$sort'(L,O).
|
'$sort'(L,O).
|
||||||
|
|
Reference in New Issue