You selected swf.pl

:-T='Arrovian possibility theorem by prolog '
,N='(swf.pl, 5-7 Feb 2006)'
,H='----------------------------------------'
,forall(member(X,[H,T,N,H]),(nl,write(X))),nl.

% References:
% [1] Arrow, K. (1951/1963). 
%  Social Choice and Individual Values.
%  Cowles Foundation Monograph 12.
% [2] Sen, A. (1995). 
%  Rationality and social choice.
%  American Economic Review 85(1):1-24. 

% Definitions
%-------------------------------------------------
% A: a set of social states(alternatives of social choice), 
% N=[1,2,,...,n] : a set of agents(the members of the society). 
% R=[r(1),r(2),...,r(n)]: a profile of weak orderings of individual agents. 

% Def. (unristricted domain; UD)
%   None of the logically possible orderings may be excluded. 
% Def. (social welfare function; SWF) 
%   f: profiles of weak orderings R^n over A -> weak orderings R over A.
% Def. (decisiveness of a group G over (x,y)
%   A subset G of N is decisive if for a pair (x,y) in A^2,
%   the swf r=f(R)is such that r(X,Y)<->r(G,X,Y) for (X,Y) is (x,y) or (y,x).  
% Def. (decisiveness of G)
%   A subset G of N is decisive if for any pair (x,y) in A^2,
%   decisive(G,x,y). 
% Def. (Pareto principle)  N is decisive.
% Def. (dictatorship)  For a member J in N, [J] is decisive.
% Def. (independence of irrelevant alternatives;IIA)
%   If r(x,y) is not depend on any r(j,A,B)
%   such that (A,B) is neither (x,y) or (y,x).

% Theorem(Arrow). Suppose UD and IIA. Then decisive(N)->decisive([J]).
% Lemma. subset(G,N),decisive(G,X,Y)-> decisive(G).
% Lemma. decisive(G)->(partition(G1,G2,G),member(A,[G1,G2]),decisive(A)). 


% 2 person 3 alternatives example
%-------------------------------------------------

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

agent(1).
agent(2).

set_of_alternatives([a,b,c]).
set_of_agents([1,2]).

group([1]).
group([2]).
group([1,2]).

counter_group(G,H):-
   set_of_agents(N),
   group(G),
   subtract(N,G,H).


% modeling the weak orderings
% of the 2x3 unrestricted domain
%-------------------------------------------------
% In favor of brevity,
% we will concentrate on the strict part of it. 

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]).


possible_preference_of_agent( J, R, O):-
   agent(J),
   possible_preference_ordering(R, O).

strictly_prefer_to(A,B, R):-
   possible_preference_ordering( R, O),
   append( _,[A|C],O),
   member(B,C).

maximal_element( X, R):-
   possible_preference_ordering( R,[X|_O]).


% 2 person 3 alternatives unrestricted domain
%-------------------------------------------------

possible_preference_of_group( G, R, O):-
   group(G),
   possible_preference_of_group_1( G, R, O).

possible_preference_of_group_1( [], [], []).
possible_preference_of_group_1( [J|G], [R1|R], [(J,R1)|P]):-
   possible_preference_of_group_1( G, R, P),
   possible_preference_of_agent( J, R1, _).


possible_preference_pair( urd(2,3), (R1, R2),(O1,O2)):-
   possible_preference_of_group( [1,2], [R1,R2], [O1,O2]).



/*

?- setof(J,A^B^C^D^possible_preference_pair( H, (r(J),r(K)),_),
L),nl,write(H;K;L),fail.

urd(2, 3);1;[1, 2, 3, 4, 5, 6]
urd(2, 3);2;[1, 2, 3, 4, 5, 6]
urd(2, 3);3;[1, 2, 3, 4, 5, 6]
urd(2, 3);4;[1, 2, 3, 4, 5, 6]
urd(2, 3);5;[1, 2, 3, 4, 5, 6]
urd(2, 3);6;[1, 2, 3, 4, 5, 6]

No
?- 

*/


