root/tags/lgt2308/library/set.lgt

Revision 3687, 5.3 KB (checked in by pmoura, 21 months ago)

Code reformating.

  • 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    :- info([
7        version is 1.0,
8        author is 'Paulo Moura',
9        date is 2000/7/24,
10        comment is 'Set predicates implemented using ordered lists. Uses ==/2 for element comparison and standard term ordering.']).
11
12    delete([], _, []).
13    delete([Head| Tail], Element, Remaining) :-
14        compare(Order, Head, Element),
15        delete(Order, Head, Tail, Element, Remaining).
16
17    delete(=, _, Tail, _, Tail).
18    delete(<, Head, Tail, Element, [Head| Tail2]) :-
19        delete(Tail, Element, Tail2).
20    delete(>, _, Tail, _, Tail).
21
22    disjoint([], _) :- !.
23    disjoint(_, []) :- !.
24    disjoint([Head1| Tail1], [Head2| Tail2]) :-
25        compare(Order, Head1, Head2),
26        disjoint(Order, Head1, Tail1, Head2, Tail2).
27
28    disjoint(<, _, Tail1, Head2, Tail2) :-
29        disjoint(Tail1, [Head2| Tail2]).
30    disjoint(>, Head1, Tail1, _, Tail2) :-
31        disjoint([Head1| Tail1], Tail2).
32
33    equal(Set1, Set2) :-
34        Set1 == Set2.
35
36    empty(Set) :-
37        Set == [].
38
39    insert([], Element, [Element]).
40    insert([Head| Tail], Element, Set) :-
41        compare(Order, Head, Element),
42        insert(Order, Head, Tail, Element, Set).
43
44    insert(<, Head, Tail, Element, [Head| Set]) :-
45        insert(Tail, Element, Set).
46    insert(=, Head, Tail, _, [Head| Tail]).
47    insert(>, Head, Tail, Element, [Element, Head| Tail]).
48
49    insert_all([], Set, Set).
50    insert_all([Head| Tail], Set1, Set3) :-
51        insert(Set1, Head, Set2),
52        insert_all(Tail, Set2, Set3).
53
54    intersect([Head1| Tail1], [Head2| Tail2]) :-
55        compare(Order, Head1, Head2),
56        intersect(Order, Head1, Tail1, Head2, Tail2).
57
58    intersect(=, _, _, _, _).
59    intersect(<, _, Tail1, Head2, Tail2) :-
60        intersect(Tail1, [Head2| Tail2]).
61    intersect(>, Head1, Tail1, _, Tail2) :-
62        intersect([Head1| Tail1], Tail2).
63
64    intersection(_, [], []) :- !.
65    intersection([], _, []) :- !.
66
67    intersection([Head1| Tail1], [Head2| Tail2], Intersection) :-
68        compare(Order, Head1, Head2),
69        intersection(Order, Head1, Tail1, Head2, Tail2, Intersection).
70
71    intersection(=, HeadTail1, _,     Tail2, [Head| Intersection]) :-
72        intersection(Tail1, Tail2, Intersection).
73    intersection(<, _,     Tail1, Head2, Tail2, Intersection) :-
74        intersection(Tail1, [Head2| Tail2], Intersection).
75    intersection(>, Head1, Tail1, _,     Tail2, Intersection) :-
76        intersection([Head1|Tail1], Tail2, Intersection).
77
78    length(Set, Length) :-
79        length(Set, 0, Length).
80
81    length([], Length, Length).
82    length([_| Set], Acc, Length) :-
83        Acc2 is Acc + 1,
84        length(Set, Acc2, Length).
85
86    member(Element, Set) :-
87        (   var(Element) ->
88            member_var(Element, Set)
89        ;   member_nonvar(Element, Set)
90        ).
91
92    member_var(Element, [Element| _]).
93    member_var(Element, [_| Set]) :-
94        member_var(Element, Set).
95
96    member_nonvar(Element, [Head| Tail]):-
97        compare(Order, Element, Head),
98        member_nonvar(Order, Element, Tail).
99
100    member_nonvar(=, _, _).
101    member_nonvar(>, Element, [Head| Tail]) :-
102        compare(Order, Element, Head),
103        member_nonvar(Order, Element, Tail).
104
105    new([]).
106
107    powerset(Set, PowerSet):-
108        reverse(Set, RSet),
109        powerset_1(RSet, [[]], PowerSet).
110
111    powerset_1([], PowerSet, PowerSet).
112    powerset_1([X| Xs], Yss0, Yss):-
113        powerset_2(Yss0, X, Yss1),
114        powerset_1(Xs, Yss1, Yss).
115
116    powerset_2([], _, []).
117    powerset_2([Zs| Zss], X, [Zs, [X| Zs]| Yss]):-
118        powerset_2(Zss, X, Yss).
119
120    reverse(List, Reversed) :-
121        reverse(List, [], Reversed).
122
123    reverse([], Reversed, Reversed).
124    reverse([Head| Tail], List, Reversed) :-
125        reverse(Tail, [Head| List], Reversed).
126
127    select(Head, [Head| Tail], Tail).
128    select(Head, [Head2| Tail], [Head2| Tail2]) :-
129        select(Head, Tail, Tail2).
130
131    subset([], _) :- !.
132    subset([Head1| Tail1], [Head2| Tail2]) :-
133        compare(Order, Head1, Head2),
134        subset(Order, Head1, Tail1, Head2, Tail2).
135
136    subset(=, _, Tail1, _, Tail2) :-
137        subset(Tail1, Tail2).
138    subset(>, Head1, Tail1, _, Tail2) :-
139        subset([Head1| Tail1], Tail2).
140
141    subtract(Set, [], Set) :- !.
142    subtract([], _, []) :- !.
143
144    subtract([Head1| Tail1], [Head2| Tail2], Difference) :-
145        compare(Order, Head1, Head2),
146        subtract(Order, Head1, Tail1, Head2, Tail2, Difference).
147
148    subtract(=, _, Tail1, _, Tail2, Difference) :-
149        subtract(Tail1, Tail2, Difference).
150    subtract(<, Head1, Tail1, Head2, Tail2, [Head1| Difference]) :-
151        subtract(Tail1, [Head2| Tail2], Difference).
152    subtract(>, Head1, Tail1, _, Tail2, Difference) :-
153        subtract([Head1| Tail1], Tail2, Difference).
154
155    symdiff(Set, [], Set) :- !.
156    symdiff([], Set, Set) :- !.
157    symdiff([Head1| Tail1], [Head2| Tail2], Difference) :-
158        compare(Order, Head1, Head2),
159        symdiff(Order, Head1, Tail1, Head2, Tail2, Difference).
160
161    symdiff(=, _, Tail1, _, Tail2, Difference) :-
162        symdiff(Tail1, Tail2, Difference).
163    symdiff(<, Head1, Tail1, Head2, Tail2, [Head1| Difference]) :-
164        symdiff(Tail1, [Head2| Tail2], Difference).
165    symdiff(>, Head1, Tail1, Head2, Tail2, [Head2| Difference]) :-
166        symdiff([Head1| Tail1], Tail2, Difference).
167
168    union(Set, [], Set) :- !.
169    union([], Set, Set) :- !.
170    union([Head1| Tail1], [Head2| Tail2], Union) :-
171        compare(Order, Head1, Head2),
172        union(Order, Head1, Tail1, Head2, Tail2, Union).
173
174    union(=, HeadTail1, _, Tail2, [Head| Union]) :-
175        union(Tail1, Tail2, Union).
176    union(<, Head1, Tail1, Head2, Tail2, [Head1| Union]) :-
177        union(Tail1, [Head2| Tail2], Union).
178    union(>, Head1, Tail1, Head2, Tail2, [Head2| Union]) :-
179        union([Head1| Tail1], Tail2, Union).
180
181    valid(Set) :-
182        nonvar(Set),
183        valid2(Set).
184
185    valid2([]) :-
186        !.
187    valid2([_]) :-
188        !.
189    valid2([Element1, Element2| Set]) :-
190        Element1 @< Element2,
191        valid2([Element2| Set]).
192
193:- end_object.
Note: See TracBrowser for help on using the browser.