root/trunk/library/difflist.lgt

Revision 3688, 6.8 KB (checked in by pmoura, 19 months ago)

Code reformating.

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