% pattern of preferences on binary comparisons
%-------------------------------------------------

bit_profile_of_preference_on_pair(_, [],[]).
bit_profile_of_preference_on_pair((X,Y), [Rj|R],[Bj|B]):-
   bit_profile_of_preference_on_pair((X,Y),R,B),
   (strictly_prefer_to(X,Y,Rj)->Bj=1;Bj=0).



% group/social choice set
%-------------------------------------------------
% It would be used for satisfies_Pareto_principle_2/2 below.

social_preference_profile(N, Rn, On):-
   set_of_agents(N), 
   possible_preference_of_group( N, Rn, On).

socially_choosing_maximals(R,Rn,C,Cn):-
   social_preference_profile(N, Rn,_),
   group_choice_set(N, Rn,Cn),
   possible_preference_ordering(R,_),
   group_choice_set(_,[R],C),
   subset(C,Cn).

group_choice_set(G,Rn,Cn):-
   % group(G) both in full or not.
   (\+ var(Rn) ->true
     ;possible_preference_of_group( G, Rn, _)
   ),
   findall( X,
    (
     member( Ra, Rn),
     maximal_element( X, Ra)
    ),
   Cn0),
   sort(Cn0,Cn).

/*

?- is_socially_choosing_maximals(R,Rn,C,Cn),Cn=[a],
nl,write(R;Rn;C;Cn),fail.

r(1);[r(1), r(1)];[a];[a]
r(2);[r(1), r(1)];[a];[a]
r(1);[r(2), r(1)];[a];[a]
r(2);[r(2), r(1)];[a];[a]
r(1);[r(1), r(2)];[a];[a]
r(2);[r(1), r(2)];[a];[a]
r(1);[r(2), r(2)];[a];[a]
r(2);[r(2), r(2)];[a];[a]

No
?- 

*/



% sample SWF for the unrestricted domain
%-------------------------------------------------

%social_welfare_function( urd(2,3), swf(auto)).
social_welfare_function( urd(2,3), swf(1)).
social_welfare_function( urd(2,3), swf(2)).
social_welfare_function( urd(2,3), swf(3)).

social_welfare_function( urd(2,3), swf(1),[r(J),R2]->r(J)):-
   possible_preference_of_group( [1,2], [r(J),R2], _).
social_welfare_function( urd(2,3), swf(2),[R1,r(K)]->r(K)):-
   possible_preference_of_group( [1,2], [R1,r(K)], _).
social_welfare_function( urd(2,3), swf(3),[r(J),r(K)]->r(L)):-
   possible_preference_of_group( [1,2], [r(J),r(K)], _),
   L is (K+J) mod 5 + 1.



% unanimity within a group
%-------------------------------------------------

solid_support_by_group( G, (X > Y), Rz):-
   support_members_in_group( G, G, (X > Y), Rz).

support_members_in_group( G, S, (X > Y), Rz):-
   group(G),
   alternative(X),
   alternative(Y),
   findall( J,
    (
     member(J,G),
     member((J,R),Rz),
     strictly_prefer_to(X,Y, R)
    ),
   S).

distinct_pair_of_alternatives(X,Y):-
   alternative(X),
   alternative(Y),
   X \= Y.


%  decisiveness for pair of alternatives
%-------------------------------------------------

is_decisive( urd(2,3), G, (X > Y), swf(K)):-
   social_welfare_function( urd(2,3), swf(K)),
   group(G),
   distinct_pair_of_alternatives(X,Y),
   forall(
    ( 
     social_welfare_function( urd(2,3), swf(K), [R1,R2]->R),
     solid_support_by_group( G, (X > Y), [(1,R1),(2,R2)])
    ),
    (
     strictly_prefer_to(X,Y, R)
    )
   ).

