39
40:- module(basics,
41 [ append/3, flatten/2, ith/3,
42 length/2, member/2, memberchk/2, subset/2,
43 reverse/2, select/3,
44
45 for/3, 46 between/3,
47
48 ground/1,
49 copy_term/2,
50 copy_term_nat/2,
51
52 log_ith/3, log_ith_bound/3, log_ith_new/3, log_ith_to_list/2,
53 logk_ith/4,
54
55 comma_memberchk/2, abscomma_memberchk/2, comma_to_list/2,
56 comma_length/2, comma_member/2, comma_append/3
57 ]). 58:- use_module(library(lists)).
72for(I, B1, B2) :-
73 B2 >= B1,
74 !,
75 between(B1, B2, I).
76for(I, B1, B2) :-
77 End is B1 - B2,
78 between(0, End, Diff),
79 I is B1-Diff.
83ith(Index,List,Element) :-
84 nth1(Index, List, Element).
85
86log_ith(K,T,E) :-
87 (integer(K) 88 -> log_ith0(K,T,E,1)
89 ; log_ith1(K,T,E,1)
90 ).
91
93log_ith0(K,[L|R],E,N) :-
94 (K < N
95 -> bintree0(K,L,E,N)
96 ; K1 is K-N,
97 N2 is N+N,
98 log_ith0(K1,R,E,N2)
99 ).
100
102bintree0(K,T,E,N) :-
103 (N > 1
104 -> T = [L|R],
105 N2 is N // 2,
106 (K < N2
107 -> bintree0(K,L,E,N2)
108 ; K1 is K - N2,
109 bintree0(K1,R,E,N2)
110 )
111 ; K =:= 0,
112 T = E
113 ).
114
115
117log_ith1(K,[L|_R],E,N) :-
118 bintree1(K,L,E,N).
119log_ith1(K,[_L|R],E,N) :-
120 N1 is N + N,
121 log_ith1(K1,R,E,N1),
122 K is K1 + N.
123
125bintree1(0,E,E,1).
126bintree1(K,[L|R],E,N) :-
127 N > 1,
128 N2 is N // 2,
129 (bintree1(K,L,E,N2)
130 ;
131 bintree1(K1,R,E,N2),
132 K is K1 + N2
133 ).
134
141
142log_ith_bound(K,T,E) :-
143 nonvar(T),
144 (integer(K) 145 -> log_ith2(K,T,E,1)
146 ; log_ith3(K,T,E,1)
147 ).
148
149log_ith2(K,[L|R],E,N) :-
150 (K < N
151 -> nonvar(L),bintree2(K,L,E,N)
152 ; nonvar(R),
153 K1 is K-N,
154 N2 is N+N,
155 log_ith2(K1,R,E,N2)
156 ).
157
158bintree2(0,E,E,1) :- !.
159bintree2(K,[L|R],E,N) :-
160 N > 1,
161 N2 is N // 2,
162 (K < N2
163 -> nonvar(L),
164 bintree2(K,L,E,N2)
165 ; nonvar(R),
166 K1 is K - N2,
167 bintree2(K1,R,E,N2)
168 ).
169
170log_ith3(K,[L|_R],E,N) :-
171 nonvar(L),
172 bintree3(K,L,E,N).
173log_ith3(K,[_L|R],E,N) :-
174 nonvar(R),
175 N1 is N + N,
176 log_ith3(K1,R,E,N1),
177 K is K1 + N.
178
179bintree3(0,E,E,1).
180bintree3(K,[L|R],E,N) :-
181 N > 1,
182 N2 is N // 2,
183 (nonvar(L),
184 bintree3(K,L,E,N2)
185 ;
186 nonvar(R),
187 bintree3(K1,R,E,N2),
188 K is K1 + N2
189 ).
192log_ith_to_list(T,L) :- log_ith_to_list(T,0,L,[]).
193
194log_ith_to_list(T,K,L0,L) :-
195 (var(T)
196 -> L = L0
197 ; T = [F|R],
198 log_ith_to_list_btree(F,K,L0,L1),
199 K1 is K+1,
200 log_ith_to_list(R,K1,L1,L)
201 ).
202
203log_ith_to_list_btree(T,K,L0,L) :-
204 (var(T)
205 -> L = L0
206 ; K =:= 0
207 -> L0 = [T|L]
208 ; T = [TL|TR],
209 K1 is K-1,
210 log_ith_to_list_btree(TL,K1,L0,L1),
211 log_ith_to_list_btree(TR,K1,L1,L)
212 ).
213
216log_ith_new(I,T,E) :-
217 (var(T)
218 -> T = [E|_],
219 I = 0
220 ; log_ith_new_o(I,T,E,1,1)
221 ).
222
223log_ith_new_o(I,[L|R],E,K,NI) :-
224 (var(R),
225 log_ith_new_d(I,L,E,K,NIA)
226 -> I is NI + NIA - 1
227 ; NNI is 2*NI,
228 K1 is K+1,
229 log_ith_new_o(I,R,E,K1,NNI)
230 ).
231
232log_ith_new_d(I,T,E,K,NIA) :-
233 (K =< 1
234 -> var(T),
235 T=E,
236 NIA = 0
237 ; K1 is K-1,
238 T = [L|R],
239 (var(R),
240 log_ith_new_d(I,L,E,K1,NIA)
241 -> true
242 ; log_ith_new_d(I,R,E,K1,NNIA),
243 NIA is NNIA + 2 ** (K1-1)
244 )
245 ).
246
247
254logk_ith(K,I,T,E) :-
255 integer(K),
256 integer(I), 257 logk_ith0(K,I,T,E,K).
258
260logk_ith0(K,I,[L|R],E,N) :-
261 (I < N
262 -> ktree0(K,I,L,E,N)
263 ; I1 is I - N,
264 N2 is K*N,
265 logk_ith0(K,I1,R,E,N2)
266 ).
267
269ktree0(K,I,T,E,N) :-
270 (var(T)
271 -> functor(T,n,K)
272 ; true
273 ),
274 (N > K
275 -> N2 is N // K,
276 N3 is I // N2 + 1,
277 I1 is I rem N2, 278 arg(N3,T,T1),
279 ktree0(K,I1,T1,E,N2)
280 ; I1 is I+1,
281 arg(I1,T,E)
282 ).
283
287
288comma_to_list((One,Two),[One|Twol]):- !,
289 comma_to_list(Two,Twol).
290comma_to_list(One,[One]).
291
293comma_member(A,','(A,_)).
294comma_member(A,','(_,R)):-
295 comma_member(A,R).
296comma_member(A,A):- \+ (functor(A,',',2)).
297
298comma_memberchk(A,','(A,_)):- !.
299comma_memberchk(A,','(_,R)):-
300 comma_memberchk(A,R).
301comma_memberchk(A,A):- \+ (functor(A,',',_)).
302
303abscomma_memberchk(A,A1):- A == A1,!.
304abscomma_memberchk(','(A,_),A1):- A == A1,!.
305abscomma_memberchk(','(_,R),A1):-
306 abscomma_memberchk(R,A1).
307
308comma_length(','(_L,R),N1):- !,
309 comma_length(R,N),
310 N1 is N + 1.
311comma_length(true,0):- !.
312comma_length(_,1).
313
314comma_append(','(L,R),Cl,','(L,R1)):- !,
315 comma_append(R,Cl,R1).
316comma_append(true,Cl,Cl):- !.
317comma_append(L,Cl,Out):-
318 (Cl == true -> Out = L ; Out = ','(L,Cl))
XSB
basics.P
emulationThis module provides the XSB
basics
module. The implementation either simply uses SWI-Prolog built-ins and libraries or is copied from the XSB file. */