You selected vote0.pl

headline(A):-
A=[
'%------------------------------------------------------------',
'% Odd election ? : A recursive social choice rule.',
'%------------------------------------------------------------',
'% vote0.pl ( 23--25 Jan 2004)',
'% main:
'%  choice_rule/3, monotonocity/1,update/1',
'% Reference:',
'% [1] Y. Saeki (1980). Kimekata No Ronri. Tokyo Daigaku Shuppankai.',
'%   [Logic of How to Decide. Tokyo University Press. (Japanese)]',
'%-------'
].

:- headline(A), forall(member(X,A),(nl,write(X))).


%-------------------------------------------------
% the preference model of society 
%-------------------------------------------------

% members of society
agents([1,2,3,4,5,6,7,8]).
members_of_society(A):- agents(A).
agent(J):-agents(N),member(J,N).


% choice objects.
alternatives([x,a,b,c]).

alternative(x).
alternative(a).
alternative(b).
alternative(c).

%preference orders of members
preference(1,[a,x,c,b]).  % =>[*]
preference(J,[a,x,c,b]):-member(J,[2,3]).
preference(J,[b,c,a,x]):-member(J,[4,5,6]).
preference(J,[c,a,x,b]):-member(J,[7,8]).

% [*] a case of fraud by (or changing taste) of agent 1.
%preference(1,[x,a,c,b]).