is_decisive( urd(2,3), G, (X, Y), swf(K)):-
   is_decisive( urd(2,3), G, (X > Y), swf(K)),
   is_decisive( urd(2,3), G, (Y > X), swf(K)).

/*

?- is_decisive( urd(2,3), [1,2], X, swf(1)),
X=(_,_),tab(2),write([X]),fail.
  [ (a, b)]  [ (a, c)]  [ (b, a)]  [ (b, c)]  [ (c, a)]  [ (c, b)]

No
?- is_decisive( urd(2,3), [1], X, swf(1)),
X=(_>_),tab(2),write([X]),fail.
  [a>b]  [a>c]  [b>a]  [b>c]  [c>a]  [c>b]

No
?- is_decisive( urd(2,3), [1], X, swf(1)),
X=(_,_),tab(2),write([X]),fail.
  [ (a, b)]  [ (a, c)]  [ (b, a)]  [ (b, c)]  [ (c, a)]  [ (c, b)]

No
?- is_decisive( urd(2,3), [2], X, swf(1)).

No
?-

*/

%  decisiveness of group
%-------------------------------------------------

is_decisive( urd(2,3), G, swf(K)):-
   group(G),
   social_welfare_function( urd(2,3), swf(K)),
   forall(
    (
     distinct_pair_of_alternatives(X,Y)
    ),
    (
     is_decisive( urd(2,3),G, (X, Y), swf(K))
    )
   ).

/*

?- is_decisive( urd(2,3), G, Swf).

G = [1]
Swf = swf(1) ;

G = [2]
Swf = swf(2) ;

G = [1, 2]
Swf = swf(1) ;

G = [1, 2]
Swf = swf(2) ;

No
?-

*/


%  dictatorship as decisiveness of singlton
%-------------------------------------------------

dictator_for_swf(Domain, Swf, J):-
   is_decisive( Domain, [J], Swf). 


%  the Pareto principle as decisiveness of everyone
%-------------------------------------------------

satisfies_Pareto_principle( Domain, Swf):-
   set_of_agents(N),
   is_decisive( Domain, N, Swf). 


/*

?- dictator_for_swf(Domain, swf(K), J).

Domain = urd(2, 3)
K = 1
J = 1 ;

Domain = urd(2, 3)
K = 2
J = 2 ;

No
?- satisfies_Pareto_principle( Domain, swf(K)).

Domain = urd(2, 3)
K = 1 ;

Domain = urd(2, 3)
K = 2 ;

No
?-

*/

%  another definition for the Pareto principle :
%  restriction to the socially maximal set
%-------------------------------------------------

satisfies_Pareto_principle_2( Domain, Swf):-
   social_welfare_function( Domain, Swf),
   forall(
    (
     possible_preference_pair( urd(2,3), (R1, R2),_)
    ),
    (
     social_welfare_function( Domain, Swf, [R1,R2]->R),
     is_subset_of_maximals( [R1,R2]->R)
    )
   ).


is_subset_of_maximals( Rn->R):-
   socially_choosing_maximals(R,Rn,_,_).


/*

?- satisfies_Pareto_principle( Domain, swf(K)),
\+ satisfies_Pareto_principle_2( Domain, swf(K)).

No
?- satisfies_Pareto_principle_2( Domain, swf(K)),
\+ satisfies_Pareto_principle( Domain, swf(K)).

No
?-

*/



% independent from irrelevant alternatives (IIA)
%-------------------------------------------------

iia_condition_of_swf(Swf,(X,Y)):-
   social_welfare_function( urd(2,3), Swf),
   distinct_pair_of_alternatives(X,Y),
   findall(B,
    (
     social_welfare_function( urd(2,3), Swf,R->F),
     bit_profile_of_preference_on_pair( (X,Y),[F|R],B)
    ),
   Lb),
   \+ \+ setof(Bf, member( [Bf|_],Lb),[_]).


