root/tags/lgt290/library/set.lgt

Revision 2, 5.4 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(set,
3    implements(setp),
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 'Set predicates implemented using ordered lists. Uses ==/2 for element comparison and standard term ordering.']).
12
13
14    delete([], _, []).
15
16    delete([Head| Tail], Element, Remaining) :-
17        compare(Order, Head, Element),
18        delete(Order, Head, Tail, Element, Remaining).
19
20    delete(=, _, Tail, _, Tail).
21
22    delete(<, Head, Tail, Element, [Head| Tail2]) :-
23        delete(Tail, Element, Tail2).
24
25    delete(>, _, Tail, _, Tail).
26
27
28    disjoint([], _) :- !.
29
30    disjoint(_, []) :- !.
31
32    disjoint([Head1| Tail1], [Head2| Tail2]) :-
33        compare(Order, Head1, Head2),
34        disjoint(Order, Head1, Tail1, Head2, Tail2).
35
36
37    disjoint(<, _, Tail1, Head2, Tail2) :-
38        disjoint(Tail1, [Head2| Tail2]).
39
40    disjoint(>, Head1, Tail1, _, Tail2) :-
41        disjoint([Head1| Tail1], Tail2).
42
43
44    equal(Set1, Set2) :-
45        Set1 == Set2.
46
47
48    empty(Set) :-
49        Set == [].
50
51
52    insert([], Element, [Element]).
53
54    insert([Head| Tail], Element, Set) :-
55        compare(Order, Head, Element),
56        insert(Order, Head, Tail, Element, Set).
57
58
59    insert(<, Head, Tail, Element, [Head| Set]) :-
60        insert(Tail, Element, Set).
61
62    insert(=, Head, Tail, _, [Head| Tail]).
63
64    insert(>, Head, Tail, Element, [Element, Head| Tail]).
65
66
67    insert_all([], Set, Set).
68
69    insert_all([Head| Tail], Set1, Set3) :-
70        insert(Set1, Head, Set2),
71        insert_all(Tail, Set2, Set3).
72
73
74    intersect([Head1| Tail1], [Head2| Tail2]) :-
75        compare(Order, Head1, Head2),
76        intersect(Order, Head1, Tail1, Head2, Tail2).
77
78    intersect(=, _, _, _, _).
79
80    intersect(<, _, Tail1, Head2, Tail2) :-
81        intersect(Tail1, [Head2| Tail2]).
82
83    intersect(>, Head1, Tail1, _, Tail2) :-
84        intersect([Head1| Tail1], Tail2).
85
86
87    intersection(_, [], []) :- !.
88
89    intersection([], _, []) :- !.
90
91    intersection([Head1| Tail1], [Head2| Tail2], Intersection) :-
92        compare(Order, Head1, Head2),
93        intersection(Order, Head1, Tail1, Head2, Tail2, Intersection).
94
95    intersection(=, HeadTail1, _,     Tail2, [Head| Intersection]) :-
96        intersection(Tail1, Tail2, Intersection).
97
98    intersection(<, _,     Tail1, Head2, Tail2, Intersection) :-
99        intersection(Tail1, [Head2| Tail2], Intersection).
100
101    intersection(>, Head1, Tail1, _,     Tail2, Intersection) :-
102        intersection([Head1|Tail1], Tail2, Intersection).
103
104
105    length(Set, Length) :-
106        length(Set, 0, Length).
107
108
109    length([], Length, Length).
110
111    length([_| Set], Acc, Length) :-
112        Acc2 is Acc + 1,
113        length(Set, Acc2, Length).
114
115
116    member(Element, Set) :-
117        var(Element) ->
118            member_var(Element, Set)
119            ;
120            member_nonvar(Element, Set).
121
122
123    member_var(Element, [Element| _]).
124
125    member_var(Element, [_| Set]) :-
126        member_var(Element, Set).
127
128
129    member_nonvar(Element, [Head| Tail]):-
130        compare(Order, Element, Head),
131        member_nonvar(Order, Element, Tail).
132
133    member_nonvar(=, _, _).
134
135    member_nonvar(>, Element, [Head| Tail]) :-
136        compare(Order, Element, Head),
137        member_nonvar(Order, Element, Tail).
138
139
140    new([]).
141
142
143    powerset(Set, PowerSet):-
144        reverse(Set, RSet),
145        powerset_1(RSet, [[]], PowerSet).
146
147
148    powerset_1([], PowerSet, PowerSet).
149
150    powerset_1([X| Xs], Yss0, Yss):-
151        powerset_2(Yss0, X, Yss1),
152        powerset_1(Xs, Yss1, Yss).
153
154
155    powerset_2([], _, []).
156
157    powerset_2([Zs| Zss], X, [Zs, [X| Zs]| Yss]):-
158        powerset_2(Zss, X, Yss).
159
160
161    reverse(List, Reversed) :-
162        reverse(List, [], Reversed).
163
164
165    reverse([], Reversed, Reversed).
166
167    reverse([Head| Tail], List, Reversed) :-
168        reverse(Tail, [Head| List], Reversed).
169
170
171    select(Head, [Head| Tail], Tail).
172
173    select(Head, [Head2| Tail], [Head2| Tail2]) :-
174        select(Head, Tail, Tail2).
175
176
177    subset([], _) :- !.
178
179    subset([Head1| Tail1], [Head2| Tail2]) :-
180        compare(Order, Head1, Head2),
181        subset(Order, Head1, Tail1, Head2, Tail2).
182
183
184    subset(=, _, Tail1, _, Tail2) :-
185        subset(Tail1, Tail2).
186
187    subset(>, Head1, Tail1, _, Tail2) :-
188        subset([Head1| Tail1], Tail2).
189
190
191    subtract(Set, [], Set) :- !.
192
193    subtract([], _, []) :- !.
194
195    subtract([Head1| Tail1], [Head2| Tail2], Difference) :-
196        compare(Order, Head1, Head2),
197        subtract(Order, Head1, Tail1, Head2, Tail2, Difference).
198
199
200    subtract(=, _, Tail1, _, Tail2, Difference) :-
201        subtract(Tail1, Tail2, Difference).
202
203    subtract(<, Head1, Tail1, Head2, Tail2, [Head1| Difference]) :-
204        subtract(Tail1, [Head2| Tail2], Difference).
205
206    subtract(>, Head1, Tail1, _, Tail2, Difference) :-
207        subtract([Head1| Tail1], Tail2, Difference).
208
209
210    symdiff(Set, [], Set) :- !.
211
212    symdiff([], Set, Set) :- !.
213
214    symdiff([Head1| Tail1], [Head2| Tail2], Difference) :-
215        compare(Order, Head1, Head2),
216        symdiff(Order, Head1, Tail1, Head2, Tail2, Difference).
217
218
219    symdiff(=, _, Tail1, _, Tail2, Difference) :-
220        symdiff(Tail1, Tail2, Difference).
221
222    symdiff(<, Head1, Tail1, Head2, Tail2, [Head1| Difference]) :-
223        symdiff(Tail1, [Head2| Tail2], Difference).
224
225    symdiff(>, Head1, Tail1, Head2, Tail2, [Head2| Difference]) :-
226        symdiff([Head1| Tail1], Tail2, Difference).
227
228
229    union(Set, [], Set) :- !.
230
231    union([], Set, Set) :- !.
232
233    union([Head1| Tail1], [Head2| Tail2], Union) :-
234        compare(Order, Head1, Head2),
235        union(Order, Head1, Tail1, Head2, Tail2, Union).
236
237
238    union(=, HeadTail1, _, Tail2, [Head| Union]) :-
239        union(Tail1, Tail2, Union).
240
241    union(<, Head1, Tail1, Head2, Tail2, [Head1| Union]) :-
242        union(Tail1, [Head2| Tail2], Union).
243
244    union(>, Head1, Tail1, Head2, Tail2, [Head2| Union]) :-
245        union([Head1| Tail1], Tail2, Union).
246
247
248    valid(Set) :-
249        nonvar(Set),
250        valid2(Set).
251
252    valid2([]) :-
253        !.
254
255    valid2([_]) :-
256        !.
257
258    valid2([Element1, Element2| Set]) :-
259        Element1 @< Element2,
260        valid2([Element2| Set]).
261
262
263:- end_object.
Note: See TracBrowser for help on using the browser.