% If the society use the Masuzawa rule, 
% the fraud of 1 who vote as if a>x ==> x>a (or any 
% engineering that win 1 over to x`s side) is not profitable.

/* ***********  a sample execution ********  */ 
/*

?- choice_rule(A,B,C).

A = simple
B = from:[x, a, b, c]
C = elected:[a, b] ;

A = majority
B = from:[x, a, b, c]
C = elected:[a] ;

A = borda
B = from:[x, a, b, c]
C = elected:[a] ;

A = masuzawa(rank:1)
B = from:[x, a, b, c]
C = elected:[a] ;

A = masuzawa
B = from:[x, a, b, c]
C = elected:[a, x, c, b] ;

% ==>

?- update_preference_model(s2).

Yes
?- choice_rule(A,B,C).

A = simple
B = from:[x, a, b, c]
C = elected:[b] ;

A = majority
B = from:[x, a, b, c]
C = elected:[a, c] ;

A = borda
B = from:[x, a, b, c]
C = elected:[a, c] ;

A = masuzawa(rank:1)
B = from:[x, a, b, c]
C = elected:[c] ;

A = masuzawa
B = from:[x, a, b, c]
C = elected:[c, a, x, b] ;

No
?- 

*/


prefer_to(J,A,B):-
   preference(J,R),
   nth1(K,R,A),
   nth1(K1,R,B),
   K < K1.

top_rank_in(J,A,S):-
   alternatives(M),
   preference(J,R),
   subset_of(S,_,M),
   member(A,R),
   \+ (member(B,S),prefer_to(J,B,A)).

prefer_to_in(J,A,B,S):-
   alternatives(M),
   preference(J,R),
   subset_of(S,_,M),
   member(A,R),
   member(B,R),
   prefer_to(J,A,B).


%-------------------------------------------------
% simple vote 
%-------------------------------------------------

choice_rule(simple,from:S,poll:P,elected:A):-
   alternatives(M),
   subset_of(S,_,M),
   max(P, 
     choice_rule(simple,from:S,poll:P,a_candidate:A)
   ).

choice_rule(simple,from:S,poll:P,a_candidate:A):-
   alternatives(M),
   subset_of(S,_,M),
   alternative(A),
   findall(J,
    top_rank_in(J,A,S),
   V),
   length(V,P).

/*

% For the original prference profile:

?- alternatives(S),
    choice_rule(simple,from:S,poll:P,elected:A).
    
S = [x, a, b, c]
P = 3
A = a ;

S = [x, a, b, c]
P = 3
A = b ;

No
?- 

% For the alternative prference profile:

?- alternatives(S),
    choice_rule(simple,from:S,poll:P,elected:A).

S = [x, a, b, c]
P = 3
A = b ;

No
?- 
*/

%-------------------------------------------------
% the `Masuzawa' rule of recursive choice (see Ref.1) 
%-------------------------------------------------

choice_rule(masuzawa(rank:1),from:S,poll:P,elected:A):-
   alternatives(M),
   subset_of(S,_,M),
   choice_rule(simple,from:S,poll:P,a_candidate:A),
   members_of_society(N),
   length(N,L),
   L < 2 * P,
   !.
   
choice_rule(masuzawa(rank:1),from:S,poll:P,elected:A):-
   alternatives(M),
   subset_of(S,_,M),
   findall((Q,Z),
     choice_rule(simple,from:S,poll:Q,a_candidate:Z),
   W),
   sort(W,W1),
   reverse(W1,[(_,X),(_,Y)|_]),
   choice_rule(masuzawa(rank:1),from:[X,Y],poll:P,elected:A).


choice_rule(masuzawa,from:S,remain:K,elected:[A|B]):-
   alternatives(M),
   subset_of(S,_,M),
   length(S,K),
   K> 1,
   choice_rule(masuzawa(rank:1),from:S,poll:_P,elected:A),
   subtract(S,[A],S0),
   K0 is K - 1,
   choice_rule(masuzawa,from:S0,remain:K0,elected:B).

choice_rule(masuzawa,from:[A],remain:1,elected:[A]).


/*

?- alternatives(S),
    choice_rule(masuzawa(rank:1),from:S,poll:P,elected:A).

S = [x, a, b, c]
P = 5
A = a ;

No
?- alternatives(S),
   choice_rule(masuzawa,from:S,P,elected:RANK).

S = [x, a, b, c]
P = remain:4
RANK = [c, a, x, b] ;

No
?- 

% ===>

?- alternatives(S),
    choice_rule(masuzawa(rank:1),from:S,poll:P,elected:A).

S = [x, a, b, c]
P = 5
A = c ;

No
?- alternatives(S),
   choice_rule(masuzawa,from:S,P,elected:RANK).

S = [x, a, b, c]
P = remain:4
RANK = [c, a, x, b] ;

No
?- 

*/

%-------------------------------------------------
% the majority rule :vote for all pairwise comparisons
%-------------------------------------------------

choice_rule(majority,from:S,poll:P,elected:A):-
   alternatives(M),
   subset_of(S,_,M),
   max(P, 
     choice_rule(majority,from:S,poll:P,a_candidate:A)
   ).

choice_rule(majority,from:S,poll:P,a_candidate:A):-
   alternatives(M),
   subset_of(S,_,M),
   alternative(A),
   findall((J,B),
    prefer_to_in(J,A,B,S),
   V),
   %(nl,write(A:V)),
   length(V,P).

/*

% For the original prference profile:

?- alternatives(S),
    choice_rule(majority,from:S,poll:P,elected:A).

x:[ (1, c), (1, b), (2, c), (2, b), (3, c), (3, b), (7, b), (8, b)]
a:[ (1, x), (1, c), (1, b), (2, x), (2, c), (2, b), (3, x), (3, c), (3, b), (4, x), (5, x), (6, x), (7, x), (7, b), (8, x), (8, b)]
b:[ (4, c), (4, a), (4, x), (5, c), (5, a), (5, x), (6, c), (6, a), (6, x)]
c:[ (1, b), (2, b), (3, b), (4, a), (4, x), (5, a), (5, x), (6, a), (6, x), (7, a), (7, x), (7, b), (8, a), (8, x), (8, b)]

S = [x, a, b, c]
P = 16
A = a ;

No
?- 

% For the alternative prference profile:

?- alternatives(S),
    choice_rule(majority,from:S,poll:P,elected:A).

S = [x, a, b, c]
P = 15
A = a ;

S = [x, a, b, c]
P = 15
A = c ;

No
?-
*/


%-------------------------------------------------
% Borda rule : ranking by weighted average point
%-------------------------------------------------

choice_rule(borda,from:S,gpa:P,elected:A):-
   alternatives(M),
   subset_of(S,_,M),
   max(P, 
     choice_rule(borda,from:S,gpa:P,a_candidate:A)
   ).

choice_rule(borda,from:S,gpa:P,a_candidate:A):-
   alternatives(M),
   subset_of(S,_,M),
   member(A,S),
   findall(X,
    (
     agent(J), 
     grade_point_average(J,A,X)
    ),
   Y),
   sum(Y,P).

grade_point_average(J,A,G):-
   preference(J,R),
   length(R,L),
   nth1(K,R,A),
   G is L - K. 

/*

?- alternatives(S),choice_rule(borda,from:S,gpa:P,elected:A).

S = [x, a, b, c]
P = 16
A = a ;

No
*/


%-------------------------------------------------
% More Social Choice Theory
%-------------------------------------------------

:- dynamic preference/2.

preference(J,s1,[a,x,c,b]):-member(J,[1,2,3]).
preference(J,S,[b,c,a,x]):-member(J,[4,5,6]),member(S,[s1,s2]).
preference(J,S,[c,a,x,b]):-member(J,[7,8]),member(S,[s1,s2]).

preference(1,s2,[x,a,c,b]).
preference(J,s2,[a,x,c,b]):-member(J,[2,3]).

state(s1).
state(s2).

update_preference_model(S):-
   state(S),
   abolish(preference/2),
   P=preference(J,S,R),
   forall(P,assert(preference(J,R))).


% scc: social choice rules (i.e., social choice correspondences)

scc(simple).
scc(majority).
scc(borda).
scc(masuzawa(rank:1)).
scc(masuzawa).

scc(F,S,C):-
   state(S),
   scc(F),
   update_preference_model(S),
   alternatives(W),
   choice_rule(F,from:W,elected:C).

choice_rule(F,from:W,elected:C):-
   scc(F),
   F \= masuzawa,
   alternatives(W),
   findall(A,
     choice_rule(F,from:W,_,elected:A),
   C).

choice_rule(masuzawa,from:W,elected:C):-
   alternatives(W),
   choice_rule(masuzawa,from:W,_,elected:C).


/*

?- scc(A),scc(A,B,C).

A = simple
B = s1
C = [a, b] ;

A = simple
B = s2
C = [b] ;

A = majority
B = s1
C = [a] ;

A = majority
B = s2
C = [a, c] ;

A = borda
B = s1
C = [a] ;

A = borda
B = s2
C = [a, c] ;

A = masuzawa(rank:1)
B = s1
C = [a] ;

A = masuzawa(rank:1)
B = s2
C = [c] ;

A = masuzawa
B = s1
C = [a, x, c, b] ;

A = masuzawa
B = s2
C = [c, a, x, b] ;

No
?- 
*/



%-------------------------------------------------
% Maskin Monotonicity
%-------------------------------------------------

% lower contour set : outcomes worse or equal than A.

lcc([I,S,R],A,L) :- 
   preference(I,S,R),
   member(A,R),
   append(_Upper, [A|Lower], R),
   sort([A|Lower],L).

monotone(F):-
  scc(F),
  forall(
     ( scc(F,S,C),
      member(A,C),
      scc(F,S1,C1),
      \+ member(A,C1),wrv1(A,F,C,S,C1,S1)
     ),
     ( lcc([I,S,_R],A,L1),
      lcc([I,S1,_R1],A,L2),
      \+ subtract(L1,L2,[]),wrv2(I,L1,L2)
     )
   ).

% to display the reversal outcome when an alternative dropped from scc.

wrv1(A,F,C,S,C1,S1):-
	write([A,is_in,F,[S,C],out,[S1,C1]]),nl.
wrv2(I,L1,L2):-tab(3),
	write([reversal(I),lccs(L1,'->',L2)]),nl.


/*

?- monotone(simple).
[a, is_in, simple, [s1, [a, b]], out, [s2, [b]]]
   [reversal(1), lccs([a, b, c, x], (->), [a, b, c])]

Yes
?- monotone(majority).
[c, is_in, majority, [s2, [a, c]], out, [s1, [a]]]

No
?- monotone(masuzawa(rank:1)).
[a, is_in, masuzawa(rank:1), [s1, [a]], out, [s2, [c]]]
   [reversal(1), lccs([a, b, c, x], (->), [a, b, c])]
[c, is_in, masuzawa(rank:1), [s2, [c]], out, [s1, [a]]]

No
?- monotone(masuzawa).

Yes
?- monotone(borda).
[c, is_in, borda, [s2, [a, c]], out, [s1, [a]]]

No
?-
*/


veto_outcome(A,J,S,F):-
	scc(F,S,C),
	alternatives(As),
	subtract(As,C,D),
	member(A,D),
	agents(Is),
	preference(J,S,_R),
	forall((member(K,Is),K\=J),
	  (lcc([K,S,_Rk],A,As)%,write([A,S,J,K]),nl
	  )
	).
no_veto_power(F):-
	agents(Is),
	scc(F,_,_)
	->
	forall(member(J,Is),\+veto_outcome(_A,J,_S,F)).
nvp(F):-no_veto_power(F).


%-------------------------------------------------
% Common programs
%-------------------------------------------------

% a sequence of binary choice for a list:
%--------------------------------------------------
list_projection([],[],[]).
list_projection([X|Y],[_A|B],C):-
   X = 0,
   list_projection(Y,B,C).
list_projection([X|Y],[A|B],[A|C]):-
   X = 1,
   list_projection(Y,B,C).
%
% subset_of/3 : subset-enumeration 
% -----------------------------------------------------------  %
subset_of(A,N,As):-
   var(A),
   length(As,L),
   length(D,L),
   list_projection(D,As,B),
   length(B,N),
   sort(B,A).

subset_of(A,N,As):-
   \+ var(A),
   length(A,N),
   subset(A,As).

% maximal solution for given goal clause : a naive solver 
%---------------------------------------------------------

max(X,Goal):-
  % X: the objective variable,
  % Goal: the objective function and constraints,
  setof((X,Goal),Goal,Z),
  member((X,Goal),Z),
  \+ (
    member((Y,_),Z),
    Y > X
  ).

%
% max,min
% -----------------------------------------------------------  %
max_of(X,[X]).
max_of(Z,[X|Y]):-
   max_of(Z1,Y),
   (X > Z1 -> Z=X; Z=Z1).
min_of(X,[X]).
min_of(Z,[X|Y]):-
   min_of(Z1,Y),
   (X < Z1 -> Z=X; Z=Z1).

% sum
% -----------------------------------------------------------  %
sum([],0).
sum([X|Members],Sum):-
   sum(Members,Sum1),
  %number(X),
   Sum is Sum1 + X.


return to front page.