%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % topology, ultrafilter, simple games, and matorid %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 16-8, 19-20 Oct 2009; revised 7 Jan 2010 % ufilter.pl % By Kenryo Indo %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Group (set theoretical) operations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % project_id/4: projection for social choice set/ coalition % cited: 16 Oct 2009 (scsr/4 in spcf09.pl) project_id(0,[],[],[]). project_id(J,[_|Y],[0|B],C):- project_id(J,Y,B,C). project_id(K,[X|Y],[1|B],[X|C]):- project_id(J,Y,B,C), length(Y,I), K is J+ 2^I. agents([1,2,3]). agent(I):- agents(N), member(I,N). group(Pid,P,C):- var(C),agents(N), project_id(Pid,N,P,C). group(Pid,P,C):- \+ var(C),group(Pid,P,D),same_members(C,D). all_groups(L):- findall(I,group(I,_,_),L). is_complement_of( A, B):- group(A,P,_),project_reverse(P,Q),group(B,Q,_). project_reverse([],[]). project_reverse([X|B],[Y|C]):- project_reverse(B,C), digit_reverse(X,Y). digit_reverse(1,0). digit_reverse(0,1). /* ?- group(I,K,P),writeln(I;K;P),fail. 0;[0, 0, 0];[] 1;[0, 0, 1];[3] 2;[0, 1, 0];[2] 3;[0, 1, 1];[2, 3] 4;[1, 0, 0];[1] 5;[1, 0, 1];[1, 3] 6;[1, 1, 0];[1, 2] 7;[1, 1, 1];[1, 2, 3] false. ?- group(A,_,B),is_complement_of(C,A),group(C,_,D),writeln(A:B-C:D),fail. 0:[]-7:[1, 2, 3] 1:[3]-6:[1, 2] 2:[2]-5:[1, 3] 3:[2, 3]-4:[1] 4:[1]-3:[2, 3] 5:[1, 3]-2:[2] 6:[1, 2]-1:[3] 7:[1, 2, 3]-0:[] */ same_members(X,Y):- subtract(X,Y, []), subtract(Y,X, []). is_a_union_of_groups(X,[Y,Z],T):- member(Y, T), group(Y,_,C), member(Z, T), group(Z,_,D), union(C,D,W), same_members(W,V), group(X,_,V). is_an_intersection_of_groups(X,[Y,Z],T):- member(Y, T), group(Y,_,C), member(Z, T), group(Z,_,D), intersection(C,D,W), same_members(W,V), group(X,_,V). intersection_in_list([M], M). intersection_in_list([C|L], M1):- intersection_in_list(L, M), intersection(M, C, M1). has_a_supergroup(X,Y,T):- group(X,_,C), member(Y,T), group(Y,_,D), D\=[], subset(C,D). has_a_subgroup(X,Y,T):- group(X,_,C), member(Y,T), group(Y,_,D), D\=[], subset(D,C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Topology %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% topology(Tid, T):- all_groups(L), reverse(L,R), topology_id(Tid,R,_,T), Tid \= 0. topology_id(0,[],[],[]). topology_id(J,[X|Y],[0|B],C):- topology_id(J,Y,B,C), \+ topology_axiom(add_if, X,C). topology_id(K,[X|Y],[1|B],[X|C]):- topology_id(J,Y,B,C), \+ topology_axiom(remove_if, X,C), length(Y,I), K is J+ 2^I. topology_axiom(add_if, X,_):- group(X,_,[]). topology_axiom(add_if, X,_):- agents(N), group(X,_,N). topology_axiom(remove_if, X,T):- has_an_empty_intersection(X,_,T). topology_axiom(add_if, X,T):- is_a_union_of_groups(X,_,T). has_an_empty_intersection(X,S,T):- group(X,_,C),C \= [], is_a_collection_of_groups(S,L, T), subtract(L,[[]],U), intersection_in_list([C|U],[]). is_a_collection_of_groups(S,L, T):- project_id(_,T,_,S), findall( C,(member(I,S),group(I,_,C)),L). /* ?- all_groups(L),is_a_collection_of_groups(S,O,L),intersection_in_list(O,M),M\=[]. L = [0, 1, 2, 3, 4, 5, 6, 7], S = [7], O = [[1, 2, 3]], M = [1, 2, 3] ; L = [0, 1, 2, 3, 4, 5, 6, 7], S = [6], O = [[1, 2]], M = [1, 2] ; L = [0, 1, 2, 3, 4, 5, 6, 7], S = [6, 7], O = [[1, 2], [1, 2, 3]], M = [1, 2] . */ /* ?- topology(I,Y),writeln(I;Y),fail. 129;[7, 0] 131;[7, 1, 0] 133;[7, 2, 0] 137;[7, 3, 0] 139;[7, 3, 1, 0] 141;[7, 3, 2, 0] 145;[7, 4, 0] 161;[7, 5, 0] 163;[7, 5, 1, 0] 169;[7, 5, 3, 0] 171;[7, 5, 3, 1, 0] 177;[7, 5, 4, 0] 193;[7, 6, 0] 197;[7, 6, 2, 0] 201;[7, 6, 3, 0] 205;[7, 6, 3, 2, 0] 209;[7, 6, 4, 0] 225;[7, 6, 5, 0] 241;[7, 6, 5, 4, 0] false. ?- topology(I,Y),is_a_collection_of_groups(Y,O,Y),writeln(I;O),fail. 129;[[1, 2, 3], []] 131;[[1, 2, 3], [3], []] 133;[[1, 2, 3], [2], []] 137;[[1, 2, 3], [2, 3], []] 139;[[1, 2, 3], [2, 3], [3], []] 141;[[1, 2, 3], [2, 3], [2], []] 145;[[1, 2, 3], [1], []] 161;[[1, 2, 3], [1, 3], []] 163;[[1, 2, 3], [1, 3], [3], []] 169;[[1, 2, 3], [1, 3], [2, 3], []] 171;[[1, 2, 3], [1, 3], [2, 3], [3], []] 177;[[1, 2, 3], [1, 3], [1], []] 193;[[1, 2, 3], [1, 2], []] 197;[[1, 2, 3], [1, 2], [2], []] 201;[[1, 2, 3], [1, 2], [2, 3], []] 205;[[1, 2, 3], [1, 2], [2, 3], [2], []] 209;[[1, 2, 3], [1, 2], [1], []] 225;[[1, 2, 3], [1, 2], [1, 3], []] 241;[[1, 2, 3], [1, 2], [1, 3], [1], []] false. */ % terminology of topology points(N):- agents(N). point(I):- agent(I). is_open( X, C, Tid):- topology(Tid,T), member(X, T), group(X, _,C). is_closed( X, C, T):- is_open( Y, _, T), is_complement_of(X, Y), group(X,_,C). is_clopen( X, C, T):- is_open(X, C, T), is_closed( X, C, T). /* ?- I=131,topology(I,Y),member(X,Y),group(X,_,Z),writeln(Y;X;Z),fail. [7, 1, 0];7;[1, 2, 3] [7, 1, 0];1;[3] [7, 1, 0];0;[] false. ?- is_open(X,B,131),B\=[]. X = 7, B = [1, 2, 3] ; X = 1, B = [3] ; false. ?- is_closed(X,B,131). X = 0, B = [] ; X = 6, B = [1, 2] ; X = 7, B = [1, 2, 3] ; false. ?- is_clopen(X,B,131). X = 7, B = [1, 2, 3] ; X = 0, B = [] ; */ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % filter, ultrafilter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ufilter(Fid, T):- filter(Fid, T), \+ (filter(_, S), S\=T, subset(T, S)). filter(Fid, T):- all_groups(L), filter_id(Fid,L,_,T,_), Fid \= 0. filter_id(0,[],[],[],[]). filter_id(J,[X|Y],[0|B],C,[X|D]):- filter_id(J,Y,B,C,D), \+ filter_axiom(add_if, X,C,D). filter_id(K,[X|Y],[1|B],[X|C],D):- filter_id(J,Y,B,C,D), \+ filter_axiom(remove_if, X,C,D), length(Y,I), K is J + 2 ^ I. filter_axiom(remove_if, X,_,_):- group(X,_,[]). filter_axiom(add_if, X,_,_):- agents(N), group(X,_,N). filter_axiom(add_if, X,C,_):- has_a_subgroup(X,_,C). filter_axiom(remove_if, X,_,D):- has_a_supergroup(X,_,D). %filter_axiom(add_if, X,C,_):- is_an_intersection_of_groups(X,_,C). %filter_axiom(remove_if, X,_,D):- has_an_intersection_that_has_been_excluded(X,_,D). filter_axiom(add_if, X,_,D):- complement_has_been_excluded(X,_,D). filter_axiom(remove_if, X,C,_):- complement_has_been_included(X,_,C). has_an_intersection_that_has_been_excluded(X,Y,T):- is_an_intersection_of_groups(Y,[X,_],[X|T]), \+ member(Y,T). complement_has_been_excluded(X,Y,T):- is_complement_of(X,Y), member(Y,T). complement_has_been_included(X,Y,T):- is_complement_of(X,Y), member(Y,T). /* ?- filter(I,Y),writeln(I;Y),fail. 15;[4, 5, 6, 7] 23;[3, 5, 6, 7] 51;[2, 3, 6, 7] 85;[1, 3, 5, 7] false. ?- ufilter(I,Y),writeln(I;Y),fail. 15;[4, 5, 6, 7] 23;[3, 5, 6, 7] 51;[2, 3, 6, 7] 85;[1, 3, 5, 7] false. ?- ufilter(I,Y),is_a_collection_of_groups(Y,O,Y),writeln(I;O),fail. 15;[[1], [1, 3], [1, 2], [1, 2, 3]] 23;[[2, 3], [1, 3], [1, 2], [1, 2, 3]] 51;[[2], [2, 3], [1, 2], [1, 2, 3]] 85;[[3], [2, 3], [1, 3], [1, 2, 3]] false. */ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % simple games %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sgame(Wid, W):- all_groups(L), reverse(L,R), sgame_id(Wid,R,_,W,_), Wid \= 0. sgame_id(0,[],[],[],[]). sgame_id(J,[X|Y],[0|B],C,[X|D]):- sgame_id(J,Y,B,C,D), \+ sgame_axiom(add_if, X,C,D). sgame_id(K,[X|Y],[1|B],[X|C],D):- sgame_id(J,Y,B,C,D), \+ sgame_axiom(remove_if, X,C,D), length(Y,I), K is J+ 2^I. sgame_axiom(remove_if, X,_,_):- group(X,_,[]). sgame_axiom(add_if, X,_,_):- agents(N), group(X,_,N). sgame_axiom(add_if, X,W,_):- has_a_subgroup(X,_,W). sgame_axiom(remove_if, X,_,L):- has_a_supergroup(X,_,L). % axioms for strong simple game sgame_axiom(add_if, X,_,L):- complement_has_been_excluded(X,_,L). sgame_axiom(remove_if, X,W,_):- complement_has_been_included(X,_,W). /* ?- sgame(I,Y),writeln(I;Y),fail. 170;[7, 5, 3, 1] 204;[7, 6, 3, 2] 232;[7, 6, 5, 3] 240;[7, 6, 5, 4] false. 118 ?- sgame(I,Y),is_a_collection_of_groups(Y,O,Y),writeln(I;O),fail. 170;[[1, 2, 3], [1, 3], [2, 3], [3]] 204;[[1, 2, 3], [1, 2], [2, 3], [2]] 232;[[1, 2, 3], [1, 2], [1, 3], [2, 3]] 240;[[1, 2, 3], [1, 2], [1, 3], [1]] false. % a comparison (using sgnn06.pl) ?- gen_win(W,[proper:yes,strong:yes,monotonic:yes]),nl,write(W),inspectall_win(S),write(S),fail. [[1, 2, 3], [1, 2], [1, 3], [1]][yes, yes, yes, no([1]), no(1), yes] [[1, 2, 3], [1, 2], [1, 3], [2, 3]][yes, yes, yes, yes, yes, yes] [[1, 2, 3], [1, 2], [2, 3], [2]][yes, yes, yes, no([2]), no(2), yes] [[1, 2, 3], [1, 3], [2, 3], [3]][yes, yes, yes, no([3]), no(3), yes] false. */ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Matroid %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 19-20 Oct 2009 under construction matroid(Mid, T):- all_groups(L), reverse(L,R), matroid_id(Mid,R,_,T), Mid \= 0. matroid_id(0,[],[],[]). matroid_id(J,[X|Y],[0|B],C):- matroid_id(J,Y,B,C), \+ matroid_axiom(add_if, X,C). matroid_id(K,[X|Y],[1|B],[X|C]):- matroid_id(J,Y,B,C), \+ matroid_axiom(remove_if, X,C), length(Y,I), K is J+ 2^I. matroid_axiom(add_if, X,_):- group(X,_,[]). matroid_axiom(add_if, X,T):- has_hereditary_property_1(X,_,T). matroid_axiom(remove_if, X,T):- has_hereditary_property_2(X,_,T). matroid_axiom(remove_if, X,T):- has_augmentation_property(X,_,T). subgroup(X,Y,D):- group(X,_,A), group(Y,_,B), subset(A,B),subtract(B,A,D). has_hereditary_property_1(X,Y,T):- % This is a subgroup which should be selected (However, it does not occur in this construction of group list.) member(Y, T), subgroup(X,Y,_). has_hereditary_property_2(X,Y,T):- % There is no unselected foregone subgroup when this group selected. subgroup(Y,X,_), Y @< X, \+ member(Y, T). has_augmentation_property(X,(Y,Z),T):- subgroup(Y,X,D),member(Y,T),member(W,D),group(X,_,C), subgroup(Z,X,[W|C]), \+ member(Z,T). /* ?- matroid(I,Y),writeln(I;Y),fail. 1;[0] 3;[1, 0] 5;[2, 0] 7;[2, 1, 0] 15;[3, 2, 1, 0] 17;[4, 0] 19;[4, 1, 0] 21;[4, 2, 0] 23;[4, 2, 1, 0] 31;[4, 3, 2, 1, 0] 51;[5, 4, 1, 0] 55;[5, 4, 2, 1, 0] 63;[5, 4, 3, 2, 1, 0] 85;[6, 4, 2, 0] 87;[6, 4, 2, 1, 0] 95;[6, 4, 3, 2, 1, 0] 119;[6, 5, 4, 2, 1, 0] 127;[6, 5, 4, 3, 2, 1, 0] 255;[7, 6, 5, 4, 3, 2, 1, 0] false. ?- matroid(I,Y),is_a_collection_of_groups(Y,O,Y),writeln(I;O),fail. 1;[[]] 3;[[3], []] 5;[[2], []] 7;[[2], [3], []] 15;[[2, 3], [2], [3], []] 17;[[1], []] 19;[[1], [3], []] 21;[[1], [2], []] 23;[[1], [2], [3], []] 31;[[1], [2, 3], [2], [3], []] 51;[[1, 3], [1], [3], []] 55;[[1, 3], [1], [2], [3], []] 63;[[1, 3], [1], [2, 3], [2], [3], []] 85;[[1, 2], [1], [2], []] 87;[[1, 2], [1], [2], [3], []] 95;[[1, 2], [1], [2, 3], [2], [3], []] 119;[[1, 2], [1, 3], [1], [2], [3], []] 127;[[1, 2], [1, 3], [1], [2, 3], [2], [3], []] 255;[[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], []] false. */ % end