iia_condition_of_swf(Swf):-
   social_welfare_function( urd(2,3), Swf),
   forall(
    (
     distinct_pair_of_alternatives(X,Y)
    ),
    (
     iia_condition_of_swf(Swf,(X,Y))
    )
   ).


/*

?- iia_condition_of_swf(Swf).

Swf = swf(1) ;

Swf = swf(2) ;

No
?- iia_condition_of_swf(swf(3),(X,Y)).

No
?- 

*/



%  automated designing SWFs recursively for the 2x3 
%  unrestricted domain with the IIA condition 
%-------------------------------------------------

all_preference_pairs_in_urd23( Poss):-
   findall([R1,R2],
     possible_preference_pair( urd(2,3), (R1, R2),_),
   Poss).

auto_swf( urd(2,3), FL,Property):-
   all_preference_pairs_in_urd23( L),
   auto_swf( urd(2,3), FL, L, Property).

auto_swf( _, [],[], _).

auto_swf( Domain, [R->F | H], [R|Q], free):-
   auto_swf( Domain, H,Q,free),
   possible_preference_ordering(F, _).

auto_swf( Domain, [R->F | H], [R|Q], pareto):-
   auto_swf( Domain, H,Q,pareto),
   possible_preference_ordering(F, _),
   is_subset_of_maximals( R->F).

auto_swf( Domain, [R->F | H], [R|Q], iia(1)):-
   auto_swf( Domain, H,Q,iia(1)),
   possible_preference_ordering(F, _),
   \+ violates_iia( R->F, H, _).

auto_swf( Domain, H, [R], iia(2)):-
   auto_swf( Domain, H,[R],pareto).

auto_swf( Domain, [R->F | H], [R|Q], iia(2)):-
   auto_swf( Domain, H,Q,iia(2)),
   Q\=[],
   possible_preference_ordering(F, _),
   \+ violates_iia( R->F, H, _).

auto_swf( Domain, H, [R], iia(3)):-
   auto_swf( Domain, H,[R],pareto).

auto_swf( Domain, [R->F | H], [R|Q], iia(3)):-
   auto_swf( Domain, H,Q,iia(3)),
   Q\=[],
   possible_preference_ordering(F, _),
   is_subset_of_maximals( R->F),
   \+ violates_iia( R->F, H, _).

violates_iia( R->F, H, [(X,Y), B, B1]):-
   distinct_pair_of_alternatives(X,Y),
   bit_profile_of_preference_on_pair( (X,Y),[F|R],[B|Br]),
   member( R1->F1, H),
   bit_profile_of_preference_on_pair( (X,Y),[F1|R1],[B1|Br]),
   B  \= B1.

