root/trunk/library/list.lgt

Revision 4216, 4.4 KB (checked in by pmoura, 7 months ago)

Updated the definitions of the predicate valid/1 for the library objects "list", "list(Type)", "numberlist", "set", "set(Type)", "varlist" to fail for lists with unbound tails after discussion with Jan Wielemaker and Ulrich Neumerkel.

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