% power indecies for sged06.pl % date: 2007.5.6 swing(L->W,J) :- winning(W), select(J,W,L), % j(J), subtract(W,[J],L), % an alternative code loosing(L). inspect_swing:- %write('game:'), %display_win, j(J), nl, write(agent:J), swing(S,J), nl, write(S), fail. inspect_swing:- nl, write('complete'). /* ?- [sged06]. % sged06 compiled 0.00 sec, 336 bytes Yes ?- make_n_agents(3). Yes ?- model(A,B). A = states:[a, b, c] B = agents:[1, 2, 3] Yes ?- gen_win(W,[monotonic:yes,proper:yes]),verify_win, inspect_swing,nl,fail. game:[[1, 2, 3], [1, 2], [1, 3], [1]] + :[monotonic, proper, strong] - :[weak(vetoers):[1], inessential(dictator):1] agent:1 [2, 3]->[1, 2, 3] [2]->[1, 2] [3]->[1, 3] []->[1] agent:2 agent:3 complete game:[[1, 2, 3], [1, 2], [1, 3], [2, 3]] + :[monotonic, proper, strong, not weak, essential] - :[] agent:1 [2]->[1, 2] [3]->[1, 3] agent:2 [1]->[1, 2] [3]->[2, 3] agent:3 [1]->[1, 3] [2]->[2, 3] complete game:[[1, 2, 3], [1, 2], [1, 3]] + :[monotonic, proper, essential] - :[not strong:[1], weak(vetoers):[1]] agent:1 [2, 3]->[1, 2, 3] [2]->[1, 2] [3]->[1, 3] agent:2 [1]->[1, 2] agent:3 [1]->[1, 3] complete game:[[1, 2, 3], [1, 2], [2, 3], [2]] + :[monotonic, proper, strong] - :[weak(vetoers):[2], inessential(dictator):2] agent:1 agent:2 [1, 3]->[1, 2, 3] [1]->[1, 2] [3]->[2, 3] []->[2] agent:3 complete game:[[1, 2, 3], [1, 2], [2, 3]] + :[monotonic, proper, essential] - :[not strong:[1, 3], weak(vetoers):[2]] agent:1 [2]->[1, 2] agent:2 [1, 3]->[1, 2, 3] [1]->[1, 2] [3]->[2, 3] agent:3 [2]->[2, 3] complete game:[[1, 2, 3], [1, 2]] + :[monotonic, proper, essential] - :[not strong:[1, 3], weak(vetoers):[1, 2]] agent:1 [2, 3]->[1, 2, 3] [2]->[1, 2] agent:2 [1, 3]->[1, 2, 3] [1]->[1, 2] agent:3 complete game:[[1, 2, 3], [1, 3], [2, 3], [3]] + :[monotonic, proper, strong] - :[weak(vetoers):[3], inessential(dictator):3] agent:1 agent:2 agent:3 [1, 2]->[1, 2, 3] [1]->[1, 3] [2]->[2, 3] []->[3] complete game:[[1, 2, 3], [1, 3], [2, 3]] + :[monotonic, proper, essential] - :[not strong:[1, 2], weak(vetoers):[3]] agent:1 [3]->[1, 3] agent:2 [3]->[2, 3] agent:3 [1, 2]->[1, 2, 3] [1]->[1, 3] [2]->[2, 3] complete game:[[1, 2, 3], [1, 3]] + :[monotonic, proper, essential] - :[not strong:[1, 2], weak(vetoers):[1, 3]] agent:1 [2, 3]->[1, 2, 3] [3]->[1, 3] agent:2 agent:3 [1, 2]->[1, 2, 3] [1]->[1, 3] complete game:[[1, 2, 3], [2, 3]] + :[monotonic, proper, essential] - :[not strong:[1, 2], weak(vetoers):[2, 3]] agent:1 agent:2 [1, 3]->[1, 2, 3] [3]->[2, 3] agent:3 [1, 2]->[1, 2, 3] [2]->[2, 3] complete game:[[1, 2, 3]] + :[monotonic, proper, essential] - :[not strong:[1, 2], weak(vetoers):[1, 2, 3]] agent:1 [2, 3]->[1, 2, 3] agent:2 [1, 3]->[1, 2, 3] agent:3 [1, 2]->[1, 2, 3] complete No ?- */ pivotal(L->W,J,'to win') :- swing(L->W,J). pivotal(W->L,J,'to loose') :- loosing(L), select(J,L,W), % j(J), subtract(L,[J],W), % an alternative code winning(W). inspect_pivotal:- %write('game:'), %display_win, j(J), nl, write(agent:J), pivotal(S,J,T), nl, write(S:T), fail. inspect_pivotal:- nl, write('complete'). /* ?- gen_win(W,[monotonic:no(I),proper:yes,strong:yes]),verify_win, inspect_pivotal,nl,fail. game:[[1, 2, 3], [1, 2], [1], [2]] + :[proper, strong, not weak, essential] - :[nonmonotonic: ([1], [1, 3])] agent:1 ([2, 3]->[1, 2, 3]):to win ([]->[1]):to win agent:2 ([1, 3]->[1, 2, 3]):to win ([]->[2]):to win agent:3 ([1]->[1, 3]):to loose ([2]->[2, 3]):to loose complete game:[[1, 2, 3], [1, 3], [1], [3]] + :[proper, strong, not weak, essential] - :[nonmonotonic: ([1], [1, 2])] agent:1 ([2, 3]->[1, 2, 3]):to win ([]->[1]):to win agent:2 ([1]->[1, 2]):to loose ([3]->[2, 3]):to loose agent:3 ([1, 2]->[1, 2, 3]):to win ([]->[3]):to win complete game:[[1, 2, 3], [1], [2], [3]] + :[proper, strong, not weak, essential] - :[nonmonotonic: ([1], [1, 2])] agent:1 ([2, 3]->[1, 2, 3]):to win ([]->[1]):to win ([2]->[1, 2]):to loose ([3]->[1, 3]):to loose agent:2 ([1, 3]->[1, 2, 3]):to win ([]->[2]):to win ([1]->[1, 2]):to loose ([3]->[2, 3]):to loose agent:3 ([1, 2]->[1, 2, 3]):to win ([]->[3]):to win ([1]->[1, 3]):to loose ([2]->[2, 3]):to loose complete game:[[1, 2, 3], [2, 3], [2], [3]] + :[proper, strong, not weak, essential] - :[nonmonotonic: ([2], [1, 2])] agent:1 ([2]->[1, 2]):to loose ([3]->[1, 3]):to loose agent:2 ([1, 3]->[1, 2, 3]):to win ([]->[2]):to win agent:3 ([1, 2]->[1, 2, 3]):to win ([]->[3]):to win complete No ?- */ % unanimity-based coalition formation %-------------------------------------------------------------- unanimity_in_coalition_for_xy(strict,S, RN,(X,Y)):- agents(N), rr(RN), coalition(S), b((X,Y)), % pair of alternatives % check preference profile restricted to the coalition \+ ( nth1(K,RN,RJ), nth1(K,N,J), member(J,S), \+ p((X,Y),RJ) ). unanimity_in_coalition_for_xy(weak,S, RN,(X,Y)):- agents(N), rr(RN), coalition(S), b((X,Y)), % pair of alternatives % check preference profile restricted to the coalition \+ ( nth1(K,RN,RJ), nth1(K,N,J), member(J,S), \+ r((X,Y),RJ) ). % Above two are equivalent either if the ordering is linear or % if the simple game is proper and strong (See Gaertner, p.40). % demo /* ?- display_domain. current domain: ACITZN [base domain=l:linear] Yes ?- unanimity_in_coalition_for_xy(strict,S, RN,XY). S = [1, 2, 3] RN = [[+, +, +], [+, +, +], [+, +, +]] XY = a, b ; S = [1, 2, 3] RN = [[+, +, +], [+, +, +], [+, +, +]] XY = a, c ; Yes ?- */ %-------------------------------------------------------------- % the cores of a simple game / effectivity function %-------------------------------------------------------------- % the core <--d the set of undominated outcomes based on unanimity. :- dynamic mode_dominance/2. mode_dominance( win(weak), off). mode_dominance( win(strict), on). %mode_dominance( eff, off). swap_mode_dominance(A->B):- switch_mode_dominance(A->B). enforce_mode_dominance(B):- mode_dominance(B,off), switch_mode_dominance(_->B), !. enforce_mode_dominance(B):- mode_dominance(B,on). switch_mode_dominance(A->B):- retract( mode_dominance( A, on)), retract( mode_dominance( B, off)), assert( mode_dominance( A, off)), assert( mode_dominance( B, on)). % dominance (or blocking) relations and cores % of a simple game / effectivity function %-------------------------------------------------------------- x_dominates_y_via(win(strict), (X,Y),C,RN):- win(C,yes), unanimity_in_coalition_for_xy(strict,C,RN,(X,Y)). x_dominates_y_via(win(weak), (X,Y),C,RN):- win(C,yes), unanimity_in_coalition_for_xy(weak,C,RN,(X,Y)). % % additional % \+ \+ (member(R,RN),p((X,Y),R)). x_dominates_y_via(eff, (B,Y),C,RN):- eff(C,B), B \=[], x(Y), \+ member(Y,B), (var(RN)->rr( RN);true), forall( member(X,B), unanimity_in_coalition_for_xy(weak,C,RN,(X,Y)) % unanimity_in_coalition_for_xy(strict,C,RN,(X,Y)) ). x_dominates_y_via((X,Y),C,RN):- mode_dominance( T, on), x_dominates_y_via(T, (X,Y),C,RN). x_dominates_y((X,Y),RN):- mode_dominance( win(T), on), dop((X,Y)), (var(RN)->rr( RN);true), \+ \+ x_dominates_y_via(win(T),(X,Y),_,RN). x_dominates_y((B,Y),RN):- mode_dominance( eff, on), event(B,_), x(Y), (var(RN)->rr( RN);true), \+ \+ x_dominates_y_via(eff,(B,Y),_,RN). % undominates/2 % sensitive to the background mode effectiveness parameter undominated_alt(Y,RN):- x(Y), rr(RN), \+ x_dominates_y((_,Y),RN). % The cores %-------------------------------------------------------------- core(C, RN):- rr( RN), findall( X, undominated_alt(X, RN), C). core(weak, C, RN):- core(C, RN). core(strong, C, RN):- strong_core(C, RN). inspect_empty_core:- forall((core([],RN),nl,write(RN:'=>')), ( forall(member(R,RN), ( id_r(_:A,R),write(A)) ) ) ). inspect_all_empty_core(L):- findall(RN,core([],RN),L). inspect_all_empty_core_sorted(L0):- findall(R0,(core([],RN),sort(RN,R0)),L), sort(L,L0). inspect_empty_core_sorted:- inspect_all_empty_core_sorted(L0), forall((member(RN,L0),nl,write(RN:'=>')), ( forall(member(R,RN), ( id_r(_:A,R),write(A)) ) ) ). inspect_value_restriction(X,T,RN) :- x(X), value_type(T), \+ ( member(R,RN), value(T:X,(a,b,c),R) ) -> write('=> not':T:X) ; write('=> a latin square'). /* ?- display_domain. current domain: ACITZN [base domain=l:linear] Yes ?- mode_dominance(A,on). A = win(strict) Yes ?- gen_win(W,[monotonic:yes,proper:yes,strong:yes]),\+ \+ core([],_), verify_win, inspect_empty_core,nl,fail. game:[[1, 2, 3], [1, 2], [1, 3], [2, 3]] + :[monotonic, proper, strong, not weak, essential] - :[] [[+, -, -], [-, -, +], [+, +, +]]: =>ZIA [[-, -, +], [+, -, -], [+, +, +]]: =>IZA [[-, -, -], [+, +, -], [-, +, +]]: =>NTC [[+, +, -], [-, -, -], [-, +, +]]: =>TNC [[+, -, -], [+, +, +], [-, -, +]]: =>ZAI [[+, +, +], [+, -, -], [-, -, +]]: =>AZI [[-, -, -], [-, +, +], [+, +, -]]: =>NCT [[-, +, +], [-, -, -], [+, +, -]]: =>CNT [[-, -, +], [+, +, +], [+, -, -]]: =>IAZ [[+, +, +], [-, -, +], [+, -, -]]: =>AIZ [[+, +, -], [-, +, +], [-, -, -]]: =>TCN [[-, +, +], [+, +, -], [-, -, -]]: =>CTN No ?- name_domain('ZIA',L). L = [[+, -, -], [-, -, +], [+, +, +]] Yes ?- name_domain('NTC',L). L = [[-, -, -], [+, +, -], [-, +, +]] Yes ?- A is 12/(6^3). A = 0.0555556 Yes ?- gen_win(W,[monotonic:yes,proper:yes,strong:yes]),\+ \+ core([],_), verify_win,core([],RN),nl,write(RN), inspect_value_restriction(X,T,RN), fail. game:[[1, 2, 3], [1, 2], [1, 3], [2, 3]] + :[monotonic, proper, strong, not weak, essential] - :[][[+, -, -], [-, -, +], [+, +, +]] [[-, -, +], [+, -, -], [+, +, +]]=> a latin square [[-, -, -], [+, +, -], [-, +, +]]=> a latin square [[+, +, -], [-, -, -], [-, +, +]]=> a latin square [[+, -, -], [+, +, +], [-, -, +]]=> a latin square [[+, +, +], [+, -, -], [-, -, +]]=> a latin square [[-, -, -], [-, +, +], [+, +, -]]=> a latin square [[-, +, +], [-, -, -], [+, +, -]]=> a latin square [[-, -, +], [+, +, +], [+, -, -]]=> a latin square [[+, +, +], [-, -, +], [+, -, -]]=> a latin square [[+, +, -], [-, +, +], [-, -, -]]=> a latin square [[-, +, +], [+, +, -], [-, -, -]]=> a latin square No ?- switch_mode_dominance(A). A = win(strict)->win(weak) Yes ?- display_domain. current domain: ACITZN [base domain=l:linear] Yes ?- gen_win(W,[monotonic:yes,proper:yes,strong:yes]),\+ \+ core([],_), verify_win,core([],RN),nl,write(RN), inspect_value_restriction(X,T,RN), fail. game:[[1, 2, 3], [1, 2], [1, 3], [2, 3]] + :[monotonic, proper, strong, not weak, essential] - :[] [[+, -, -], [-, -, +], [+, +, +]]=> a latin square [[-, -, +], [+, -, -], [+, +, +]]=> a latin square [[-, -, -], [+, +, -], [-, +, +]]=> a latin square [[+, +, -], [-, -, -], [-, +, +]]=> a latin square [[+, -, -], [+, +, +], [-, -, +]]=> a latin square [[+, +, +], [+, -, -], [-, -, +]]=> a latin square [[-, -, -], [-, +, +], [+, +, -]]=> a latin square [[-, +, +], [-, -, -], [+, +, -]]=> a latin square [[-, -, +], [+, +, +], [+, -, -]]=> a latin square [[+, +, +], [-, -, +], [+, -, -]]=> a latin square [[+, +, -], [-, +, +], [-, -, -]]=> a latin square [[-, +, +], [+, +, -], [-, -, -]]=> a latin square No ?- ?- chdom(A),display_domain. current domain: ABCFIJOSTWZnN [base domain=t:transitive] A = l:linear->t:transitive Yes ?- switch_mode_dominance(A). A = win(weak)->win(strict) Yes ?- gen_win(W,[monotonic:yes,proper:yes,strong:yes]),\+ \+ core([],_), verify_win, inspect_all_empty_core(L),length(L,N),A is N/(14^3). game:[[1, 2, 3], [1, 2], [1, 3], [2, 3]] + :[monotonic, proper, strong, not weak, essential] - :[] W = [[1, 2, 3], [1, 2], [1, 3], [2, 3]] L = [[[+, -, -], [-, -, +], [+, +, +]], [[-, -, +], [+, -, -], [+, +, +]], [[-, -, -], [+, +, -], [-, +, +]], [[+, +, -], [-, -, -], [-, +|...]], [[+, -, -], [+, +|...], [-|...]], [[+, +|...], [+|...], [...|...]], [[-|...], [...|...]|...], [[...|...]|...], [...|...]|...] N = 12 A = 0.00437318 Yes ?- switch_mode_dominance(A). A = win(strict)->win(weak) Yes ?- gen_win(W,[monotonic:yes,proper:yes,strong:yes]),\+ \+ core([],_), verify_win, inspect_all_empty_core(L),length(L,N),A is N/(14^3). game:[[1, 2, 3], [1, 2], [1, 3], [1]] + :[monotonic, proper, strong] - :[weak(vetoers):[1], inessential(dictator):1] W = [[1, 2, 3], [1, 2], [1, 3], [1]] L = [[[0, +, +], [+, +, +], [+, +, +]], [[0, 0, 0], [+, +, +], [+, +, +]], [[-, -, 0], [+, +, +], [+, +, +]], [[+, 0, -], [+, +, +], [+, +|...]], [[0, +, +], [0, +|...], [+|...]], [[0, 0|...], [0|...], [...|...]], [[-|...], [...|...]|...], [[...|...]|...], [...|...]|...] N = 676 A = 0.246356 ; game:[[1, 2, 3], [1, 2], [1, 3], [2, 3]] + :[monotonic, proper, strong, not weak, essential] - :[] W = [[1, 2, 3], [1, 2], [1, 3], [2, 3]] L = [[[0, +, +], [0, +, +], [+, +, +]], [[-, +, +], [0, +, +], [+, +, +]], [[-, 0, +], [0, +, +], [+, +, +]], [[-, -, +], [0, +, +], [+, +|...]], [[0, 0, 0], [0, +|...], [+|...]], [[-, -|...], [0|...], [...|...]], [[0|...], [...|...]|...], [[...|...]|...], [...|...]|...] N = 1090 A = 0.39723 ; game:[[1, 2, 3], [1, 2], [2, 3], [2]] + :[monotonic, proper, strong] - :[weak(vetoers):[2], inessential(dictator):2] W = [[1, 2, 3], [1, 2], [2, 3], [2]] L = [[[+, +, +], [0, +, +], [+, +, +]], [[0, +, +], [0, +, +], [+, +, +]], [[-, +, +], [0, +, +], [+, +, +]], [[-, 0, +], [0, +, +], [+, +|...]], [[-, -, +], [0, +|...], [+|...]], [[+, +|...], [0|...], [...|...]], [[0|...], [...|...]|...], [[...|...]|...], [...|...]|...] N = 676 A = 0.246356 ; game:[[1, 2, 3], [1, 3], [2, 3], [3]] + :[monotonic, proper, strong] - :[weak(vetoers):[3], inessential(dictator):3] W = [[1, 2, 3], [1, 3], [2, 3], [3]] L = [[[+, +, +], [+, +, +], [0, +, +]], [[0, +, +], [+, +, +], [0, +, +]], [[-, +, +], [+, +, +], [0, +, +]], [[-, 0, +], [+, +, +], [0, +|...]], [[-, -, +], [+, +|...], [0|...]], [[+, +|...], [+|...], [...|...]], [[0|...], [...|...]|...], [[...|...]|...], [...|...]|...] N = 676 A = 0.246356 ; No ?- ?- chdom(A->q:B),display_domain. current domain: ABCEFIJKMOPRSTWXZnN [base domain=q:quasi-transitive] A = t:transitive B = quasi-transitive Yes ?- switch_mode_dominance(A). A = win(weak)->win(strict) Yes ?- gen_win(W,[monotonic:yes,proper:yes,strong:yes]),\+ \+ core([],_), verify_win, inspect_all_empty_core(L),length(L,N),A is N/(19^3). game:[[1, 2, 3], [1, 2], [1, 3], [2, 3]] + :[monotonic, proper, strong, not weak, essential] - :[] W = [[1, 2, 3], [1, 2], [1, 3], [2, 3]] L = [[[+, -, -], [-, -, +], [+, +, +]], [[-, -, +], [+, -, -], [+, +, +]], [[-, -, -], [+, +, -], [-, +, +]], [[+, +, -], [-, -, -], [-, +|...]], [[+, -, -], [+, +|...], [-|...]], [[+, +|...], [+|...], [...|...]], [[-|...], [...|...]|...], [[...|...]|...], [...|...]|...] N = 12 A = 0.00174953 ; No ?- */