-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsetops.pl
58 lines (47 loc) · 1 KB
/
setops.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
:- module(setops, [
setintersect/3,
setunion/3,
setdiff/3,
makeset/2,
subset/2,
insertVal/3
], [assertions, isomodes, doccomments]).
:- use_module(library(lists)).
setintersect([],_,[]).
setintersect([X|Xs],Vs,[X|Ws]) :-
memb3(X,Vs),
!,
setintersect(Xs,Vs,Ws).
setintersect([_|Xs],Vs,Ws) :-
setintersect(Xs,Vs,Ws).
setunion([],X,X).
setunion([X|Xs],Vs,Ws) :-
memb3(X,Vs),
!,
setunion(Xs,Vs,Ws).
setunion([X|Xs],Vs,[X|Ws]) :-
setunion(Xs,Vs,Ws).
setdiff([],_,[]).
setdiff([X|Xs],Ys,Zs) :-
memb3(X,Ys),
!,
setdiff(Xs,Ys,Zs).
setdiff([X|Xs],Ys,[X|Zs]) :-
setdiff(Xs,Ys,Zs).
makeset(S1,S2) :-
makeset3(S1,[],S2).
makeset3([],S,S).
makeset3([X|Xs],S0,S2) :-
insertVal(X,S0,S1),
makeset3(Xs,S1,S2).
subset(X,Y) :-
\+ (member(Z,X), \+ memb3(Z,Y)).
memb3(X,[X1|_]) :-
X == X1,
!.
memb3(X,[_|Xs]) :-
memb3(X,Xs).
insertVal(X,L,L) :-
memb3(X,L),
!.
insertVal(X,L,[X|L]).