You selected sproof.pl
:-J=['% strategic manipulation by prolog'
,'%------------------------------------------------------'
,'% sproof.pl (12-3 Jan 2006 23:09)'
], forall(member(X,J),(nl,write(X))).
% SP (strategy-proofness)
% MM (Maskin monotonicity)
% PE (Parato efficiency)
% urd (unrestricted domain)
% cs (citizen's sovereginty)
% i=1, ..., n (agents) N=[1,..,n].
% X=[a, b, ... ] (alternatives) #X=m.
% Dict(i): the fact that agent i is a dictator.
% GS Theorem. Assume n>=2, m>=3, urd, cs. Then SP->Dict(i).
% Lemma. SP --> MM (-->SP ).
% Lemma. SP -->PE.
% 2 person 3 alternatives
% example for Gibbard-Satterthwaite theorem
%-------------------------------------------------
% reference
% Ishii, Saijo, Shiozawa (1995). Introduction to Microeconomics.
% Yuhikaku. (Japanese)
alternative(a).
alternative(b).
alternative(c).
agent(1).
agent(2).
set_of_alternatives([a,b,c]).
set_of_agents([1,2]).
possible_preference_ordering( r(1), [a,b,c]).
possible_preference_ordering( r(2), [a,c,b]).
possible_preference_ordering( r(3), [b,a,c]).
possible_preference_ordering( r(4), [b,c,a]).
possible_preference_ordering( r(5), [c,a,b]).
possible_preference_ordering( r(6), [c,b,a]).
strictly_prefer_to(A,B, R):-
possible_preference_ordering( R, O),
append( _,[A|C],O),
member(B,C).
prefer_to(A,B, R):-
alternative(A),
alternative(B),
\+ strictly_prefer_to(A,B, R).
indifferent_to(A,B, R):-
prefer_to(B,A, R),
prefer_to(A,B, R).
possible_preference_of_agent( J, R, O):-
agent(J),
possible_preference_ordering(R, O).
% 2 person 3 alternatives unrestricted domain
%-------------------------------------------------
preference_pair( urd(2,3), (1, R1,O1), (2, R2, O2)):-
possible_preference_of_agent( 1, R1, O1),
possible_preference_of_agent( 2, R2, O2).
% sample SCFs of unrestricted domain
%-------------------------------------------------
social_choice_function( urd(2,3), scf(1)).
social_choice_function( urd(2,3), auto(sp)).
social_choice_function( Domain, scf(1), (R1,R2)-> Win):-
preference_pair( Domain, (1, R1,_), (2, R2,_)),
majority_rule( (R1,R2), (X,Y), Tie, Win),
tie_breaking(Tie, Win, [X,Y]).
social_choice_function( Domain, auto(sp), (R1,R2)-> Win):-
clause(auto_scf_0( Domain, (R1,R2)-> Win,_,_),true).
majority_rule( (R1,R2), (X,X), decided, X):-
possible_preference_ordering( R1, [X|_]),
possible_preference_ordering( R2, [X|_]).
majority_rule( (R1,R2), (X,Y), tie, Z):-
possible_preference_ordering( R1, [X|_]),
possible_preference_ordering( R2, [Y|_]),
X \= Y,
member( Z, [X,Y]).
tie_breaking(decided, _, _).
tie_breaking(tie, Z, [X,Y]):-
member( (Z,W),[(X,Y),(Y,X)]),
strictly_prefer_to( Z, W, r(1)).
% citizen's sovereignty.
taboo_alternative(Domain,SCR,A):-
social_choice_function( Domain, SCR),
alternative(A),
\+ social_choice_function( Domain, SCR, _R-> A).
no_taboo_alternatives(Domain, SCR):-
social_choice_function( Domain, SCR),
\+ taboo_alternative(Domain, SCR,_).
% displaying scf
%-------------------------------------------------
display_scf(Domain, Scf):-
Warn=(nl,write('no such domain or scf. go ahead? ')),
(
social_choice_function( Domain, Scf)->true;
(Warn,!,read(y))
),
nl,
write(domain:Domain),
tab(1),
write(scf:Scf),
forall(
bagof(C,
B^social_choice_function( Domain, Scf, (A,B)->C),
L),
(
nl,
write(row=A),
tab(1),
write(L)
)
).
/*
?- display_scf(A,B).
domain:urd(2, 3) scf:scf(1)
row=r(1) [a, a, a, a, a, a]
row=r(2) [a, a, a, a, a, a]
row=r(3) [a, a, b, b, b, b]
row=r(4) [a, a, b, b, b, b]
row=r(5) [a, a, b, b, c, c]
row=r(6) [a, a, b, b, c, c]
A = urd(2, 3)
B = scf(1)
Yes
?-
*/
% Maskin monotonicity
%-------------------------------------------------
monotonic_scf( Domain, Scf):-
social_choice_function( Domain, Scf),
forall(
social_choice_function( Domain, Scf, (R1,R2)-> X),
\+ monotonicity( Domain, Scf, (R1,R2), _, X, no)
).
monotonicity( Domain, Scf, (R1,R2), (S1,S2), X, Chk):-
social_choice_function( Domain, Scf, (R1,R2)-> X),
monotonic_change( Domain, (R1,R2)-> (S1,S2), X),
chk_monotonicity( Domain, Scf,(S1,S2), X, Chk).
monotonic_change( Domain, (R1,R2)-> (S1,S2), X):-
preference_pair( Domain, (1, R1,_), (2, R2, _)),
preference_pair( Domain, (1, S1,_), (2, S2, _)),
(R1,R2)\=(S1,S2),
is_not_depreciated( X, R1->S1),
is_not_depreciated( X, R2->S2).
is_not_depreciated( X, R1->S1):-
lower_contour_set(X, (R1,_), LccR1),
lower_contour_set(X, (S1,_), LccS1),
subset( LccR1,LccS1).
chk_monotonicity( Domain, Scf,(S1,S2), X, Chk):-
social_choice_function( Domain,Scf, (S1,S2)-> X)
-> Chk = yes
; Chk = no.
lower_contour_set(X, (R,O), [X|Lcc]):-
possible_preference_ordering( R, O),
append( _,[X|Lcc],O).
% demo
%-------------------------------------------------
/*
?- monotonicity( Domain, Scf, (R1,R2), (L1,L2), X,no).
No
?- monotonicity( Domain, Scf, (R1,R2), (L1,L2), X,yes).
Domain = urd(2,3)
Scf = scf(1)
R1 = r(1)
R2 = r(1)
L1 = r(1)
L2 = r(2)
X = a
Yes
?- monotonic_scf( Domain ,Scf).
Domain = urd(2, 3)
Scf = auto(sp) ;
No
?-
*/
% strategic-proofness and manipulability
%-------------------------------------------------
is_manipulable( Domain ,Scf, agent(1), (R1->S1, R2),(X->Y)):-
social_choice_function( Domain, Scf, (R1,R2)-> X),
social_choice_function( Domain, Scf, (S1,R2)-> Y),
strictly_prefer_to( Y, X, R1).
is_manipulable( Domain ,Scf, agent(2), (R1, R2->S2),(X->Y)):-
social_choice_function( Domain, Scf, (R1,R2)-> X),
social_choice_function( Domain, Scf, (R1,S2)-> Y),
strictly_prefer_to( Y, X, R2).
strategy_proof( Domain ,Scf, (R1, R2)-> X):-
social_choice_function( Domain, Scf, (R1,R2)-> X),
\+ is_manipulable( Domain ,Scf, agent(1), (R1->_, R2),(X->_)),
\+ is_manipulable( Domain ,Scf, agent(2), (R1, R2->_),(X->_)).
strategy_proof( Domain ,Scf):-
social_choice_function( Domain, Scf),
\+ is_manipulable( Domain ,Scf, agent(_), _,_).
/*
?- is_manipulable( urd(2,3) ,scf(1), A,R,Y),
nl,write(A;R;Y),fail.
agent(1);r(5)->r(1), r(3);b->a
agent(1);r(5)->r(2), r(3);b->a
agent(1);r(5)->r(1), r(4);b->a
agent(1);r(5)->r(2), r(4);b->a
agent(2);r(3), r(5)->r(1);b->a
agent(2);r(3), r(5)->r(2);b->a
agent(2);r(4), r(5)->r(1);b->a
agent(2);r(4), r(5)->r(2);b->a
No
?- strategy_proof( Domain ,Scf).
Domain = urd(2, 3)
Scf = auto(sp) ;
No
?-
*/
% Pareto efficiency
%-------------------------------------------------
is_not_pareto_efficient( (R1, R2),X):-
strictly_prefer_to( Y, X, R1),
strictly_prefer_to( Y, X, R2).
is_pareto_efficient( Domain, (R1, R2),X):-
alternative(X),
preference_pair( Domain, (1, R1,_), (2, R2,_)),
\+ is_not_pareto_efficient( (R1, R2),X).
is_not_pareto_efficient_scf( Domain, Scf, (R1,R2)-> X):-
social_choice_function( Domain, Scf, (R1,R2)-> X),
is_not_pareto_efficient( (R1, R2),X).
is_pareto_efficient_scf( Domain, Scf, (R1,R2)-> X):-
social_choice_function( Domain, Scf, (R1,R2)-> X),
is_pareto_efficient( Domain, (R1, R2),X).
is_pareto_efficient_scf( Domain, Scf):-
social_choice_function( Domain, Scf),
\+ \+ is_pareto_efficient( Domain, _,_).
/*
?- is_pareto_efficient_scf( urd(2,3), Scf, (R1,R2)-> X).
Scf = scf(1)
R1 = r(1)
R2 = r(1)
X = a
Yes
?- is_not_pareto_efficient_scf( Domain, Scf, (R1,R2)-> X).
No
?- is_pareto_efficient_scf( Domain, Scf).
Domain = urd(2, 3)
Scf = scf(1) ;
Domain = urd(2, 3)
Scf = auto(sp) ;
No
?-
*/
% dictatorship
%-------------------------------------------------
dictator_for_scf(Domain, Scf,J):-
social_choice_function( Domain, Scf),
agent(J),
forall(
preference_pair( Domain, (1, R1,_), (2, R2, _)),
dictator_for_scf(Domain, Scf, (R1,R2),J)
).
dictator_for_scf(Domain, Scf, (R1,R2),J):-
social_choice_function( Domain, Scf, (R1,R2)-> X),
dictatorship(Domain, (R1,R2)->X, J).
dictatorship(Domain, (R1,R2)->X, 1):-
preference_pair( Domain, (1, R1,[X|_]), (2, R2, _)).
dictatorship(Domain, (R1,R2)->X, 2):-
preference_pair( Domain, (1, R1,_), (2, R2, [X|_])).
/*
?- dictator_for_scf(Domain, Scf,J).
Domain = urd(2, 3)
Scf = scf(1)
J = 1 ;
Domain = urd(2, 3)
Scf = scf(1)
J = 2 ;
No
?-
*/
% automated construction of strategy-proof scf
% by recursively propagating MM as the constraint
%-------------------------------------------------
all_possible_preference_pair_n_domain( Domain, Poss):-
setof((R1,R2),
O1^O2^
preference_pair( Domain, (1,R1,O1), (2,R2,O2)),
Poss).
auto_scf( Domain, FL,Property):-
all_possible_preference_pair_n_domain( Domain, L),
auto_scf( Domain, FL, L, Property).
auto_scf( _, [],[], _).
auto_scf( Domain, [R-> X | H], [R|Q], pareto):-
auto_scf( Domain, H,Q,pareto),
is_pareto_efficient( Domain, R,X).
auto_scf( Domain, [R-> X | H], [R|Q], monotone):-
auto_scf( Domain, H,Q,monotone),
alternative(X),
\+ (
member( (S->Y), H),
monotonic_change( Domain, S->R, Y),
X \= Y
),
\+ (
monotonic_change( Domain, R->S, X),
member( (S->Y), H),
X \= Y
).
display_auto_scf(F):-
forall(
setof((K,C),member((r(J),r(K))->C,F),L),
(nl,write(row=J;L))
).
display_auto_scf_nn(F):-
\+ var(F),
length(F,_),
forall(
bagof(C,K^member((r(J),r(K))->C,F),L),
(nl,write(row=J;L))
).
/*
?- auto_scf( Domain,F, Property), display_auto_scf(F).
row=1;[ (1, a), (2, a), (3, a), (4, a), (5, a), (6, a)]
row=2;[ (1, a), (2, a), (3, a), (4, a), (5, a), (6, a)]
row=3;[ (1, a), (2, a), (3, b), (4, b), (5, a), (6, b)]
row=4;[ (1, a), (2, a), (3, b), (4, b), (5, b), (6, b)]
row=5;[ (1, a), (2, a), (3, a), (4, b), (5, c), (6, c)]
row=6;[ (1, a), (2, a), (3, b), (4, b), (5, c), (6, c)]
Domain = urd(2, 3)
F = [ (r(1), r(1)->a), (r(1), r(2)->a), (r(1), r(3)->a), (r(1), r(4)->a), (r(1), r(5)->a), (r(1), r(6)->a), (r(...), r(...)->a), (..., ... ->a), (... ->...)|...]
Property = pareto
Yes
?- auto_scf( Domain,F, Property),
display_auto_scf_nn(F).
row=1;[a, a, a, a, a, a]
row=2;[a, a, a, a, a, a]
row=3;[a, a, b, b, a, b]
row=4;[a, a, b, b, b, b]
row=5;[a, a, a, b, c, c]
row=6;[a, a, b, b, c, c]
Domain = urd(2, 3)
F = [ (r(1), r(1)->a), (r(1), r(2)->a), (r(1), r(3)->a), (r(1), r(4)->a), (r(1), r(5)->a), (r(1), r(6)->a), (r(...), r(...)->a), (..., ... ->a), (... ->...)|...]
Property = pareto
Yes
?-
*/
% generating script for strategic-proof scf.
%-------------------------------------------------
:- dynamic auto_scf_0/4.
% for iteration by fail operator.
generate_cs_scf( Domain, Property, Name):-
generate_scf( Domain, Property, Name),
no_taboo_alternatives( Domain, Name).
generate_scf( Domain, Property, Name):-
generate_scf_init( Domain, Property,Name),
generate_scf_gen( Domain, Property, Name,_FL),
generate_scf_count( Domain, Property, Name,_Q),
generate_scf_fin( Domain, Property, Name,_L,_M).
generate_scf_init( Domain, _Property,Name):-
abolish(auto_scf_0/4),
(var(Domain)->Domain = urd(2,3);true),
(var(Name)->Name=auto(sp);assert(scf(Domain,Name))).
generate_scf_gen( Domain, Property, Name,FL):-
auto_scf(Domain, FL, Property),
update_auto_scf(Domain, FL, Property, Name).
update_auto_scf(Domain, FL, Property, Name):-
Body = auto_scf_0(Domain,F,Property,Name),
forall( clause( Body,true),retract( Body)),
forall(member(F,FL),assert(Body)).
generate_scf_count( Domain, Property, Name,Q):-
findall( 1,
(
auto_scf_0(Domain,_->_,Property,Name)
),
P),
length(P, Q),
nl,
write(Q/36),
write( ' patterns have been generated.').
generate_scf_fin( Domain, Property, Name,L,M):-
findall( (R1,R2),
(
preference_pair( Domain, (1,R1,_), (2,R2,_)),
\+ auto_scf_0(Domain,(R1,R2)->_,Property,Name)
),
L),
length( L, M),
nl,
write( M),
write( ' patterns are missing.'),
nl,
write( L).
:- abolish( auto_scf_0/3).
/*
?- generate_scf(A,monotone,C),
display_scf(A,C).
36/36 patterns have been generated.
0 patterns are missing.
[]
domain:urd(2, 3) scf:auto(sp)
row=r(1) [a, a, a, a, a, a]
row=r(2) [a, a, a, a, a, a]
row=r(3) [a, a, a, a, a, a]
row=r(4) [a, a, a, a, a, a]
row=r(5) [a, a, a, a, a, a]
row=r(6) [a, a, a, a, a, a]
A = urd(2, 3)
C = auto(sp) ;
36/36 patterns have been generated.
0 patterns are missing.
[]
domain:urd(2, 3) scf:auto(sp)
row=r(1) [a, a, a, a, a, a]
row=r(2) [a, a, a, a, a, a]
row=r(3) [a, a, b, b, a, b]
row=r(4) [a, a, b, b, a, b]
row=r(5) [a, a, a, a, a, a]
row=r(6) [a, a, b, b, a, b]
A = urd(2, 3)
C = auto(sp)
Yes
?- generate_cs_scf(A,monotone,C),
display_scf(A,C),
dictator_for_scf(A, C,J).
(...)
36/36 patterns have been generated.
0 patterns are missing.
[]
domain:urd(2, 3) scf:auto(sp)
row=r(1) [a, a, b, b, c, c]
row=r(2) [a, a, b, b, c, c]
row=r(3) [a, a, b, b, c, c]
row=r(4) [a, a, b, b, c, c]
row=r(5) [a, a, b, b, c, c]
row=r(6) [a, a, b, b, c, c]
A = urd(2, 3)
C = auto(sp)
J = 2 ;
(...)
36/36 patterns have been generated.
0 patterns are missing.
[]
domain:urd(2, 3) scf:auto(sp)
row=r(1) [a, a, a, a, a, a]
row=r(2) [a, a, a, a, a, a]
row=r(3) [b, b, b, b, b, b]
row=r(4) [b, b, b, b, b, b]
row=r(5) [c, c, c, c, c, c]
row=r(6) [c, c, c, c, c, c]
A = urd(2, 3)
C = auto(sp)
J = 1 ;
(...)
No
?-
*/
return to front page.