% metric_d.pl % preference evolution and the minimal distances by dodgeson % date: 2007.6.30-7.2,4-6 % revised: 2007.8.25-27 (excerpt of the basic part of metric01b.pl) % reference % Gaertner, W. (2006). % A Primer in Social Choice Theory, Oxford Univrsity Press. % preliminary: empty cores in simple games %-------------------------------------------------------------- :- [sged06,power]. :- ['mylib/math1.pl']. % :- [mylib/menu]. :- chdom(_->l:L), nl,write('default domain':L),nl,nl. :- make_n_agents(3). % make monotone proper strong game with an empty core. mps_game_with_ec(W):- gen_win(W,[monotonic:yes,proper:yes,strong:yes]), \+ \+ core([],_). mps_game_with_ec:- mps_game_with_ec(_),verify_win. latin_square(1,[[+, +, +], [+, -, -], [-, -, +]]). latin_square(2,[[+, +, -], [-, +, +], [-, -, -]]). /* ?- display_domain. current domain: ACITZN [base domain=l:linear] Yes ?- mode_dominance(A,on). A = win(strict) Yes ?- mps_game_with_ec(_),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 % Observe that the only simple majority game is a % unique monotone proper strong game which has empty core. ?- mps_game_with_ec(_), inspect_all_empty_core_sorted(L). 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 = [[[+, +, +], [+, -, -], [-, -, +]], [[+, +, -], [-, +, +], [-, -, -]]] ; No % Observe that the empty core are arozen from Latin squares. ?- latin_square(K,L),name_domain(N,L). K = 1 L = [[+, +, +], [+, -, -], [-, -, +]] N = 'AZI' ; K = 2 L = [[+, +, -], [-, +, +], [-, -, -]] N = 'TCN' ; No ?- rr(R),name_domain('ZIA',R),majority(R->M),r(M,A,B),cycle(B). R = [[+, -, -], [-, -, +], [+, +, +]] M = [+, -, +] A = [ (a, b): +, (a, c): -, (b, c): +] B = [a>b, c>a, b>c] Yes ?- */ % The system assumes majority decision, for n=3, size-two % winning coalitions, as the default. % However, it can be replaced with any power distribution, % i.e., a simple game, % so that the metrics may be changing over the time. :- mps_game_with_ec. % transition rules for individual preferences %-------------------------------------------------------------- :- dynamic permit_reversal/2. permit_reversal(+,-). permit_reversal(-,+). permit_reversal(0,+). permit_reversal(0,-). permit_reversal(+,0). permit_reversal(-,0). malleable(P->Q,J,XY):- malleable(P->Q,J,XY,_). malleable(P->Q,J,XY,Pj->Qj):- (var(P)-> rr(P);true), udrr(P,Q,_,(J,Pj,_)), r_j(J,Q,Qj), % uniquely_reverse_an_ordered_pair(XY,Pj,Qj), swap_direction_of_pair(XY,Pj,Qj), verify_permissible_reversal(XY,Pj,Qj). verify_permissible_reversal(XY,P,Q):- r(P,A,_), r(Q,B,_), member(XY:S,A),member(XY:T,B), permit_reversal(S,T). /* ?- malleable(P->Q,J,XY),name_domain(N,P),name_domain(M,Q). P = [[+, +, +], [+, +, +], [+, +, +]] Q = [[-, +, +], [+, +, +], [+, +, +]] J = 1 XY = a, b N = 'AAA' M = 'CAA' ; P = [[+, +, +], [+, +, +], [+, +, +]] Q = [[+, +, -], [+, +, +], [+, +, +]] J = 1 XY = b, c N = 'AAA' M = 'TAA' Yes */ % preference reversal (1): for each ordered pair % only single step reversal is allowed % (It is very slow and may cause intransitivty.) %-------------------------------------------------------------- uniquely_reverse_an_ordered_pair((X,Y),P,Q):- dop((X,Y)), r((X,Y),P),o(Q), \+ r((X,Y),Q), otherwise_equivalent((X,Y),P,Q). uniquely_reverse_an_ordered_pair((X,Y),P,Q):- dop((X,Y)), \+ r((X,Y),P),o(Q), r((X,Y),Q), otherwise_equivalent((X,Y),P,Q). otherwise_equivalent((X,Y),P,Q):- \+ (dop(W),W\=(X,Y),r(W,P),\+ r(W,Q)), \+ (dop(W),W\=(X,Y),\+ r(W,P),r(W,Q)). asymmetric_difference(A,B,D1,D2):- subtract(A,B,D1), subtract(B,A,D2). /* ?- all_dop(A). A = [ (a, b), (a, c), (b, c), (b, a), (c, a), (c, b)] Yes ?- domain_type(A). A = l:linear ; No ?- uniquely_reverse_an_ordered_pair((a,b),[A,+,+],Q). A = 0 Q = [-, +, +] ; No ?- uniquely_reverse_an_ordered_pair((b,a),[A,+,+],Q). A = 0 Q = [+, +, +] ; No ?- uniquely_reverse_an_ordered_pair((a,b),[+,+,+],Q). No % direted pair (a,b) can not be reversed at a ranking [+,+,+] % because of the linear domain. ?- r(P),uniquely_reverse_an_ordered_pair(XY,P,Q), asymmetric_difference(P,Q,D,E),nl,write(P->Q:XY;D;E),fail. [+, +, +]->[0, +, +]: (b, a);[];[0] [+, +, +]->[+, 0, +]: (c, a);[];[0] [+, +, +]->[+, +, 0]: (c, b);[];[0] [-, +, +]->[0, +, +]: (a, b);[-];[0] [-, +, +]->[-, 0, +]: (c, a);[];[0] [-, +, +]->[-, +, 0]: (c, b);[];[0] [-, -, +]->[0, -, +]: (a, b);[];[0] [-, -, +]->[-, 0, +]: (a, c);[];[0] [-, -, +]->[-, -, 0]: (c, b);[+];[0] [+, +, -]->[+, +, 0]: (b, c);[-];[0] [+, +, -]->[0, +, -]: (b, a);[];[0] [+, +, -]->[+, 0, -]: (c, a);[];[0] [+, -, -]->[+, 0, -]: (a, c);[];[0] [+, -, -]->[+, -, 0]: (b, c);[];[0] [+, -, -]->[0, -, -]: (b, a);[+];[0] [-, -, -]->[0, -, -]: (a, b);[];[0] [-, -, -]->[-, 0, -]: (a, c);[];[0] [-, -, -]->[-, -, 0]: (b, c);[];[0] No ?- */ % preference reversal (2): % symmetrically reverse the direction for each pair. %-------------------------------------------------------------- swap_direction_of_pair(XY,P,Q):- \+ domain_type(_:linear), d_pair(XY), has_a_single_difference(P,Q,XY). swap_direction_of_pair(XY,P,Q):- d_pair(XY), has_a_symmetric_difference(P,Q,XY). has_a_single_difference(P,Q,(X,Y)):- r(P,_,A),r(Q,_,B), asymmetric_difference(A,B,D1,D2), member((D1,D2),[([D],[]),([],[D])]), member(D,[X>Y,Y>X]). has_a_symmetric_difference(P,Q,(X,Y)):- r(P,_,A),r(Q,_,B), asymmetric_difference(A,B,D1,D2), member((D1,D2),[ ([X>Y],[Y>X]), ([Y>X],[X>Y]) ]). is_upper_diagonal([A,B,C]):- A@=q:Q))),nl,fail. p:[+, +, +] a, b->q:[-, +, +] a, c->q:[+, -, +] b, c->q:[+, +, -] p:[+, +, -] a, b->q:[-, +, -] a, c->q:[+, -, -] b, c->q:[+, +, +] p:[+, -, -] a, b->q:[-, -, -] a, c->q:[+, +, -] b, c->q:[+, -, +] p:[-, -, -] a, b->q:[+, -, -] a, c->q:[-, +, -] b, c->q:[-, -, +] No % for (weak) orderings ?- chdom(_->t:L). L = transitive Yes ?- r(P),is_upper_diagonal(P),write(P),fail. [+, +, +][0, +, +][0, 0, 0][+, +, -][+, -, -][0, -, -][-, -, -] No ?- r(P),l(P),is_upper_diagonal(P),nl,write(p:P), forall(swap_direction_of_pair(XY,P,Q),(tab(1),nl,write(XY->q:Q))),nl,fail. p:[+, +, +] a, b->q:[0, +, +] a, b->q:[-, +, +] a, c->q:[+, 0, +] a, c->q:[+, -, +] b, c->q:[+, +, 0] b, c->q:[+, +, -] p:[+, +, -] a, b->q:[0, +, -] a, b->q:[-, +, -] a, c->q:[+, 0, -] a, c->q:[+, -, -] b, c->q:[+, +, +] b, c->q:[+, +, 0] p:[+, -, -] a, b->q:[0, -, -] a, b->q:[-, -, -] a, c->q:[+, +, -] a, c->q:[+, 0, -] b, c->q:[+, -, +] b, c->q:[+, -, 0] p:[-, -, -] a, b->q:[+, -, -] a, b->q:[0, -, -] a, c->q:[-, +, -] a, c->q:[-, 0, -] b, c->q:[-, -, +] b, c->q:[-, -, 0] No ?- r(P),\+ l(P),is_upper_diagonal(P),nl,write(p:P), forall(swap_direction_of_pair(XY,P,Q),(tab(1),nl,write(XY->q:Q))),nl,fail. p:[0, +, +] a, b->q:[+, +, +] a, b->q:[-, +, +] a, c->q:[0, 0, +] b, c->q:[0, +, 0] a, c->q:[0, -, +] b, c->q:[0, +, -] p:[0, 0, 0] a, b->q:[+, 0, 0] a, b->q:[-, 0, 0] a, c->q:[0, +, 0] a, c->q:[0, -, 0] b, c->q:[0, 0, +] b, c->q:[0, 0, -] p:[0, -, -] a, b->q:[+, -, -] a, b->q:[-, -, -] a, c->q:[0, 0, -] b, c->q:[0, -, 0] a, c->q:[0, +, -] b, c->q:[0, -, +] No ?- Q = [[-, -, -], [0, 0, 0], [+, +, +]], rr(Q),malleable(Q->R,J,XY),nl,write(R;J;XY),fail. [[0, -, -], [0, 0, 0], [+, +, +]];1;a, b [[-, -, 0], [0, 0, 0], [+, +, +]];1;b, c [[+, -, -], [0, 0, 0], [+, +, +]];1;a, b [[-, -, +], [0, 0, 0], [+, +, +]];1;b, c [[-, -, -], [0, 0, 0], [0, +, +]];3;a, b [[-, -, -], [0, 0, 0], [+, +, 0]];3;b, c [[-, -, -], [0, 0, 0], [-, +, +]];3;a, b [[-, -, -], [0, 0, 0], [+, +, -]];3;b, c No ?- P = [0,0,0], swap_direction_of_pair(XY,P,Q),r(Q),write(Q),fail. No % for quasi-transitive orderings ?- chdom(_->q:P). P = quasi-transitive Yes ?- P = [0,0,0], swap_direction_of_pair(XY,P,Q),r(Q),write(Q),fail. [+, 0, 0][-, 0, 0][0, +, 0][0, -, 0][0, 0, +][0, 0, -] No */ % minimal revision of core % and coalitional manipulation %-------------------------------------------------------------- :- dynamic minimal_revision_rr/4. minimal_revision(X,K,A:R->B:Q,C->D,H):- x(X),core(C,R),\+ member(X,C), minimal_revision_1(X,K,A:R->B:Q,C->D,H). minimal_revision_1(X,K,A:R->Q,B:C->D,(V,U)):- affect_core(rr(A),R->Q,K,V,U,C->D), (var(X)->(x(X),\+ member(X,C));true), member(X,D), name_domain(B,Q), !. /* ?- R='AAA':_,minimal_revision(X,K,R->Q,CD,H). R = 'AAA':[[+, +, +], [+, +, +], [+, +, +]] X = b K = 2 Q = 'CCA':[[-, +, +], [-, +, +], [+, +, +]] CD = [a]->[b] H = [2, 1], [ (a, b), (a, b)] ; R = 'AAA':[[+, +, +], [+, +, +], [+, +, +]] X = c K = 4 Q = 'ZZA':[[+, -, -], [+, -, -], [+, +, +]] CD = [a]->[c] H = [2, 2, 1, 1], [ (a, c), (b, c), (a, c), (b, c)] Yes ?- */ % the dodgeson's rule %-------------------------------------------------------------- % dodgeson's distance for a given alternative % and a profile = the minimal number of reversals % in order to the alternative to be a Condorcet winner % of majority decision. dodgeson_rule_bin((X,Y),R,[(K,K1),(Q,Q1),(Z,Z1)]):- d_pair((W,V)),((X,Y)=(W,V);(X,Y)=(V,W)), distance(dodgeson(min,K,X),R->Q,_,Z), distance(dodgeson(min,K1,Y),R->Q1,_,Z1). dodgeson_rule_sgn('+',(K,K1)):- K < K1,!. dodgeson_rule_sgn('-',(K,K1)):- K > K1,!. dodgeson_rule_sgn(0,_). % [*] % [*] Note that in gprf06.pl, 0s, not '0's, by means of which % I intend to denote indifference relations, are used. /* ?- rr(R),x(X),\+ distance(dodgeson(min,K,X),R->Q,_,Z). No */ dodgeson_rule(R->D):- rr(R), findall(S, ( d_pair(XY), dodgeson_rule_bin(XY,R,[KK|_]), dodgeson_rule_sgn(S,KK) ), D). dodgeson_rule(R->D,B):- dodgeson_rule(R->D), r(D,_,B). % another constructon of the aggregation rule dodgeson_rule_1(R->B):- rr(R), findall(X>Y, ( dodgeson_rule_bin((X,Y),R,[(K,K1)|_]), K =< K1 ), B). dodgeson_rule_1(R->D,B):- dodgeson_rule_1(R->B), r(D,_,B). % synonym dodgeson_rule(D,B,R):- dodgeson_rule(R->D,B). dodgeson_rule_1(D,B,R):- dodgeson_rule_1(R->D,B). r_dodgeson(D,R):- dodgeson_rule(R->D). r_dodgeson_1(D,R):- dodgeson_rule_1(R->D,_). /* ?- rr(R),is_upper_diagonal(R),x(X), \+ distance(dodgeson(min,K,X),R->Q,_,Z),nl,write(R;X),fail. No ?- dodgeson_rule(RD,B,R). RD = [+, +, +] B = [a>b, a>c, b>c] R = [[+, +, +], [+, +, +], [+, +, +]] ; RD = [+, +, +] B = [a>b, a>c, b>c] R = [[-, +, +], [+, +, +], [+, +, +]] ; RD = [+, +, +] B = [a>b, a>c, b>c] R = [[-, -, +], [+, +, +], [+, +, +]] ; RD = [+, +, +] B = [a>b, a>c, b>c] R = [[+, +, -], [+, +, +], [+, +, +]] Yes ?- r(RD),\+ (rr(R),dodgeson_rule(RD,B,R)),nl,write(RD),fail. No ?- ?- rr(R),is_upper_diagonal(R),\+ dodgeson_rule(RD,B,R), name_domain(A,R),nl,write(R;A),fail. No ?- rr(R),is_upper_diagonal(R), \+ (dodgeson_rule(R->D,B),dodgeson_rule_1(R->D,B)), name_domain(A,R),nl,write(R;A),fail. No % comparison to the simple majority rule ?- rr(Q),is_upper_diagonal(Q), r_dodgeson(RD,Q),name_domain(A,Q),majority(Q->M), RD\=M,nl,write(A:Q;d:RD;m:M),fail. TTC:[[+, +, -], [+, +, -], [-, +, +]];d:[+, +, 0];m:[+, +, -] AII:[[+, +, +], [-, -, +], [-, -, +]];d:[-, 0, +];m:[-, -, +] AZI:[[+, +, +], [+, -, -], [-, -, +]];d:[0, 0, 0];m:[+, -, +] ZZI:[[+, -, -], [+, -, -], [-, -, +]];d:[0, -, -];m:[+, -, -] AAZ:[[+, +, +], [+, +, +], [+, -, -]];d:[+, +, 0];m:[+, +, +] CCN:[[-, +, +], [-, +, +], [-, -, -]];d:[-, 0, +];m:[-, +, +] TCN:[[+, +, -], [-, +, +], [-, -, -]];d:[0, 0, 0];m:[-, +, -] TNN:[[+, +, -], [-, -, -], [-, -, -]];d:[0, -, -];m:[-, -, -] No ?- rr(Q),is_upper_diagonal(Q), r_dodgeson(D,Q),majority(Q->M),D\=M, name_domain(A,Q),nl,write((profile:A,majorty:M,dodgeson:D)),fail. profile:TTC, majorty:[+, +, -], dodgeson:[+, +, 0] profile:AII, majorty:[-, -, +], dodgeson:[-, 0, +] profile:AZI, majorty:[+, -, +], dodgeson:[0, 0, 0] profile:ZZI, majorty:[+, -, -], dodgeson:[0, -, -] profile:AAZ, majorty:[+, +, +], dodgeson:[+, +, 0] profile:CCN, majorty:[-, +, +], dodgeson:[-, 0, +] profile:TCN, majorty:[-, +, -], dodgeson:[0, 0, 0] profile:TNN, majorty:[-, -, -], dodgeson:[0, -, -] No % Observe that at several profiles it differs from each other % but the winner always is same. ?- r_dodgeson(D,Q),majority(Q->M),best(B,D),best(W,M),B\=W. No ?- */ % evolving profiles and cores : % simulating sequentially coalitional manipulability %-------------------------------------------------------------- trial_step(K):- time_perspective([_|H]),member(K,H). time_perspective([0,1,2,3,4,5,6,7,8,9]). rr_evolve(step(0),R->R,[C],[],[],[]):-rr(R),core(C,R). rr_evolve(step(K),R->Q,[C|F],[(J,XY,Q)|H],[J|V],[XY|U]):- trial_step(K), K0 is K- 1, length(H,K0), rr_evolve(step(K0),R->S,F,H,V,U), malleable(S->Q,J,XY), core(C,Q). /* ?- latin_square(1,R),rr_evolve(step(1),R->Q,F,_,V,U). R = [[+, +, +], [+, -, -], [-, -, +]] Q = [[-, +, +], [+, -, -], [-, -, +]] F = [[b], []] V = [1] U = [ (a, b)] ; R = [[+, +, +], [+, -, -], [-, -, +]] Q = [[+, +, -], [+, -, -], [-, -, +]] F = [[c], []] V = [1] U = [ (b, c)] ; Yes ?- latin_square(2,R),rr_evolve(step(1),R->Q,F,_,V,U). R = [[+, +, -], [-, +, +], [-, -, -]] Q = [[+, +, +], [-, +, +], [-, -, -]] F = [[b], []] V = [1] U = [ (b, c)] ; R = [[+, +, -], [-, +, +], [-, -, -]] Q = [[+, -, -], [-, +, +], [-, -, -]] F = [[c], []] V = [1] U = [ (a, c)] Yes ?- */ test_rr_evolve(N:R,M:Q,K,L):- (var(N)->true;(is_upper_diagonal(R),name_domain(N,R))), findall(K:N->M;C->D;V;U,( rr(R),is_upper_diagonal(R),name_domain(N,R), rr_evolve(step(K),R->Q,[D|_],_,V,U),core(C,R),C\=D, name_domain(M,Q) ),L). test_rr_evolve(N:R,M:Q,K):- test_rr_evolve(N:R,M:Q,K,L), setof(K:N->M;D;V;U,member(K:N->M;C->D;V;U,L),L1), member(K:N->M;D;V;U,L1),nl,write(step(K):N->M;C->D;V;U), fail. test_rr_evolve(_,_,_). /* ?- latin_square(1,R),test_rr_evolve(_:R,_,1). step(1):AZI->ANI;[]->[b];[2];[ (a, b)] step(1):AZI->ATI;[]->[a];[2];[ (a, c)] step(1):AZI->AZC;[]->[a];[3];[ (a, c)] step(1):AZI->AZN;[]->[c];[3];[ (b, c)] step(1):AZI->CZI;[]->[b];[1];[ (a, b)] step(1):AZI->TZI;[]->[c];[1];[ (b, c)] R = [[+, +, +], [+, -, -], [-, -, +]] Yes ?- test_rr_evolve('ATI':R,_,2). step(2):ATI->ACI;[a]->[b];[2, 2];[ (a, b), (b, c)] step(2):ATI->ANI;[a]->[b];[2, 2];[ (a, b), (a, c)] step(2):ATI->AZN;[a]->[c];[2, 3];[ (a, c), (b, c)] step(2):ATI->AZN;[a]->[c];[3, 2];[ (b, c), (a, c)] step(2):ATI->CAI;[a]->[b];[1, 2];[ (a, b), (b, c)] step(2):ATI->CAI;[a]->[b];[2, 1];[ (b, c), (a, b)] step(2):ATI->CTC;[a]->[b];[1, 3];[ (a, b), (a, c)] step(2):ATI->CTC;[a]->[b];[3, 1];[ (a, c), (a, b)] step(2):ATI->CTN;[a]->[];[1, 3];[ (a, b), (b, c)] step(2):ATI->CTN;[a]->[];[3, 1];[ (b, c), (a, b)] step(2):ATI->CZI;[a]->[b];[1, 2];[ (a, b), (a, c)] step(2):ATI->CZI;[a]->[b];[2, 1];[ (a, c), (a, b)] step(2):ATI->ITI;[a]->[b];[1, 1];[ (a, c), (a, b)] step(2):ATI->TZI;[a]->[c];[1, 2];[ (b, c), (a, c)] step(2):ATI->TZI;[a]->[c];[2, 1];[ (a, c), (b, c)] step(2):ATI->ZTI;[a]->[c];[1, 1];[ (a, c), (b, c)] R = _G158 Yes ?- */ % metric on a basis of the Dodgeson rule. %-------------------------------------------------------------- % metric on a basis of arbitrary profile. distance(dodgeson(0),R->R,[],[C]):- rr(R), core(C,R). distance(dodgeson(K),R->Q,[(J,XY,Q0)|H],[C|Z]):- trial_step(K), K0 is K- 1, length(H,K0), distance(dodgeson(K0),R->Q0,H,Z), malleable(Q0->Q,J,XY), \+ member((_,_,Q),H), core(C,Q), C\=[]. % \+ latin_square(_,Q), % the effect is same as C\=[] if linear domain % \+ member(C,Z), % no change in output but profile growing % metric on a basis of Latin square. distance(latin(J,K0),R->Q0,H,Z):- latin_square(J,R), distance(dodgeson(K0),R->Q0,H,Z). /* ?- distance(dodgeson(K),R->Q,H,C). K = 0 R = [[+, +, +], [+, +, +], [+, +, +]] Q = [[+, +, +], [+, +, +], [+, +, +]] H = [] C = [[a]] Yes ?- distance(dodgeson(1),R->Q,H,C). R = [[+, +, +], [+, +, +], [+, +, +]] Q = [[-, +, +], [+, +, +], [+, +, +]] H = [ (1, (a, b), [[+, +, +], [+, +, +], [+, +, +]])] C = [[a], [a]] Yes ?- distance(dodgeson(2),R->Q,H,C). R = [[+, +, +], [+, +, +], [+, +, +]] Q = [[-, -, +], [+, +, +], [+, +, +]] H = [ (1, (a, c), [[-, +, +], [+, +, +], [+, +, +]]), (1, (a, b), [[+, +, +], [+, +, +], [+, +|...]])] C = [[a], [a], [a]] Yes ?- distance(latin(1, 1),R->Q,H,C). R = [[+, +, +], [+, -, -], [-, -, +]] Q = [[-, +, +], [+, -, -], [-, -, +]] H = [ (1, (a, b), [[+, +, +], [+, -, -], [-, -, +]])] C = [[b], []] Yes ?- distance(latin(1, 2),R->Q,H,C). R = [[+, +, +], [+, -, -], [-, -, +]] Q = [[-, -, +], [+, -, -], [-, -, +]] H = [ (1, (a, c), [[-, +, +], [+, -, -], [-, -, +]]), (1, (a, b), [[+, +, +], [+, -, -], [-, -|...]])] C = [[b], [b], []] Yes ?- distance(latin(1, 3),R->Q,H,C). R = [[+, +, +], [+, -, -], [-, -, +]] Q = [[-, -, -], [+, -, -], [-, -, +]] H = [ (1, (b, c), [[-, -, +], [+, -, -], [-, -, +]]), (1, (a, c), [[-, +, +], [+, -, -], [-, -|...]]), (1, (a, b), [[+, +, +], [+, -|...], [-|...]])] C = [[c], [b], [b], []] Yes ?- */ % the metric of dodgeson's minimal distance %-------------------------------------------------------------- distance(dodgeson(min,K,X),R->Q,H,[C|Z]):- rr(R),x(X), % core(B,R),\+member(X,B), distance(dodgeson(K,X),R->Q,H,[C|Z]). distance(dodgeson(K,X),R->Q,H,[C|Z]):- distance(dodgeson(K),R->Q,H,[C|Z]), member(X,C), !. /* ?- distance(dodgeson(min,K,X),R->Q,H,[C|Z]). K = 0 X = a R = [[+, +, +], [+, +, +], [+, +, +]] Q = [[+, +, +], [+, +, +], [+, +, +]] H = [] C = [a] Z = [] Yes ?- distance(dodgeson(min,K,X),R->Q,H,[C|Z]),K>0. K = 2 X = b R = [[+, +, +], [+, +, +], [+, +, +]] Q = [[-, +, +], [-, +, +], [+, +, +]] H = [ (2, (a, b), [[-, +, +], [+, +, +], [+, +, +]]), (1, (a, b), [[+, +, +], [+, +, +], [+, +|...]])] C = [b] Z = [[a], [a]] ; K = 4 X = c R = [[+, +, +], [+, +, +], [+, +, +]] Q = [[+, -, -], [+, -, -], [+, +, +]] H = [ (2, (a, c), [[+, -, -], [+, +, -], [+, +, +]]), (2, (b, c), [[+, -, -], [+, +, +], [+, +|...]]), (1, (a, c), [[+, +, -], [+, +|...], [+|...]]), (1, (b, c), [[+, +|...], [+|...], [...|...]])] C = [c] Z = [[a], [a], [a], [a]] Yes ?- name_domain('AZI',R),distance(dodgeson(min,K,X),R->Q,H,CZ). R = [[+, +, +], [+, -, -], [-, -, +]] K = 1 X = a Q = [[+, +, +], [+, +, +], [-, -, +]] H = [ (2, (a, b), [[+, +, +], [+, -, -], [-, -, +]])] CZ = [[a], []] ; R = [[+, +, +], [+, -, -], [-, -, +]] K = 1 X = b Q = [[-, +, +], [+, -, -], [-, -, +]] H = [ (1, (a, b), [[+, +, +], [+, -, -], [-, -, +]])] CZ = [[b], []] ; R = [[+, +, +], [+, -, -], [-, -, +]] K = 1 X = c Q = [[+, +, -], [+, -, -], [-, -, +]] H = [ (1, (a, b), [[+, +, +], [+, -, -], [-, -, +]])] CZ = [[c], []] ; No % Observe that the metric is defined for each profile and alternative. ?- rr(R),\+ distance(dodgeson(min,K,X),R->Q,H,[C|Z]). No ?- rr(R),x(X),\+ distance(dodgeson(min,K,X),R->Q,H,[C|Z]). No ?- */ % end