root/tags/lgt290/library/difflist.lgt

Revision 2, 6.6 KB (checked in by pmoura, 7 years ago)

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1
2:- object(difflist,
3    implements(listp),
4    extends(compound)).
5
6
7    :- info([
8        version is 1.0,
9        authors is 'Paulo Moura',
10        date is 2000/7/24,
11        comment is 'Difference list predicates.']).
12
13
14    :- public(as_list/2).
15
16    :- mode(as_list(+list, -list), one).
17
18    :- info(as_list/2,
19        [comment is 'Converts a difference list to a normal list.',
20         argnames is ['Diffist', 'List']]).
21
22
23    append(List1-Back1, Back1-Back2, List1-Back2) :-
24        nonvar(List1),
25        nonvar(Back1),
26        !.
27
28    append(Prefix, Suffix, List) :-
29        length(List, Length),
30        prefix(Prefix, List),
31        length(Prefix, PLength),
32        SLength is Length - PLength,
33        length(Suffix, SLength),
34        suffix(Suffix, List).
35
36
37    as_list(List-Back, Out) :-
38        List == Back ->
39            Out = []
40            ;
41            Out = [Head| Tail],
42            List = [Head| Rest],
43            as_list(Rest-Back, Tail).
44
45
46    delete(List-Back, Element, Remaining) :-
47        List == Back ->
48            unify_with_occurs_check(Remaining, Back-Back)
49            ;
50            List \== Back,
51            List = [Head| Tail],
52            (Head == Element ->
53                delete(Tail-Back, Element, Remaining)
54                ;
55                Remaining = [Head| Tail2],
56                delete(Tail-Back, Element, Tail2-Back)).
57
58
59
60    delete_matches(List-Back, Element, Remaining) :-
61        List == Back ->
62            unify_with_occurs_check(Remaining, Back-Back)
63            ;
64            List \== Back,
65            List = [Head| Tail],
66            (\+ \+ Head = Element ->
67                delete_matches(Tail-Back, Element, Remaining)
68                ;
69                Remaining = [Head| Tail2],
70                delete_matches(Tail-Back, Element, Tail2-Back)).
71
72
73    empty(List-Back) :-
74        List == Back.
75
76
77    flatten(List-Back, Flatted-Back) :-
78        flatten(List-Back, Back-Back, Flatted-Back).
79
80
81    flatten(Var, Tail-Back, [Var| Tail]-Back) :-
82        var(Var),
83        !.
84
85    flatten(List-Back, Flatted, Flatted) :-
86        List == Back,
87        !.
88
89    flatten(List-Back, Acc, Flatted) :-
90        !,
91        List \== Back,
92        List = [Head| Tail],
93        flatten(Tail-Back, Acc, Acc2),
94        flatten(Head, Acc2, Flatted).
95
96    flatten(Head, Tail-Back, [Head| Tail]-Back).
97
98
99    keysort(Difflist, Sorted) :-
100        as_list(Difflist, List),
101        {keysort(List, List2)},
102        list::as_difflist(List2, Sorted).       
103
104
105    last(List-Back, Last) :-
106        List \== Back,
107        List = [Head| Tail],
108        last(Tail-Back, Head, Last).
109
110
111    last(List, Last, Last) :-
112        unify_with_occurs_check(List, Back-Back).
113
114    last(List-Back, _, Last) :-
115        List \== Back,
116        List = [Head| Tail],
117        last(Tail-Back, Head, Last).
118
119
120    length(List, Length) :-
121        integer(Length) ->
122            Length >= 0,
123            make_list(Length, List)
124            ;
125            length(List, 0, Length).
126
127
128    length(List, Length, Length) :-
129        unify_with_occurs_check(List, Back-Back).
130
131    length(List-Back, Acc, Length) :-
132        List \== Back,
133        List = [_| Tail],
134        Acc2 is Acc + 1,
135        length(Tail-Back, Acc2, Length).
136
137
138    make_list(0, List):-
139        !,
140        unify_with_occurs_check(List, Back-Back).
141
142    make_list(N, List-Back):-
143        List \== Back,
144        List = [_| Tail],
145        M is N-1,
146        make_list(M, Tail-Back).
147
148
149    max(List-Back, Max) :-
150        List \== Back,
151        List = [Head| Tail],
152        max(Tail-Back, Head, Max).
153
154
155    max(List-Back, Max, Max) :-
156        List == Back, !.
157
158    max(List-Back, Aux, Max) :-
159        List \== Back,
160        List = [Head| Tail],
161        (Aux @< Head ->
162            max(Tail-Back, Head, Max)
163            ;
164            max(Tail-Back, Aux, Max)).
165
166
167    member(Element, List-Back) :-
168        List \== Back,
169        List = [Element|_].
170
171    member(Element, List-Back) :-
172        List \== Back,
173        List = [_| Tail],
174        member(Element, Tail-Back).
175
176
177    memberchk(Element, List) :-
178        once(member(Element, List)).
179
180
181    nth(Position, List, Element) :-
182        nth(Element, List, 1, Position).
183
184
185    nth(Element, List-Back, Position, Position) :-
186        List \== Back,
187        List = [Element| _].
188
189    nth(Element, List-Back, Count, Position) :-
190        List \== Back,
191        List = [_| Tail],
192        Count2 is Count + 1,
193        nth(Element, Tail-Back, Count2, Position).
194
195
196    min(List-Back, Min) :-
197        List \== Back,
198        List = [Head| Tail],
199        min(Tail-Back, Head, Min).
200
201
202    min(List-Back, Min, Min) :-
203        List == Back, !.
204
205    min(List-Back, Aux, Min) :-
206        List \== Back,
207        List = [Head| Tail],
208        (Head @< Aux ->
209            min(Tail-Back, Head, Min)
210            ;
211            min(Tail-Back, Aux, Min)).
212
213
214    new(List) :-
215        unify_with_occurs_check(List, Back-Back).
216
217
218    permutation(List, Permutation) :-
219        same_length(List, Permutation),
220        permutation2(List, Permutation).
221
222
223    permutation2(List1-Back1, List2-Back2) :-
224        List1 == Back1,
225        List2 == Back2.
226
227    permutation2(List1-Back1, List2-Back2) :-
228        List2 \== Back2,
229        List2 = [Head2| Tail2],
230        select(Head2, List1-Back1, Tail1-Back1),
231        permutation2(Tail1-Back1, Tail2-Back2).
232
233
234    prefix(List, _) :-
235        unify_with_occurs_check(List, Back-Back).
236
237    prefix(List-Back, List2-Back2) :-
238        List \== Back,
239        List = [Head| Tail],
240        List2 \== Back2,
241        List2 = [Head| Tail2],
242        prefix(Tail-Back, Tail2-Back2).
243
244
245    reverse(List-Back, Reversed-Back) :-
246        same_length(List-Back, Reversed-Back),
247        reverse(List-Back, Back-Back, Reversed-Back).
248
249
250    reverse(List-Back, Reversed, Reversed) :-
251        List == Back.
252
253    reverse(List-Back, Acc-Back, Reversed) :-
254        List \== Back,
255        List = [Head| Tail],
256        reverse(Tail-Back, [Head| Acc]-Back, Reversed).
257
258
259    same_length(List1, List2) :-
260        unify_with_occurs_check(List1, Back1-Back1),
261        unify_with_occurs_check(List2, Back2-Back2).
262
263    same_length(List1-Back1, List2-Back2) :-
264        List1 \== Back1,
265        List1 = [_| Tail1],
266        List2 \== Back2,
267        List2 = [_| Tail2],
268        same_length(Tail1-Back1, Tail2-Back2).
269
270
271    select(Head, List-Back, Tail-Back) :-
272        List \== Back,
273        List = [Head| Tail].
274
275    select(Head, List-Back, List2-Back) :-
276        List \== Back,
277        List = [Other| Tail],
278        List2 \== Back,
279        List2 = [Other| Tail2],
280        select(Head, Tail-Back, Tail2-Back).
281
282
283    sort(Difflist, Sorted) :-
284        as_list(Difflist, List),
285        {sort(List, List2)},
286        list::as_difflist(List2, Sorted).       
287
288
289    sublist(Sublist, List) :-
290        unify_with_occurs_check(Sublist, List).
291
292    sublist(Sublist-Back, List-Back):-
293        List \== Back,
294        List = [Head| Tail],
295        sublist(Tail-Back, Head, Sublist-Back).
296
297
298    sublist(List, _, Sublist) :-
299        unify_with_occurs_check(List, Sublist).
300
301    sublist(List-Back, _, Sublist-Back):-
302        List \== Back,
303        List = [Head| Tail],
304        sublist(Tail-Back, Head, Sublist-Back).
305
306    sublist(List-Back, Element, [Element| Sublist]-Back):-
307        List \== Back,
308        List = [Head| Tail],
309        sublist(Tail-Back, Head, Sublist-Back).
310
311
312    subtract(List-Back, _, Result) :-
313        unify_with_occurs_check(Result, Back-Back),
314        List == Back, !.
315
316    subtract(List-Back, Ys, List2-Back) :-
317        List \== Back,
318        List = [Head| Tail],
319        (member(Head, Ys) ->
320            subtract(Tail-Back, Ys, List2-Back)
321            ;
322            List2 = [Head| Tail2],
323            subtract(Tail-Back, Ys, Tail2-Back)).
324
325
326    suffix(Suffix, List) :-
327        unify_with_occurs_check(Suffix, List).
328
329    suffix(Suffix-Back, List-Back) :-
330        List \== Back,
331        List = [_| Tail],
332        suffix(Suffix-Back, Tail-Back).
333
334
335    valid(List) :-
336        nonvar(List),
337        valid2(List).
338
339
340    valid2(List-Back) :-
341        List == Back,
342        !.
343
344    valid2(List-Back) :-
345        nonvar(List),
346        List = [_| Tail],
347        valid2(Tail-Back).
348
349
350:- end_object.
Note: See TracBrowser for help on using the browser.