/*

?- auto_swf( Domain, H, free),
display_auto_swf(H).

row=1;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=2;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=3;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=4;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=5;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=6;[r(1), r(1), r(1), r(1), r(1), r(1)]

Domain = urd(2, 3)
H = [ ([r(1), r(1)]->r(1)), ([r(2), r(1)]->r(1)), ([r(3), r(1)]->r(1)), ([r(4), r(1)]->r(1)), ([r(5), r(1)]->r(1)), ([r(6), r(...)]->r(1)), ([r(...)|...]->r(1)), ([...|...]->r(...)), (... ->...)|...] 

Yes
?- auto_swf( Domain, H, pareto),
display_auto_swf(H).

row=1;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=2;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=3;[r(1), r(1), r(3), r(3), r(3), r(3)]
row=4;[r(1), r(1), r(3), r(3), r(3), r(3)]
row=5;[r(1), r(1), r(3), r(3), r(5), r(5)]
row=6;[r(1), r(1), r(3), r(3), r(5), r(5)]

Domain = urd(2, 3)
H = [ ([r(1), r(1)]->r(1)), ([r(2), r(1)]->r(1)), ([r(3), r(1)]->r(1)), ([r(4), r(1)]->r(1)), ([r(5), r(1)]->r(1)), ([r(6), r(...)]->r(1)), ([r(...)|...]->r(1)), ([...|...]->r(...)), (... ->...)|...] 

Yes
?- auto_swf( Domain, H, iia(1)),
display_auto_swf(H).

row=1;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=2;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=3;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=4;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=5;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=6;[r(1), r(1), r(1), r(1), r(1), r(1)]

Domain = urd(2, 3)
H = [ ([r(1), r(1)]->r(1)), ([r(2), r(1)]->r(1)), ([r(3), r(1)]->r(1)), ([r(4), r(1)]->r(1)), ([r(5), r(1)]->r(1)), ([r(6), r(...)]->r(1)), ([r(...)|...]->r(1)), ([...|...]->r(...)), (... ->...)|...] 

Yes
?- auto_swf( Domain, H, iia(3)),
display_auto_swf(H).

row=1;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=2;[r(2), r(2), r(2), r(2), r(2), r(2)]
row=3;[r(3), r(3), r(3), r(3), r(3), r(3)]
row=4;[r(4), r(4), r(4), r(4), r(4), r(4)]
row=5;[r(5), r(5), r(5), r(5), r(5), r(5)]
row=6;[r(6), r(6), r(6), r(6), r(6), r(6)]

Domain = urd(2, 3)
H = [ ([r(1), r(1)]->r(1)), ([r(2), r(1)]->r(2)), ([r(3), r(1)]->r(3)), ([r(4), r(1)]->r(4)), ([r(5), r(1)]->r(5)), ([r(6), r(...)]->r(6)), ([r(...)|...]->r(1)), ([...|...]->r(...)), (... ->...)|...] ;

row=1;[r(1), r(2), r(3), r(4), r(5), r(6)]
row=2;[r(1), r(2), r(3), r(4), r(5), r(6)]
row=3;[r(1), r(2), r(3), r(4), r(5), r(6)]
row=4;[r(1), r(2), r(3), r(4), r(5), r(6)]
row=5;[r(1), r(2), r(3), r(4), r(5), r(6)]
row=6;[r(1), r(2), r(3), r(4), r(5), r(6)]

Domain = urd(2, 3)
H = [ ([r(1), r(1)]->r(1)), ([r(2), r(1)]->r(1)), ([r(3), r(1)]->r(1)), ([r(4), r(1)]->r(1)), ([r(5), r(1)]->r(1)), ([r(6), r(...)]->r(1)), ([r(...)|...]->r(2)), ([...|...]->r(...)), (... ->...)|...] ;

No
?- 

*/


%  displaying swfs
%-------------------------------------------------

preprocess_for_display_swf(Swf,F):-
   social_welfare_function( urd(2,3), Swf),
   findall(
     [r(J),r(K)]->C,
     social_welfare_function( urd(2,3), Swf,[r(J),r(K)]->C),
     F
   ).

display_swf(Swf):-
   preprocess_for_display_swf(Swf,F),
   display_auto_swf(F).

display_swf_n(Swf):-
   preprocess_for_display_swf(Swf,F),
   display_auto_swf_n(F).



display_auto_swf_n(F):-
   forall(
     setof((K,C),member([r(J),r(K)]->C,F),L),
     (nl,write(row=J;L))
   ).

display_auto_swf(F):-
   \+ var(F),
   length(F,_),
   forall(
     bagof(C,K^member([r(J),r(K)]->C,F),L),
     (nl,write(row=J;L))
   ).

/*

?- display_swf(H).

row=1;[r(1), r(1), r(1), r(1), r(1), r(1)]
row=2;[r(2), r(2), r(2), r(2), r(2), r(2)]
row=3;[r(3), r(3), r(3), r(3), r(3), r(3)]
row=4;[r(4), r(4), r(4), r(4), r(4), r(4)]
row=5;[r(5), r(5), r(5), r(5), r(5), r(5)]
row=6;[r(6), r(6), r(6), r(6), r(6), r(6)]

H = swf(1) 

Yes
?- 

*/


% end of the program

return to front page.