root/tags/lgt293/library/list.lgt

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