You selected vote01.pl
:-J=['% strategic voting by prolog'
,'%------------------------------------------------------'
,'% vote01.pl (5-9 Jan 2006)'
], forall(member(X,J),(nl,write(X))).
%-------------------------------------------------
% a TOB example in Dixit and Nalebuff(1991)
%-------------------------------------------------
% Reference
% A. Dixit and B. Nalebuff (1991). Thinking Strategically.
% the voters(=agents)
% 1: owner proprietor,
% 2-5: other executives
% and the choice objects(=alternatives)
% a: "white knight",
% b: "MBO",
% c: "poison pill",
% d: "wait and see."
% Claim DN (Dixit and Nalebuff,1991)
% By means of precommit himself into the preference of voter 5,
% the owner of company can manipulate his preferable outcome c.
% choice objects.
%-------------------------------------------------
alternative(a).
alternative(b).
alternative(c).
alternative(d).
alternatives([a,b,c,d]).
% voters
%-------------------------------------------------
voter(1).
voter(2).
voter(3).
voter(4).
voter(5).
voters([1,2,3,4,5]).
% stages of vote
%-------------------------------------------------
stage_of_vote(3).
stage_of_vote(2).
stage_of_vote(1).
stages([3,2,1]).
last_stage_of_vote(3).
sequence_of_tournament( [d,c,b,a]).
possible_match(stage(1),[b,a]).
possible_match(stage(2),[c,W]):-member(W,[a,b]).
possible_match(stage(3),[d,W]):-member(W,[a,b,c]).
last_stage_winner(stage(K),W):-
possible_match(stage(K),[_,W]).
possible_winner(stage(K),W):-
possible_match(stage(K),[_,W]).
possible_winner(stage(K),W):-
possible_match(stage(K),[W,_]),
!.
% preference orderings of voters
%-------------------------------------------------
:- dynamic preference_of_voter/2.
preference_of_voter(1,[c,b,a,d]).
preference_of_voter(2,[a,c,d,b]).
preference_of_voter(3,[a,c,d,b]).
preference_of_voter(4,[b,c,d,a]).
preference_of_voter(5,[d,a,c,b]).
%preference_of_voter(1,[d,a,c,b]). % the case of precommitment.
voter_prefer_to(J,A,B):-
preference_of_voter(J,R),
append(_,[A|Y],R),
member(B, Y).
%-------------------------------------------------
% Modeling binary sequential vote
%-------------------------------------------------
% possible results of sequential vote
%-------------------------------------------------
possible_act( stage(K), voter(J, O), select_from([X,Y])):-
possible_match(stage(K),[X,Y]),
voter(J),
member(O,[X,Y]).
possible_stage_vote_1( _, [], [], _).
possible_stage_vote_1( K, [J|N], [(J,O)|H], (X,Y)):-
possible_stage_vote_1( K, N, H, (X,Y)),
possible_act( stage(K), voter(J, O), select_from([X,Y])).
possible_stage_vote( K, V, R, XY):-
voters(N),
possible_stage_vote_1( K, N, V, XY),
poll(V,R).
/*
?- possible_stage_vote(T, V, E, X).
T = 1
V = [ (1, b), (2, b), (3, b), (4, b), (5, b)]
E = [ (5, b), (0, d), (0, c), (0, a)]
X = b, a
Yes
?-
*/
poll_1([], [],[]).
poll_1([X|O],V,[(P,X)|R]):-
findall( (J,X), member((J,X),V), L),
length(L, P),
subtract(V,L,V1),
poll_1(O,V1,R).
poll(V,R):-
alternatives(O),
poll_1(O,V,R1),
sort(R1,R2),
reverse(R2,R).
possible_sequential_vote_1( 0, [], [_], []).
possible_sequential_vote_1( K, [H|V], [W,Y|E], [(X,Y)|M]):-
K1 is K - 1,
possible_sequential_vote_1(K1, V, [Y|E], M),
possible_stage_vote( K, H ,[(_,W)|_], (X,Y)).
possible_sequential_vote( V, E, M):-
last_stage_of_vote(T),
length(V,T),
possible_sequential_vote_1( T, V, E, M).
possible_sequential_vote( V, E):-
possible_sequential_vote( V, E, _).
possible_sequential_vote_at_stage(K,(X,Y)->W, V, E):-
possible_sequential_vote( V, E),
sequence_of_tournament(Q),
last_stage_of_vote(T),
stage_of_vote(K),
K1 is T - K + 1,
K2 is K1 + 1,
nth1(K1,Q,X),
nth1(K2,E,Y),
nth1(K1,E,W).
% alternative
possible_sequential_vote_at_stage_b(K,(X,Y)->W, V, E):-
last_stage_of_vote(T),
length(V,T),
possible_sequential_vote_1( T, V, E, M),
stage_of_vote(K),
K1 is T - K + 1,
nth1(K1,M,(X,Y)),
nth1(K1,E,W).
/*
?- possible_sequential_vote([A,B,C],[a|E]).
A = [ (1, a), (2, a), (3, a), (4, d), (5, d)]
B = [ (1, a), (2, a), (3, a), (4, c), (5, c)]
C = [ (1, a), (2, a), (3, a), (4, b), (5, b)]
E = [a, a, a] ;
A = [ (1, a), (2, a), (3, d), (4, a), (5, d)]
B = [ (1, a), (2, a), (3, a), (4, c), (5, c)]
C = [ (1, a), (2, a), (3, a), (4, b), (5, b)]
E = [a, a, a] ;
A = [ (1, a), (2, d), (3, a), (4, a), (5, d)]
B = [ (1, a), (2, a), (3, a), (4, c), (5, c)]
C = [ (1, a), (2, a), (3, a), (4, b), (5, b)]
E = [a, a, a] ;
A = [ (1, d), (2, a), (3, a), (4, a), (5, d)]
B = [ (1, a), (2, a), (3, a), (4, c), (5, c)]
C = [ (1, a), (2, a), (3, a), (4, b), (5, b)]
E = [a, a, a]
Yes
?- possible_sequential_vote_at_stage(K,VSW, V, E).
K = 3
VSW = d, c->d
V = [[ (1, d), (2, d), (3, d), (4, d), (5, d)], [ (1, c), (2, c), (3, c), (4, c), (5, c)], [ (1, b), (2, b), (3, b), (4, b), (5, b)]]
E = [d, c, b, a]
Yes
*/
%-------------------------------------------------
% Modeling rational voters
%-------------------------------------------------
% edited: 5-8 Jan 2006 (abolish.)
% modified: 9 Jan 2006 (totally modified.)
% different patterns of stage vote with a single deviator
%-------------------------------------------------
unilateral_deviation_by_voter(J,O->O1,Vf->Vg,W->W1,(R,S)):-
member((O1,O),[(R,S),(S,R)]),
append( H, [(J,O)| B], Vf),
append( H, [(J,O1)| B], Vg),
(var(W)->poll(Vf,[(_,W)|_]);true),
poll(Vg,[(_,W1)|_]).
% judging truthfulness w.r.t. true preference
%-------------------------------------------------
is_truthful_or_not( yes, J,[R,S]->O):-
\+ is_truthful_or_not( no, J,[R,S]->O).
is_truthful_or_not( no, J,[R,S]->R):-
voter_prefer_to(J, S, R).
is_truthful_or_not( no, J,[R,S]->S):-
voter_prefer_to(J, R, S).
% Truthfulness is best at any terminal decision node
%-------------------------------------------------
% At the last stage voters has no incentive to manipulate his own true preference.
% Voting for the top ranked in truthful preference is weakly dominant strategy.
rational_voter( J, stage(K), select([X:X,Y:Y]->O),truthful(yes)):-
last_stage_of_vote(K),
possible_act( stage(K), voter(J, O), select_from([X,Y])),
(voter_prefer_to(J, X,Y)->O=X;O=Y).
% The backward reasoning of inductively rational voting.
%-------------------------------------------------
% Assuming rational voters, the last statement is also true for each intermidiate
% stage if the consequent stages of each of candidates matched at that stage
% can be resolved itself into a unique terminal outcome respectively.
% Otherwise indifferent.
rational_voter( J, stage(K),select([X:G,Y:G1]->O),truthful(T)):-
stage_of_vote(K),
\+ last_stage_of_vote(K),
possible_act( stage(K), voter(J, O), select_from([X,Y])),
K1 is K + 1,
rational_voter( all, stage(K1), select([_,X:_]->_:G), _),
rational_voter( all, stage(K1), select([_,Y:_]->_:G1), _),
(G = G1 -> true; (voter_prefer_to(J,G,G1)->O=X; O=Y)),
is_truthful_or_not( T, J,[X,Y]->O).
% equilibrium act profile and the winner at each stage
%-------------------------------------------------
% choice objects = proxy:final
rational_voter( all, stage(K),select([X:O,Y:O1]->W:G),(V,D)):-
stage_of_vote(K),
voters(N),
rational_voter_1( K, [X:O,Y:O1], N, V, D),
poll(V,[(_,W)|_]),
is_proxy_of( (W,X,Y):(G,O,O1)).
is_proxy_of( (W,X,Y):(G,O,O1)):-
member(W:G,[X:O,Y:O1]).
rational_voter_1(_,_,[],[],[]).
rational_voter_1(K,[X:G,Y:G1],[J|N],[(J,O)|V],[(J,T)|D]):-
rational_voter_1(K,[X:G,Y:G1],N,V,D),
rational_voter( J,
stage(K),
select([X:G,Y:G1]->O),
truthful(T)
).
/*
?- rational_voter(all, stage(3),select(O),(V,T)).
O = [d:d, a:a]->a:a
V = [ (1, a), (2, a), (3, a), (4, d), (5, d)]
T = [ (1, yes), (2, yes), (3, yes), (4, yes), (5, yes)] ;
O = [d:d, b:b]->d:d
V = [ (1, b), (2, d), (3, d), (4, b), (5, d)]
T = [ (1, yes), (2, yes), (3, yes), (4, yes), (5, yes)] ;
O = [d:d, c:c]->c:c
V = [ (1, c), (2, c), (3, c), (4, c), (5, d)]
T = [ (1, yes), (2, yes), (3, yes), (4, yes), (5, yes)] ;
No
?-
?- rational_voter(all, stage(2),select(O),(V,T)).
O = [c:c, a:a]->a:a
V = [ (1, c), (2, a), (3, a), (4, c), (5, a)]
T = [ (1, yes), (2, yes), (3, yes), (4, yes), (5, yes)] ;
O = [c:c, b:d]->c:c
V = [ (1, c), (2, c), (3, c), (4, c), (5, b)]
T = [ (1, yes), (2, yes), (3, yes), (4, no), (5, no)] ;
No
?-
?- rational_voter(all, stage(1),select(O),(V,T)).
O = [b:c, a:a]->a:a
V = [ (1, b), (2, a), (3, a), (4, b), (5, a)]
T = [ (1, yes), (2, yes), (3, yes), (4, yes), (5, yes)] ;
No
?-
*/
%-------------------------------------------------
% Modeling precommitment of voter 1 :
% Verifying the Claim DN
%-------------------------------------------------
precommit_preference( of(J,R), as(J1,R1), [select:O, vote:V, truthfulness:T]):-
retract( preference_of_voter( J, R)),
preference_of_voter( J1, R1),
assert( preference_of_voter( J, R1)),
nl,
write(' query the result of vote:'),
nl, tab(1),
Q= rational_voter(all, stage(1), select(O), (V,T)),
write( 'rational_voter(all, stage(1), select(O), (V,T))'),
nl,
write('go ahead ? (y)|'),
read(y),
call(Q).
/*
?- precommit_preference(of(1,R1),as(5,R5),[A,B,C]).
query the result of vote:
rational_voter(all, stage(1), select(O), (V,T))
go ahead ? (y)|y.
R1 = [c, b, a, d]
R5 = [d, a, c, b]
A = select: ([b:c, a:c]->b:c)
B = vote:[ (1, b), (2, b), (3, b), (4, b), (5, b)]
C = truthfulness:[ (1, no), (2, no), (3, no), (4, yes), (5, no)]
Yes
?- rational_voter(all, stage(2),select(O),(V,T)).
O = [c:c, a:d]->c:c
V = [ (1, a), (2, c), (3, c), (4, c), (5, a)]
T = [ (1, yes), (2, no), (3, no), (4, yes), (5, yes)] ;
O = [c:c, b:d]->c:c
V = [ (1, b), (2, c), (3, c), (4, c), (5, b)]
T = [ (1, no), (2, yes), (3, yes), (4, no), (5, no)] ;
No
?- rational_voter(all, stage(3),select(O),(V,T)).
O = [d:d, a:a]->d:d
V = [ (1, d), (2, a), (3, a), (4, d), (5, d)]
T = [ (1, yes), (2, yes), (3, yes), (4, yes), (5, yes)] ;
O = [d:d, b:b]->d:d
V = [ (1, d), (2, d), (3, d), (4, b), (5, d)]
T = [ (1, yes), (2, yes), (3, yes), (4, yes), (5, yes)] ;
O = [d:d, c:c]->c:c
V = [ (1, d), (2, c), (3, c), (4, c), (5, d)]
T = [ (1, yes), (2, yes), (3, yes), (4, yes), (5, yes)] ;
No
?-
*/
% end of program
%-------------------------------------------------
% p.s. Former program I had been trying to extend vote0.pl
% during two weeks before 5 Jan 2005 resulted in pretty codes for
% inductive (non)manipulablity, but I decided to suspend it.
return to front page.