You selected sproof_f.pl

s:-J=['% strategic manipulation and majority vote by prolog'
,'%------------------------------------------------------'
,'% sproof_f.pl (12-3 Jan, 30 Mar-7(c),17-28(e), 29-30 Apr, '
,'% 1,8-10,14(f)-31 May, 1-2,10-11, 15,17-20,23,29,30 Jun, '
,'% 29 Jul 2006)'
], forall(member(X,J),(nl,write(X))).

% references:
/*
[Arrow 63] Arrow, K.
 Social Choice and Individual Values, Yale University Press, 1963.
[Gibbard 73] Gibbard, A. 
 Manipulation of voting schemes: A general result,
 Econometrica, Vol. 41: 587-602, 1973.
[Muller 77] Muller, E. and Satterthwaite, M. A.
 The equivalence of strong positive association and strategy-proofness,
 Journal of Economic Theory, Vol. 14: 412-418, 1977.
[Reny 01] Reny, P. J. 
 Arrow's theorem and the Gibbard-Satterthwaite theorem: A unified approach,
 Economic Letters, Vol. 70: 99-105, 2001.
[Satterthwaite 75] Satterthwaite, M. A. 
 Strategy-proofness and Arrow's conditions: Existence and correspondence theorems for voting procedures and social welfare functions,
 Journal of Economic Theory, Vol. 10: 187-217, 1975.
[Sen 82] Sen, A.,
 Choice, Welfare and Measurement, The MIT Press, 1982.
[Sen 69] Sen, A. and Pattanaik, P. K.
 Necessary and sufficient condition for rational choice under majority decision,
 Journal of Economic Theory, Vol. 1: 178-202, 1969.
[Sen 66] Sen, A.
 A possibility theorem of majority decisions,
 Econometrica, Vol. 34(2): 490-506, 1966.
[Ward 65] Ward, B.
 Majority voting and alternative forms of public enterprise,
 In J. Margolis (ed.), The Public Economy of Urban Communities.
 Johns Hopkins Press, Chapter 6, pp. 112-126, 1965.
[Inada 69] Inada, K.,
 On the simple majority decision rule,
 Econometrica, Vol. 36: 490-506, 1969.
[Kalai 77] Kalai, E. and Muller, E.
 Characterization of domains admitting nondictatorial social welfare functions and nonmanipulable voting procedures,
 Journal of Economic Theory, Vol. 16, pp.457-469 (1977).
[Fishburn 97] Fishburn, P.
 Acyclic sets of linear orders, 
 Social Choice and Welfare 14:113-124.
[Craven 96] Craven, J.
 Majority-consistent preference orderings, 
 Social Choice and Welfare 13:259-267.
[Abello 85] Abello, J.
 Intrinsic limitations on the majority rule, an algorithmic approach, 
 SIAM J Alg Discrete Meth 6:133-144.

*/

% Gibbard-Satterthwaite theorem
%-------------------------------------------------
%  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.

% Theorem(GS). Assume n>=2, m>=3, urd, cs. Then SP->Dict(i). 

% Lemma. SP --> MM (-->SP ).
% Lemma. SP -->PE. 


% unrestricted/admissible domain of 2- or N-person and 3-alternative.
%-------------------------------------------------
% modified: 30 Apr 2006. N-person
% modified: 22 May 2006. added setup_model/2.


:- dynamic set_of_alternatives/1.
:- dynamic set_of_agents/1.
:- dynamic mode_of_analysis/2.

setup_model(alt:A,soc:I):-
   abolish(set_of_alternatives/1),
   abolish(set_of_agents/1),
   abolish(mode_of_analysis/2),
   length(A,M),
   length(I,N),
   assert(set_of_alternatives(A)),
   assert(set_of_agents(I)),
   assert(mode_of_analysis(M-alternatives,N-person)),
   make_all_possible_rankings_0.

% lastely modified: 10, 23 Jun 2006.

:- dynamic  all_possible_rankings_0/2. 

make_all_possible_rankings_0:-
   abolish( all_possible_rankings_0/2),
   findall( R, possible_ranking_0(R,_), TR),
   length( TR, N),
   assert( all_possible_rankings_0(TR,N)). 

all_possible_rankings_0(TR):-
   \+ clause( all_possible_rankings_0(TR,_), _),
   make_all_possible_rankings_0,
   fail.
all_possible_rankings_0(TR):-
   clause( all_possible_rankings_0(TR,_), _),
   !.


%set_of_alternatives([a,b,c]).
%
set_of_alternatives([a,b,c,d]).
%set_of_alternatives([a,b,c,d,e]).

%set_of_agents([1,2]).
%
set_of_agents([1,2,3]).

% code for N>=3: a preparation

set_of_agents_1(I):-
   mode_of_analysis(_,N-person),
   length( I, N),
   set_of_agents_1(I,N,N).

set_of_agents_1([],0,_).
set_of_agents_1([K|I],M,N):-
   set_of_agents_1(I,J,N),
   M is J + 1,
   K is N - M + 1.


% mode_of_analysis/2.

mode_of_analysis(M-alternatives,N-person):-
   set_of_alternatives(A),
   set_of_agents(Is),
   length(A,M),
   length(Is,N).

alternative(X):- 
  set_of_alternatives(A),
  member(X,A).

agent(J):- 
  set_of_agents(N),
  member(J,N).



distinct_ordered_triple( (X,Y,Z)):-
   distinct_ordered_pair((X,Y)),
   alternative(Z),
   \+ member(Z, [X,Y]).

triple_of_alternative( (X,Y,Z)):-
   alternative(X),
   alternative(Y), X@ 3,
%   M > 8,
   possible_ranking_0_for_M_alternatives( M, r(J), R).

possible_ranking_0_for_3_alternatives( r(K), [S,T,U]):-
   set_of_alternatives([X,Y,Z|_]),
   relative_ranking_on_triple_0((X,Y,Z),(S,T,U),K).

%
/*
possible_ranking_0_for_4_alternatives( r((J,K)), R):-
   possible_ranking_0_for_3_alternatives( r(J), O),
   length(R,4),
   insert_nth_coordinate_and_shift(M,d,O,R),
   K is 4 - M.

possible_ranking_0_for_5_alternatives( r((J,K,L)), R):-
   possible_ranking_0_for_4_alternatives( r((J,K)), O),
   length(R,5),
   insert_nth_coordinate_and_shift(M,e,O,R),
   L is 5 - M.

possible_ranking_0_for_6_alternatives( r((J,K,L,L1)), R):-
   possible_ranking_0_for_5_alternatives( r((J,K,L)), O),
   length(R,6),
   insert_nth_coordinate_and_shift(M,f,O,R),
   L1 is 6 - M.

possible_ranking_0_for_7_alternatives( r((J,K,L,L1,L2)), R):-
   possible_ranking_0_for_6_alternatives( r((J,K,L,L1)), O),
   length(R,7),
   insert_nth_coordinate_and_shift(M,g,O,R),
   L2 is 7 - M.

possible_ranking_0_for_8_alternatives( r((J,K,L,L1,L2,L3)), R):-
   possible_ranking_0_for_7_alternatives( r((J,K,L,L1,L2)), O),
   length(R,8),
   insert_nth_coordinate_and_shift(M,h,O,R),
   L3 is 8 - M.

possible_ranking_0_for_M_alternatives(8, r((J,K,L)), R):-
   possible_ranking_0_for_8_alternatives( r((J,K,L)), R).

%
*/

possible_ranking_0_for_M_alternatives( M, _, _):-
   \+ var(M),
   set_of_alternatives(A),
   length(A,M),
%
   M > 3,
%   M > 8,
%   Base= [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],
%   append(A,_,Base),
   gen_possible_ranking_0_for_M_alt_if_not_exist( M, A),
   fail.

possible_ranking_0_for_M_alternatives( M, SymR, R):-
   \+ var(M),
   mode_of_analysis( M-alternatives, _),
%
   M > 3,
%   M > 8,
   clause( possible_ranking_0_for_M_alt( M, SymR, R), true).

%
possible_ranking_0_for_M_alt(3, SR, R):-
%
   possible_ranking_0_for_3_alternatives( SR, R).

%
/*
possible_ranking_0_for_M_alt(8, SR, R):-
   possible_ranking_0_for_8_alternatives( SR, R).
%
*/

gen_possible_ranking_0_for_M_alt_if_not_exist( M,_):-
   \+ \+ clause( possible_ranking_0_for_M_alt( M, _, _), _).

gen_possible_ranking_0_for_M_alt_if_not_exist( M,A):-
   \+ clause( possible_ranking_0_for_M_alt( M, _, _), _),
   \+ var(M),
   M1 is M -1,
   last(Z,A),
   subtract( A, [Z], B),
   gen_possible_ranking_0_for_M_alt_if_not_exist( M1, B),
   forall(
    (
     possible_ranking_0_for_M_alt(M1, r(S), O),
     length(R,M),
     insert_nth_coordinate_and_shift(Pos,Z,O,R),
     L is M - Pos
   ),
     assert( possible_ranking_0_for_M_alt(M,r((S,L)),R))
   ).


/*

?- setup_K_alt_domain(7,L).

L = [a, b, c, d, e, f, g] 

Yes
?- possible_ranking_0( r(J), R).

J = (1, 4, 5, 6), 7
R = [g, f, e, d, a, b, c] 

Yes
?- 

*/

replace_nth_coordinate_and_shift(0,_,[],[],no).
replace_nth_coordinate_and_shift(K,X,[R|Q],[R|S],B):-
   replace_nth_coordinate_and_shift(K0,X,Q,S,B),
   (B=no->K=K0; K is K0 + 1).
replace_nth_coordinate_and_shift(K,X,[X|Q],[_|S],yes):-
   replace_nth_coordinate_and_shift(K0,X,Q,S,no),
   K is K0 + 1.

insert_nth_coordinate_and_shift(K,X,List1,List2):-
   append(A,B,List1),
   length(A,K),
   append(A,[X],C),
   append(C,B,List2).
  

possible_ranking( R, O):-
   possible_ranking_0( R, O),
   is_admissible( R).

:- dynamic  admissible_rankings/1.

admissible_rankings([r(1),r(2),r(3),r(4),r(5),r(6)]):-
   set_of_alternatives([_,_,_]).
admissible_rankings(A):-
   set_of_alternatives([_,_,_,_]),
   findall(r((J,K)),
    (
     member(J,[1,2,3,4,5,6]),
     member(K,[0,1,2,3])
    ),
   A).
admissible_rankings(A):-
   set_of_alternatives([_,_,_,_,_]),
   findall(r((J,K,L)),
    (
     member(J,[1,2,3,4,5,6]),
     member(K,[0,1,2,3]),
     member(L,[0,1,2,3,4])
    ),
   A).

is_admissible( R):-
   admissible_rankings(L),
   member( R, L).

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

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

possible_ranking_of( J, R, O):-
   agent(J),
   possible_ranking(R, O).


% the social choice function (SCF)
%-------------------------------------------------
% modified: 30 Apr 2006.  3-person
% modified: 19 May 2006.  n-person

% the domain 

profile_of_rankings( [R1,R2]):-
   set_of_agents([_,_]), %2-person,
   possible_ranking_of( 1, R1, _),
   possible_ranking_of( 2, R2, _).

profile_of_rankings( [R1,R2,R3]):-
   set_of_agents([_,_,_]), %3-person,
   possible_ranking_of( 1, R1, _),
   possible_ranking_of( 2, R2, _),
   possible_ranking_of( 3, R3, _).

profile_of_rankings( Rs):-
   set_of_agents(Is),
   length(Is,N), %n-person,
   N > 3,
   profile_of_rankings_0( Is,Rs).

profile_of_rankings_0( [],[]).
profile_of_rankings_0( [I|Is],[R|Rs]):-
   profile_of_rankings_0( Is,Rs),
   possible_ranking_of( I, R, _).


profile_of_rankings_in_tuple( Rn):-
   profile_of_rankings( LR),
   tuple_to_list(Rn,LR).

% added: 19 May 2006. tuple_to_list/3 with a specified list length. 

tuple_to_list(T,N,L):-
   tuple_to_list(T,L),
   length(L,N).

tuple_to_list(A,[A]).
tuple_to_list((A,T),[A|L]):-
   tuple_to_list(T,L).

all_profile_of_rankings(L):-
   findall(Rn,
     profile_of_rankings_in_tuple( Rn),
   L).

% a generic constructor

auto_scf( FL,Property):-
   all_profile_of_rankings( L),
   auto_scf( FL, L, Property).

% initial stage of recursions

auto_scf( [],[], _).

% scf without constraints

auto_scf( [R-> X | H], [R|Q], free):-
   auto_scf( H,Q,free),
   alternative( X).


% dictatorial scf

auto_scf( [R-> X | H], [R|Q], dictatorial(J)):-
   auto_scf( H,Q,dictatorial(J)),
   alternative(X),
   is_dictatorial_scf( [R->X|H], J).

% Pareto efficient scf

auto_scf( [R-> X | H], [R|Q], pareto):-
   auto_scf( H,Q,pareto),
   alternative(X),
   is_Pareto_efficient_at_profile( R->X).

% strategy-proof scf

auto_scf( [R-> X | H], [R|Q], sp):-
   auto_scf( H,Q,sp),
   alternative(X),
   \+ is_manipulable_at_profile( H, R->X,_,_),
   \+ (
     member(V, H),
     is_manipulable_at_profile( [R->X|H], V,R->X,_)
   ). 


% monotone scf

auto_scf( [R-> X | H], [R|Q], monotonic):-
   auto_scf( H,Q,monotonic),
   alternative(X),
   \+ is_non_monotonic_at_profile( H, R->X, _),  
   \+ (
     member(V, H),
     is_non_monotonic_at_profile( [R->X|H],V,R->X)
   ).

% explaining strategy-proof scf

auto_scf( [R-> X | H], [R|Q], sp1):-
   auto_scf( H,Q,sp1),
   alternative(X),
   counter_0(K),
   \+ (
     is_manipulable_at_profile( H, R->X,P,C)
     ,nl,write((K,'manipulable by',C,'into',P))
   ),
   \+ (
     member(V, H),
     is_manipulable_at_profile( [R->X|H], V,R->X,C)
     ,nl,write((K,'manipulable by ',C,'from',V))
   ),
   R=(r(A),r(B)),
   update_count(K1),nl,write((K1,A,B,X)).

/*

?- init_count.

Yes
?- init_count,tell_goal('sp.txt',forall,(auto_scf( FL,sp1),
(citizens_sovereignty(FL)->(nl,write(cs));(nl,write(ncs))),
show_scf_hr_1(FL))),
current_stream('sp.txt',write,B),close(B).

*/


% explaining strategy-proof scf

auto_scf( [R-> X | H], [R|Q], sp(Z)):-
   auto_scf( H,Q,sp(Y)),
   findall(X,(
   alternative(X),
   \+ (
     is_manipulable_at_profile( H, R->X,_,_)
   ),
   \+ (
     member(V, H),
     is_manipulable_at_profile( [R->X|H], V,R->X,_)
   )),
   Z),
   member(X,Z),(var(Y)->Y=[a,b,c];true),
   R=(r(A),r(B)),list_concat(Z,W),list_concat(Y,W1),
   update_count(K1),nl,write((K1,A,B,X,W,W1)).


% scf of simple majority (added: 21 Apr 2006)

auto_scf( [R-> X | H], [R|Q], majority):-
   auto_scf( H,Q,majority),
   is_simple_majority_decision( R->W),
   member(X,W).

auto_scf( [R-> W | H], [R|Q], majority_set):-
   auto_scf( H,Q,majority_set),
   is_simple_majority_decision( R->W).



% decision rule for simple majority 
%-------------------------------------------------
% added: 21-4,30 Apr 2006.
% modified: 19 May 2006.  n-person.
% modified: 29 Jun 2006.  SDF rule and utilizing mode parameters.

:- dynamic mode_of_simple_majority/2.

mode_of_simple_majority(condorcet, on).
mode_of_simple_majority(w-condorcet, off).
mode_of_simple_majority(s-ordering, off).
mode_of_simple_majority(choice-set, off).

set_mode_of_simple_majority(A->B):-
   mode_of_simple_majority(A, on),
   mode_of_simple_majority(B, off),
   retract(
     mode_of_simple_majority(A, on)
   ),
   retract(
     mode_of_simple_majority(B, off)
   ),
   assert(
     mode_of_simple_majority(B, on)
   ),
   assert(
     mode_of_simple_majority(A, off)
   ).

is_simple_majority_decision( Rn->WS):-
   collect_social_weak_preference_relations(Rn,L),
   findall(W,
      is_simple_majority_choice_on_mode( W,L),
   WS0),
   sort(WS0,WS).

% for md-SWF
is_simple_majority_choice_on_mode( W,L):-
   mode_of_simple_majority(condorcet,on),
   is_Condorcet_winner(W,L).
is_simple_majority_choice_on_mode( W,L):-
   mode_of_simple_majority(w-condorcet,on),
   is_weak_Condorcet_winner(W,L).
% for md-SWF
is_simple_majority_choice_on_mode( W,L):-
   mode_of_simple_majority(s-ordering,on),
   is_a_social_ordering(_,[W|_],L).
% for md-SDF
is_simple_majority_choice_on_mode( W,L):-
   mode_of_simple_majority(choice-set,on),
   is_a_rational_social_choice(_,[W|_],L).


%

collect_social_weak_preference_relations(Rn,L):-
   findall((X,Y),
    (
     distinct_ordered_pair((X,Y)),
     is_simple_majority_decision( Rn,(X,Y))
    ),
   L).

% majority-decision-SWF
% revised: 29 Jul 2006

is_Condorcet_winner(W,L):-
   alternative(W),
   \+ ( distinct_ordered_pair((X,W)),
     \+ member((W,X),L)
   ).

is_strict_Condorcet_winner(W,L):-
   alternative(W),
   \+ \+ member((W,_),L),
   \+ member((_,W),L).

is_strict_Condorcet_looser(D,L):-
   alternative(D),
   \+ \+ member((_,D),L),
   \+ member((D,_),L).

is_weak_Condorcet_winner(W,L):-
   is_strict_Condorcet_winner(W,L).
is_weak_Condorcet_winner(W,L):-
   \+ is_strict_Condorcet_winner(_,L),
   alternative(W),
   \+ is_strict_Condorcet_looser(W,L).

is_a_social_ordering(R,O,L):-
   possible_ranking_0(R, O),
   \+ (
     prefer_x_to_y_0(X,Y,R),
     \+ member((X,Y),L)
   ),
   \+ (
     member((X,Y),L),
     \+  prefer_x_to_y_0(X,Y,R)
   ).

is_a_rational_social_choice(_,[W],L):-
   \+ is_not_quasi_transitive(_,L),
   alternative(W),
   forall( member((Y,W),L),
    (
     member((W,Y),L)
    )
   ).

is_not_quasi_transitive((X,Y,Z),L):-
   member((X,Y),L),
   \+ member((Y,X),L),
   member((Y,Z),L),
%   Z\=X,
   \+ member((Z,Y),L),
   \+ member((X,Z),L),write('#q').

is_a_rational_social_choice_1(R,O,L):-
   possible_ranking_0(R, O),
   \+ (
     prefer_x_to_y_0(X,Y,R),
     \+ member((X,Y),L)
   ).

indifferent_pair_in_ballot((A,B),L):-
   member((A,B),L),
   member((B,A),L).

is_simple_majority_decision( Rn,(X,Y)):-
   set_of_agents(Soc),
   length( Soc, N),
   is_simple_majority_decision( N-person,Rn,(X,Y)).

is_simple_majority_decision( 2-person,(R1,R2),(X,Y)):-
   prefer_x_to_y( X, Y, R1), 
   prefer_x_to_y( X, Y, R2).
is_simple_majority_decision( 2-person,(R1,R2),(X,Y)):-
   prefer_x_to_y( X, Y, R1), 
   prefer_x_to_y( Y, X, R2).
is_simple_majority_decision( 2-person,(R1,R2),(Y,X)):-
   prefer_x_to_y( X, Y, R1), 
   prefer_x_to_y( Y, X, R2).

is_simple_majority_decision( 3-person,(R1,R2,R3),(X,Y)):-
   findall(1,
    (
     member(R, [R1,R2,R3]),
     prefer_x_to_y( X, Y, R)
    ),
   Poll),
   length(Poll,Nxy),
   length([R1,R2,R3],N),
   N =< 2* Nxy.

is_simple_majority_decision( N-person,Rn,(X,Y)):-
   set_of_agents(Is),
   length(Is,N),
   N >3,
   tuple_to_list(Rn,LR),
   findall(1,
    (
     member(R, LR),
     prefer_x_to_y( X, Y, R)
    ),
   Poll),
   length(Poll,Nxy),
   N =< 2* Nxy.


% rule of moderate (reasonable) decision
%-------------------------------------------------

is_moderate_decision((r(X),r(Y))->X):-
   set_of_agents([_,_]), %2-person,
   Taboo= [
     (1,4,a),
     (1,5,c),
     (4,5,b),
     (2,3,b),
     (2,6,a),
     (3,6,c)
   ],
   \+ (
     member((X,Y,Z),Taboo), 
     (
      member((r(X),r(Y))->Z,F)
      ;
      member((r(Y),r(X))->Z,F)
     )
   ). 


is_moderate_decision((r(_),r(_),_)->_):-
   \+ set_of_agents([_,_]),
   nl,
   write('under construction. 
     please edit the program file by yourself.'),
   read(y).


/*

?- auto_restricted_domain([A,B]),
auto_scf(M,majority),\+ member(_->intransitive,M),
nl, write(domin:[A,B]),show_scf(M),nl,fail.

domin:[r(1), r(2)]
col=r(#) [1, 2]
---------------------------
row=r(1) [a, a]
row=r(2) [a, a]

domin:[r(3), r(4)]
col=r(#) [3, 4]
---------------------------
row=r(3) [b, b]
row=r(4) [b, b]

domin:[r(5), r(6)]
col=r(#) [5, 6]
---------------------------
row=r(5) [c, c]
row=r(6) [c, c]

No
?-

?- profile_of_rankings([r(A),r(B),r(C)]),
is_simple_majority_decision( (r(A),r(B),r(C))->L).

A = 1
B = 1
C = 1
L = [a] 

Yes
?- profile_of_rankings([r(A),r(B),r(C)]),(A,B,C)=(6,6,6),
is_simple_majority_decision( (r(A),r(B),r(C))->L).

A = 6
B = 6
C = 6
L = [c] 

Yes
?- 

?- auto_scf( F,majority_set),member(A->[],F),nl,write(A),fail.

r(1), r(4), r(5)
r(1), r(5), r(4)
r(2), r(3), r(6)
r(2), r(6), r(3)
r(3), r(2), r(6)
r(3), r(6), r(2)
r(4), r(1), r(5)
r(4), r(5), r(1)
r(5), r(1), r(4)
r(5), r(4), r(1)
r(6), r(2), r(3)
r(6), r(3), r(2)

No
?- 

% n=3, the majority rule using is_a_social_ordering.

?- auto_restricted_domain(H),
\+ \+ (profile_of_rankings([r(A),r(B),r(C)]),
is_simple_majority_decision( (r(A),r(B),r(C))->[])),nl,write(H),fail.

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

No
?- auto_restricted_domain(H),
\+ \+ (profile_of_rankings([r(A),r(B),r(C)]),
is_simple_majority_decision( (r(A),r(B),r(C))->[_,_,_])),nl,write(H),fail.

No
?-

% n=3, the majority rule using is_weak_Condorcet_winner.

?- auto_restricted_domain(H),
\+ \+ (profile_of_rankings([r(A),r(B),r(C)]),
is_simple_majority_decision( (r(A),r(B),r(C))->[])),nl,write(H),fail.

No
?- auto_restricted_domain(H),
\+ \+ (profile_of_rankings([r(A),r(B),r(C)]),
is_simple_majority_decision( (r(A),r(B),r(C))->[_,_,_])),nl,write(H),fail.

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

No
?- 

*/

% no taboo alternative
%-------------------------------------------------
citizens_sovereignty(Scf):-
   forall(
     alternative(A), 
     member( _->A, Scf)
   ).

%  Pareto principle
%-------------------------------------------------
% modified: 30 Apr, 19 May 2006. n-person

is_Pareto_efficient_at_profile( (R1, R2)->Y):-  
   set_of_agents([_,_]),
   \+ (
     prefer_x_to_y( X, Y, R1), 
     prefer_x_to_y( X, Y, R2)
   ). 
is_Pareto_efficient_at_profile( (R1,R2,R3)->Y):-  
   set_of_agents([_,_,_]),
   \+ (
     alternative(X),
     forall(
       member(R,[R1,R2,R3]),
       prefer_x_to_y( X, Y, R)
     )
   ). 
is_Pareto_efficient_at_profile( Rn->Y):-  
   set_of_agents(Is),
   length(Is,N),
   N >3,
   tuple_to_list(Rn,LR),
   \+ (
     alternative(X),
     forall(
       member(R,LR),
       prefer_x_to_y( X, Y, R)
     )
   ). 


is_Pareto_efficient_scf( Scf):-
   forall(
     member( V, Scf),
     is_Pareto_efficient_at_profile( V)
   ).

%  dictatorship
%-------------------------------------------------
is_dictatorial_scf( Scf,J):-
   is_ranking_of(J,L,R),
   forall(
     member(L->X, Scf),
     \+ prefer_x_to_y( _,X, R)
   ).

is_non_dictatorial_scf( Scf):-  
   \+ is_dictatorial_scf( Scf, _).  

/*
is_non_dictatorial_scf( Scf):-
   agent(J),  
   is_dictatorial_scf( Scf,J),
   agent(J1),
   J1 \= J,  
   is_dictatorial_scf( Scf,J1).  
*/

is_ranking_of(1,(R,_),R):- set_of_agents([_,_]).
is_ranking_of(2,(_,R),R):- set_of_agents([_,_]).
is_ranking_of(1,(R,_,_),R):- set_of_agents([_,_,_]).
is_ranking_of(2,(_,R,_),R):- set_of_agents([_,_,_]).
is_ranking_of(3,(_,_,R),R):- set_of_agents([_,_,_]).


%  manipulability
%-------------------------------------------------
/*

% n=2.

is_manipulable_at_profile( Scf,(R,R2)->X,(Q,R2)->Y,1):-  
   set_of_agents([_,_]),
   member( (Q,R2)->Y, Scf),
   prefer_x_to_y( Y, X, R).
is_manipulable_at_profile( Scf,(R1,R)->X,(R1,Q)->Y,2):-  
   set_of_agents([_,_]),
   member( (R1,Q)->Y, Scf),
   prefer_x_to_y( Y, X, R).
*/


% n>= 2.

is_manipulable_at_profile( Scf,L->X,H->Y,J):-  
   set_of_agents(N),
   member( H->Y, Scf),
   same_profile_pair_except_for(J,N,(L,H),(R,_)),
   prefer_x_to_y( Y, X, R).

same_profile_pair_except_for(J,N,(L,H),(R,Q)):-
   member(J,N),
   sppxf(J,N,(L,H),(R,Q)).

sppxf(J,[J],(P,Q),(P,Q)).
sppxf(J,[K],((P),(P)),_):- J\=K.
sppxf(J,[J|N],((P,L),(Q,H)),(P,Q)):-
   sppxf(J,N,(L,H),(P,Q)).
sppxf(J,[K|N],((P,L),(P,H)),D):-
   J\=K,
   sppxf(J,N,(L,H),D).


is_strategy_proof_scf( Scf):-  
   is_non_manipulable_scf( Scf).  
is_non_manipulable_scf( Scf):-  
   forall(
     member( V, Scf),
     \+ is_manipulable_at_profile( Scf, V,_,_)
   ). 


/*

?- auto_scf( F,pareto),citizens_sovereignty(F),show_scf_hr_1(F),
((member(U,F),is_manipulable_at_profile(F,U,_,J))->A=m(J);A='sp').

scf: aaaaaaaaaaaaaabbabaabbbbaaabccaabbcc

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), (... ->...)|...]
U = r(3), r(5)->a
J = 1
A = m(1) ;

scf: aabaaaaaaaaaaabbabaabbbbaaabccaabbcc

F = [ (r(1), r(1)->a), (r(1), r(2)->a), (r(1), r(3)->b), (r(1), r(4)->a), (r(1), r(5)->a), (r(1), r(6)->a), (r(...), r(...)->a), (..., ... ->a), (... ->...)|...]
U = r(1), r(3)->b
J = 1
A = m(1) 

Yes
?- 

% n=3 (1 May 2006)

?- auto_scf( F,sp),citizens_sovereignty(F),show_scf(F),
nl,(is_dictatorial_scf(F,J)->write(d(J));true),
fail.

col=r(#) [1, 2, 3, 4, 5, 6]
---------------------------
row=r(1) [a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c]
row=r(2) [a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c]
row=r(3) [a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c]
row=r(4) [a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c]
row=r(5) [a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c]
row=r(6) [a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c, a, a, b, b, c, c]
d(3)
col=r(#) [1, 2, 3, 4, 5, 6]
---------------------------
row=r(1) [a, a, a, a, a, a, a, a, a, a, a, a, b, b, b, b, b, b, b, b, b, b, b, b, c, c, c, c, c, c, c, c, c, c, c, c]
row=r(2) [a, a, a, a, a, a, a, a, a, a, a, a, b, b, b, b, b, b, b, b, b, b, b, b, c, c, c, c, c, c, c, c, c, c, c, c]
row=r(3) [a, a, a, a, a, a, a, a, a, a, a, a, b, b, b, b, b, b, b, b, b, b, b, b, c, c, c, c, c, c, c, c, c, c, c, c]
row=r(4) [a, a, a, a, a, a, a, a, a, a, a, a, b, b, b, b, b, b, b, b, b, b, b, b, c, c, c, c, c, c, c, c, c, c, c, c]
row=r(5) [a, a, a, a, a, a, a, a, a, a, a, a, b, b, b, b, b, b, b, b, b, b, b, b, c, c, c, c, c, c, c, c, c, c, c, c]
row=r(6) [a, a, a, a, a, a, a, a, a, a, a, a, b, b, b, b, b, b, b, b, b, b, b, b, c, c, c, c, c, c, c, c, c, c, c, c]
d(2)
col=r(#) [1, 2, 3, 4, 5, 6]
---------------------------
row=r(1) [a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a]
row=r(2) [a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a]
row=r(3) [b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b]
row=r(4) [b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b]
row=r(5) [c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c]
row=r(6) [c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c]
d(1)

No
?-
*/

%  (Maskin) monotonicity
%-------------------------------------------------
preference_reversal( (R1,R2)->X, (Q1,Q2), (J,W)):-
   is_ranking_of(J,(R1,R2),R),
   is_ranking_of(J,(Q1,Q2),Q),
   prefer_x_to_y( X, W, R),
   prefer_x_to_y( W, X, Q).
is_non_monotonic_at_profile( Scf, R->X, Q->Y):-  
   member( Q->Y, Scf),
   Y \= X,
   \+ preference_reversal( R->X, Q, _).
is_monotonic_at_profile( Scf, R->X):-  
   \+ is_non_monotonic_at_profile( Scf, R->X, _).  
is_monotonic_scf( Scf):- 
   forall(
     member( V, Scf),
     is_monotonic_at_profile( Scf, V)
   ). 


%  displaying scf in tabular form
%-------------------------------------------------

show_scf(Scf):-
   nl,
   write('col=r(#) '),
   findall(K,possible_ranking(r(K),_),H),
   write(H),
   nl,
   length(I,27),
   forall(member(_,I),write('-')),
   forall(
    (
     bagof(C,
       B^member((A,B)->C, Scf),
     L)
    ),
    (
     nl,
     write(row=A),
     tab(1),
     write(L)
    )
   ).



/*
?- auto_scf( FL,free),show_scf(FL).

col=r(#) [1, 2, 3, 4, 5, 6]
---------------------------
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]

FL = [ (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), (... ->...)|...] 

Yes
?- auto_scf( FL,dictatorial(J)),
show_scf(FL),write(' dictator'=J),nl,fail.

col=r(#) [1, 2, 3, 4, 5, 6]
---------------------------
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] dictator=1

col=r(#) [1, 2, 3, 4, 5, 6]
---------------------------
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] dictator=2

No
?- 
*/


%  displaying scf in lines
%-------------------------------------------------

show_scf_hr(Scf):-
   show_scf_label(1,Scf),
   show_scf_label(2,Scf),
   show_scf_hr_1(Scf).

show_scf_label(1,Scf):-
   nl,
   write( 'i=1: '),
   forall(
     member((r(J),_)->_, Scf),
     write(J)
   ).
show_scf_label(2,Scf):-
   nl,
   write( 'i=2: '),
   forall(
     member((_,r(K))->_, Scf),
     write(K)
   ).

show_scf_hr_1(Scf):-
   nl,
   write( 'scf: '),
   forall(
     member(_->X, Scf),
     write(X)
   ).

show_scf_hr_0(Scf):-
   nl,
   write( 'scf: '),
   forall(
    (
     possible_ranking_0(R1,_),
     possible_ranking_0(R2,_)
    ),
    (
     member((R1,R2)->X, Scf)->
     write(X);write('-')
    )
   ).


show_scf_hr_0t(Scf):-
   nl,
   write( 'scf: '),
   show_scf_hr_0t_label,
   forall(
    (
     possible_ranking_0(R1,_)
    ),
    (
     nl,write(r1=R1),
     show_scf_hr_0t(R1,Scf)
    )
   ).

show_scf_hr_0t_label:-
   nl,tab(2),write('#r2: '),
   forall(
    (
     possible_ranking_0(r(K),_),
     possible_ranking_0(_,_)
    ),
    (
     write(K)
    )
   ),
   nl,tab(2),write('#r3: '),
   forall(
    (
     possible_ranking_0(_,_),
     possible_ranking_0(r(J),_)
    ),
    (
     write(J)
    )
   ).

show_scf_hr_0t(R1,Scf):-
   forall(
    (
     possible_ranking_0(R2,_),
     possible_ranking_0(R3,_)
    ),
    (
     member((R1,R2,R3)->X, Scf)->
     write(X);write('-')
    )
   ).

:- dynamic counter_0/1.

counter_0(0).
init_count:-
   abolish(counter_0/1),
   assert(counter_0(0)).
update_count(K):-
   retract(counter_0(J)),
   K is J+1,
   assert(counter_0(K)).

% list operation tool
%--------------------------------------------------
list_concat([],'').
list_concat([X|Y],S):-   
   list_concat(Y,S0),
   concat( X,S0,S).


% demo: a proof of Gibbard-Satterthwaite theorem
%-------------------------------------------------

/*
?- auto_scf( F,monotonic),
citizens_sovereignty(F),
show_scf(F),nl,fail.

col=r(#) [1, 2, 3, 4, 5, 6]
---------------------------
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]

col=r(#) [1, 2, 3, 4, 5, 6]
---------------------------
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]

No
?- auto_scf( F,sp),\+ is_monotonic_scf(F).

No
?- auto_scf( F,monotonic),member(U,F),
is_manipulable_at_profile(F,U,V,J).

No
?- auto_scf( F,monotonic),
citizens_sovereignty(F),
\+ is_Pareto_efficient_scf(F).

No
?- auto_scf( FL,sp),is_dictatorial_scf(FL,J),
nl,write([J]),fail.

[2][1]

No
?-

*/

% another representation of the proof
%-------------------------------------------------
/*

?- auto_scf( F,sp),show_scf_hr_1(F),
(is_strategy_proof_scf(F)->A=sp;A='-'),
(citizens_sovereignty(F)->B='cs';B='-'),
(is_dictatorial_scf(F,D)->C=d(D);C='-'),tab(1),write([A,B,C]),fail.

scf: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa [sp, -, -]
scf: aaaaaaaaaaaaaabbabaabbabaaaaaaaabbab [sp, -, -]
scf: aabbabaabbabaabbabaabbabaabbabaabbab [sp, -, -]
scf: aaaaaaaaaaaabbbbbbbbbbbbaaaaaabbbbbb [sp, -, -]
scf: aabbabaabbabbbbbbbbbbbbbaabbabbbbbbb [sp, -, -]
scf: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb [sp, -, -]
scf: aabbccaabbccaabbccaabbccaabbccaabbcc [sp, cs, d(2)]
scf: bbbbbbbcbbccbbbbbbbbbbbbbcbbccbcbbcc [sp, -, -]
scf: bcbbccbcbbccbcbbccbcbbccbcbbccbcbbcc [sp, -, -]
scf: aaaaaaaaaaaaaaaaaaaaacccaaacccaaaccc [sp, -, -]
scf: aaacccaaacccaaacccaaacccaaacccaaaccc [sp, -, -]
scf: aaaaaaaaaaaabbbbbbbbbbbbcccccccccccc [sp, cs, d(1)]
scf: bbbbbbccccccbbbbbbbbbbbbcccccccccccc [sp, -, -]
scf: bcbbccccccccbcbbccbcbbcccccccccccccc [sp, -, -]
scf: aaaaaaaaaaaaaaaaaacccccccccccccccccc [sp, -, -]
scf: aaacccaaacccaaaccccccccccccccccccccc [sp, -, -]
scf: cccccccccccccccccccccccccccccccccccc [sp, -, -]

No
?- 

?- auto_scf( FL,dictatorial(J)),show_scf_hr(FL),nl,fail.

i=1: 111111222222333333444444555555666666
i=2: 123456123456123456123456123456123456
scf: aaaaaaaaaaaabbbbbbbbbbbbcccccccccccc

i=1: 111111222222333333444444555555666666
i=2: 123456123456123456123456123456123456
scf: aabbccaabbccaabbccaabbccaabbccaabbcc

No
?- auto_scf(F,sp),citizens_sovereignty(F),
show_scf_hr_1(F),nl,fail.

scf: aabbccaabbccaabbccaabbccaabbccaabbcc
scf: aaaaaaaaaaaabbbbbbbbbbbbcccccccccccc

No
?- auto_scf( FL,sp),show_scf_hr_1(FL),fail.

scf: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
scf: aaaaaaaaaaaaaabbabaabbabaaaaaaaabbab
scf: aabbabaabbabaabbabaabbabaabbabaabbab
scf: aaaaaaaaaaaabbbbbbbbbbbbaaaaaabbbbbb
scf: aabbabaabbabbbbbbbbbbbbbaabbabbbbbbb
scf: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
scf: aabbccaabbccaabbccaabbccaabbccaabbcc
scf: bbbbbbbcbbccbbbbbbbbbbbbbcbbccbcbbcc
scf: bcbbccbcbbccbcbbccbcbbccbcbbccbcbbcc
scf: aaaaaaaaaaaaaaaaaaaaacccaaacccaaaccc
scf: aaacccaaacccaaacccaaacccaaacccaaaccc
scf: aaaaaaaaaaaabbbbbbbbbbbbcccccccccccc
scf: bbbbbbccccccbbbbbbbbbbbbcccccccccccc
scf: bcbbccccccccbcbbccbcbbcccccccccccccc
scf: aaaaaaaaaaaaaaaaaacccccccccccccccccc
scf: aaacccaaacccaaaccccccccccccccccccccc
scf: cccccccccccccccccccccccccccccccccccc

No
?- auto_scf( FL,sp),member(U,FL),
is_manipulable_at_profile(FL,U,V,J).

No
?- auto_scf( FL,monotonic),show_scf_hr_1(FL),fail.

scf: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
scf: aaaaaaaaaaaaaabbabaabbabaaaaaaaabbab
scf: aabbabaabbabaabbabaabbabaabbabaabbab
scf: aaaaaaaaaaaabbbbbbbbbbbbaaaaaabbbbbb
scf: aabbabaabbabbbbbbbbbbbbbaabbabbbbbbb
scf: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
scf: aabbccaabbccaabbccaabbccaabbccaabbcc
scf: bbbbbbbcbbccbbbbbbbbbbbbbcbbccbcbbcc
scf: bcbbccbcbbccbcbbccbcbbccbcbbccbcbbcc
scf: aaaaaaaaaaaaaaaaaaaaacccaaacccaaaccc
scf: aaacccaaacccaaacccaaacccaaacccaaaccc
scf: aaaaaaaaaaaabbbbbbbbbbbbcccccccccccc
scf: bbbbbbccccccbbbbbbbbbbbbcccccccccccc
scf: bcbbccccccccbcbbccbcbbcccccccccccccc
scf: aaaaaaaaaaaaaaaaaacccccccccccccccccc
scf: aaacccaaacccaaaccccccccccccccccccccc
scf: cccccccccccccccccccccccccccccccccccc

No

?- auto_scf( FL,monotonic),
    citizens_sovereignty(FL),
    show_scf_hr_1(FL),fail.

scf: aabbccaabbccaabbccaabbccaabbccaabbcc
scf: aaaaaaaaaaaabbbbbbbbbbbbcccccccccccc

No
?- auto_scf( FL,monotonic),member(U,FL),
is_manipulable_at_profile(FL,U,V,J).

No
?- 

*/


conditional_projection(_,[],[],[]).
conditional_projection((F,C,R),[R|Q],[R|S],[1|B]):-
   conditional_projection((F,C,_),Q,S,B),
   G=.. [F|C],
   G.
conditional_projection((F,C,R),[R|Q],[R|S],[0|B]):-
   conditional_projection((F,C,_),Q,S,B),
   G=.. [F|C],
   \+ G.

%-------------------------------------------------
% restricted domains
%-------------------------------------------------
% started: 1-4 Apr 2006

%closed under decisiveness implications

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

trivial_ordered_pair((X,Y)):-
   distinct_ordered_pair((X,Y)),
   \+ (
     prefer_x_to_y(X,Y,_),
     prefer_x_to_y(Y,X,_)
   ).

nontrivial_ordered_pair((X,Y)):-
   distinct_ordered_pair((X,Y)),
   \+ trivial_ordered_pair((X,Y)).

list_projection([],[],[]).
list_projection([R|Q],[R|S],[1|B]):-list_projection(Q,S,B).
list_projection(Q,[_|S],[0|B]):-list_projection(Q,S,B).


% the generating script.

% modified: 26 May 2006  separated 'without commitment' version.

auto_restricted_domain_without_commit(L):-
%   findall(S,possible_ranking_0(S,_),TR),
   all_possible_rankings_0(TR),
   list_projection(L,TR,_).

auto_restricted_domain(L):-
   auto_restricted_domain_without_commit(L),
   abolish(admissible_rankings/1),
   assert(admissible_rankings(L)).


% the Abello-Johnson's method
%-------------------------------------------------
% maximal consistent domain as chain of adjacent permutations
% added: 15 May 2006

antagonistic_ordering_pair((X,Y)):-
   antagonistic_ordering_pair((X,Y),_).

antagonistic_ordering_pair((X,Y),(O,P)):-
   possible_ranking_0( X, O),
   reverse(O, P),
   possible_ranking_0( Y, P).

adjacent_ordering_pair((X,Y)):-
   adjacent_ordering_pair((X,Y),_,_).

adjacent_ordering_pair((X,Y),(O,Q),(U,V)):-
   possible_ranking_0( X, O),
   append(A,[U,V|B],O),
   append(A,[V,U|B],Q),
   possible_ranking_0( Y, Q).

math_factorial(0,0).
math_factorial(1,1).
math_factorial(N,U):-
   integer(N),
   N > 1,
   N1 is N -1,
   math_factorial(N1,U1),
   U is N * U1.

auto_consistent_domain(L):-
   auto_chain_of_permutation_pairs( C),
   sort(C,L),
   abolish(admissible_rankings/1),
   assert(admissible_rankings(L)).

auto_chain_of_permutation_pairs( L):-
   maximal_reduced_decomposition(L,_).

maximal_reduced_decomposition(L,C):-
   mode_of_analysis(M-alternatives,_),
   math_factorial(M,U),
   length([_|I],U),
   append(L,_,I),
   antagonistic_ordering_pair((X,Y)),
   X @< Y,
   inversion_chain((X,Y),L,C).

chain_of_permutation_pairs_between((X,X),[X]).
chain_of_permutation_pairs_between((Z,Y),[Z|C]):-
   chain_of_permutation_pairs_between((X,Y),C),
   adjacent_ordering_pair((Z,X)),
   \+ member(Z,C).

inversion_chain((X,X),[X],[]).
inversion_chain((Z,Y),[Z|C],[(U,V)|W]):-
   inversion_chain((X,Y),C,W),
%   distinct_ordered_pair((U,V)),
   adjacent_ordering_pair((Z,X),_,(U,V)),
   \+ member(Z,C),
   \+ member((V,U),W),
   \+ member((U,V),W).


/*

?- [sproof_f], setup_K_alt_domain(3,_).
% sproof_f compiled 0.02 sec, 400 bytes

Yes
?- setup_K_alt_domain(3,_).

Yes
?- maximal_reduced_decomposition(L,U).

L = [r(1), r(3), r(4), r(6)]
U = [ (a, b), (a, c), (b, c)] ;

L = [r(1), r(2), r(5), r(6)]
U = [ (b, c), (a, c), (a, b)] ;

L = [r(2), r(1), r(3), r(4)]
U = [ (c, b), (a, b), (a, c)] ;

L = [r(2), r(5), r(6), r(4)]
U = [ (a, c), (a, b), (c, b)] ;

L = [r(3), r(1), r(2), r(5)]
U = [ (b, a), (b, c), (a, c)] ;

L = [r(3), r(4), r(6), r(5)]
U = [ (a, c), (b, c), (b, a)] ;

No
?- auto_consistent_domain(L).

L = [r(1), r(3), r(4), r(6)] ;

L = [r(1), r(2), r(5), r(6)] ;

L = [r(1), r(2), r(3), r(4)] ;

L = [r(2), r(4), r(5), r(6)] ;

L = [r(1), r(2), r(3), r(5)] ;

L = [r(3), r(4), r(5), r(6)] ;

No
?- 

?- setup_K_alt_domain(4,_).

Yes
?- auto_chain_of_permutation_pairs( L),
length(L,N),forall(member(X,L),(nl,possible_ranking_0(X,O),write(X:O))).

r((1, 4)):[d, a, b, c]
r((1, 3)):[a, d, b, c]
r((1, 2)):[a, b, d, c]
r((1, 1)):[a, b, c, d]
r((3, 1)):[b, a, c, d]
r((4, 1)):[b, c, a, d]
r((6, 1)):[c, b, a, d]

L = [r((1, 4)), r((1, 3)), r((1, 2)), r((1, 1)), r((3, 1)), r((4, 1)), r((6, 1))]
N = 7
X = _G165
O = _G169 

Yes
?- 

?- setup_K_alt_domain(5,_).

Yes
?- auto_chain_of_permutation_pairs( L),
length(L,N),forall(member(X,L),
(nl,possible_ranking_0(X,O),write(X:O))).

r((1, 4, 5)):[e, d, a, b, c]
r((1, 4, 4)):[d, e, a, b, c]
r((1, 4, 3)):[d, a, e, b, c]
r((1, 4, 2)):[d, a, b, e, c]
r((1, 4, 1)):[d, a, b, c, e]
r((1, 3, 1)):[a, d, b, c, e]
r((1, 2, 1)):[a, b, d, c, e]
r((1, 1, 1)):[a, b, c, d, e]
r((3, 1, 1)):[b, a, c, d, e]
r((4, 1, 1)):[b, c, a, d, e]
r((6, 1, 1)):[c, b, a, d, e]

L = [r((1, 4, 5)), r((1, 4, 4)), r((1, 4, 3)), r((1, 4, 2)), r((1, 4, 1)), r((1, 3, 1)), r((1, ..., ...)), r((..., ...)), r(...)|...]
N = 11
X = _G162
O = _G166 

Yes
?-

*/

%  generating value restricted domains
%-------------------------------------------------
% added: 18-22 May 2006

%auto_value_restricted_domain(L,TR):-
%value_restricted_domain_by_triples([],[],[]).
%==> moved into later part


auto_restricted_domain_with_filter(L):-
%   findall(S,possible_ranking_0(S,_),TR),
   all_possible_rankings_0(TR),
%(alternative 1: recursive but not decomposed by triples)
   auto_restricted_domain_with_filter_1(L,TR,_),
%(alternative 2: not recursive)
%   \+ violates_filter_on_auto_restricted_domain_1(L),
%   (involves_latin_square_0(L)->write(peke);true),
   abolish(admissible_rankings/1),
   assert(admissible_rankings(L)).

violates_filter_on_auto_restricted_domain_1(L):-
   larger_than_3_alternatives,
   length(L,N),
   N>=4,   
   member(J,[1,2,4,6]),
   \+ member(r((J,_)),L).

larger_than_3_alternatives:-
   set_of_alternatives(A),
   length(A,M),
   M > 3.

auto_restricted_domain_with_filter_1([],[],[]).
auto_restricted_domain_with_filter_1([X|L],[X|T],[1|W]):-
   auto_restricted_domain_with_filter_1(L,T,W),
   \+ involves_latin_square_for_triple([X|L],_).
%   length(L,N),
%   \+ (N>12,violates_filter_on_restricted_domain(L,N)).
auto_restricted_domain_with_filter_1(L,[_|T],[0|W]):-
   auto_restricted_domain_with_filter_1(L,T,W).


% generating latin squares
%-------------------------------------------------

:- dynamic latin_square_0/1,latin_square_0/3.
:- dynamic involving_latin_square_0/3.

latin_square_0([1,4,5]).
latin_square_0([2,3,6]).

involves_latin_square_for_triple(L,(X,Y,Z)):-
   triple_of_alternative((X,Y,Z)),
   findall(K,
    (
     member(R,L),
     relative_ranking_on_triple(R,(X,Y,Z),_,K)
    ),
   KL),
   sort(KL,KL1),
   latin_square_0(LS),
   subset(LS,KL1).

involves_latin_square_not_wise(L):-
   generate_if_no_latin_square(Alt,Soc),  % It's not wise.
   latin_square_0(Alt,Soc,LS),
   subset(LS,L).

generate_if_no_latin_square(Alt,Soc):-
   mode_of_analysis(Alt,Soc),
   \+ \+ clause( latin_square_0(Alt,Soc,_),_),
   !.
generate_if_no_latin_square(Alt,Soc):-
   mode_of_analysis(Alt,Soc),
%   \+ clause( latin_square_0(Alt,Soc,LS),_),
   forall(
    (
     involves_latin_square_0(_,_,(R,R1,R2)),
     sort([R,R1,R2],LS),
     \+ clause(latin_square_0(Alt,Soc,LS),_)
    ),
     assert(latin_square_0(Alt,Soc,LS))
   ).


involves_latin_square_0b(L):-
   involves_latin_square_0(_,_,(R,R1,R2)),
   subset([R,R1,R2],L).

% a very slow version.

involves_latin_square_0a([R|L]):-
   member(R1,L),
   R1 \= R,
   member(R2,L),
   R2 \= R,
   R2 \= R1,
   involves_latin_square_0(_,_,(R,R1,R2)).

involves_latin_square_0(type(1),(X,Y,Z),(R1,R2,R3)):-
   prefer_x_to_y_0(X,Y,R1),
   prefer_x_to_y_0(Y,Z,R1),
   prefer_x_to_y_0(Z,X,R2),
   prefer_x_to_y_0(Y,Z,R2),
   prefer_x_to_y_0(X,Y,R3),
   prefer_x_to_y_0(Z,X,R3).

involves_latin_square_0(type(2),(X,Y,Z),(R1,R2,R3)):-
   prefer_x_to_y_0(X,Z,R1),
   prefer_x_to_y_0(Z,Y,R1),
   prefer_x_to_y_0(Z,Y,R2),
   prefer_x_to_y_0(Y,X,R2),
   prefer_x_to_y_0(Y,X,R3),
   prefer_x_to_y_0(X,Z,R3).

/*
% for 3 alternatives.

% negligence.

?- auto_restricted_domain(L), 
\+ auto_restricted_domain_with_filter(L),nl,write(L),
findall(V,(member(V,[sp,sc,s2]),value_restriction(V)),P),
write(P),fail.

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

No
?- 
?- auto_restricted_domain_with_filter(H),
findall(V,value_restriction(V),[]).

No
?- auto_restricted_domain(H),
value_restriction(V),
involves_latin_square_0(H).

No
?- 

% for 4 alternatives and 3 length admissible rankings.

?- length(H,3),
auto_restricted_domain_with_filter(H),
findall(V,value_restriction(V),[]).

No
?- length(H,3),auto_restricted_domain(H),
value_restriction(V),
involves_latin_square_0(H).

No
?- 

?- mode_of_analysis(Alt,Soc),,B,C),L),length(L,N).
generate_if_no_latin_square(Alt,Soc).

Alt = 4-alternatives
Soc = 3-person 

Yes
?- findall(1,latin_square_0(4-_,3-_,_),L),length(L,N).

L = [1, 1, 1, 1, 1, 1, 1, 1, 1|...]
N = 392 

Yes
?-

*/


%  generating decomposable domains
%-------------------------------------------------
%  See Kalai and Muller(1977).
%  added: 30 Mar-1 Apr 2006 (about)

auto_cdi_domain(L,D,Tb):-
   auto_restricted_domain(L),
   nl,write(apply:L),
   \+ \+ is_cdi_pairs(D,Tb).

is_cdi_pairs(D,Tb):-
   findall(B,distinct_ordered_pair(B),Tb),
   ntr_projection(D,Tb,_),
   \+ violates_DI(_,_,D),
   is_nontrivial_and_consistent_cdi(D,Tb).

is_nontrivial_and_consistent_cdi(D,Tb):-
   D \=Tb,
   \+ \+ (
     member( NTR, D),
     nontrivial_ordered_pair(NTR)
   ),
   \+ circulate(_,D).

circulate((X,Y),D):-
   member((X,Y),D),member((Y,X),D).

circulate((X,Y),D):-
   member((X,Y),D),member((Y,Z),D),member((Z,X),D).

ntr_projection([],[],[]).
ntr_projection([R|Q],[R|S],[1|B]):-ntr_projection(Q,S,B).
ntr_projection(Q,[R|S],[0|B]):-ntr_projection(Q,S,B),
   \+ trivial_ordered_pair(R).

violates_DI(V,(X,Y,Z),L):-
   nontrivial_ordered_pair((X,Y)),
   nontrivial_ordered_pair((X,Z)),
   (violates_DI(I,(X,Y,Z),C,L)->V=(I,C);fail).

violates_DI(1, (X,Y,Z),[(R1,R2)],L):-
   possible_ranking(R1,[X,Y,Z]),
   possible_ranking(R2,[Y,Z,X]),
   violates_DI_1(_, (X,Y,Z),L).

violates_DI(2, (X,Y,Z),[R1], L):-
   possible_ranking(R1,[X,Y,Z]),
   violates_DI_2(_, (X,Y,Z),L).

violates_DI_1( a, (X,Y,Z),L):-
   member( (X,Y), L),
   \+ member( (X,Z), L).

violates_DI_1( b, (X,Y,Z),L):-
   member( (Z,X), L),
   \+ member( (Y,X), L).

violates_DI_2(a,(X,Y,Z),L):-
   member((X,Y),L),
   member((Y,Z),L),
   \+ member((X,Z),L).

violates_DI_2(b,(X,Y,Z),L):-
   member((Z,X),L),
   member((Y,X),L),
   member((Z,Y),L).

violates_DI_2(c,(X,Y,Z),L):-
   member((Z,X),L),
   \+ member((Y,X),L),
   \+ member((Z,Y),L).


test_cdi(1):-
   forall(
    (
     auto_restricted_domain(L),
     \+  (
       auto_scf( F,sp),
       citizens_sovereignty(F),
       is_non_dictatorial_scf(F)
     )
    ),
    (
     nl,write(L),
     (\+ \+ is_cdi_pairs(D,T)->write([cdi]);true),
     findall(B,nontrivial_ordered_pair(B),NTR),
     findall(B,trivial_ordered_pair(B),TR),
     nl,write(ntr:NTR),
     nl,write(tr:TR),
     forall(is_cdi_pairs(D,T),(nl,tab(1),write(D)))
    )
   ).

test_cdi(2):-
   forall(
    (
     auto_restricted_domain(L),
     \+ \+ (
       auto_scf( F,sp),
       citizens_sovereignty(F),
       is_non_dictatorial_scf(F)
     )
    ),
    (
     nl,write(L),
     (\+ \+ is_cdi_pairs(D,T)->write([cdi]);true),
     findall(B,nontrivial_ordered_pair(B),NTR),
     findall(B,trivial_ordered_pair(B),TR),
     nl,write(ntr:NTR),
     nl,write(tr:TR),
     forall(is_cdi_pairs(D,T),(nl,tab(1),write(D)))
    )
   ).


% a filter for moderate decision scfs
%-------------------------------------------------
% added: 20-25 Apr 2006 (about)

is_moderate_scf(F):-
   Taboo= [
     (1,4,a),
     (1,5,c),
     (4,5,b),
     (2,3,b),
     (2,6,a),
     (3,6,c)
   ],
   \+ (
     member((X,Y,Z),Taboo), 
     (
      member((r(X),r(Y))->Z,F)
      ;
      member((r(Y),r(X))->Z,F)
     )
   ). 


% demos for restricted domain
%-------------------------------------------------

/*

?- auto_restricted_domain(Rq),
forall(possible_ranking(R,_),write(R)).
r(1)r(2)r(3)r(4)r(5)r(6)

Rq = [r(1), r(2), r(3), r(4), r(5), r(6)]
R = _G162 ;
r(2)r(3)r(4)r(5)r(6)

Rq = [r(2), r(3), r(4), r(5), r(6)]
R = _G162 

Yes
?- auto_scf( F,sp),citizens_sovereignty(F),
show_scf_hr(F),nl,fail.

i=1: 2222233333444445555566666
i=2: 2345623456234562345623456
scf: aaaaabbbbbbbbbbcccccccccc

i=1: 2222233333444445555566666
i=2: 2345623456234562345623456
scf: abbccabbccabbccabbccabbcc

No
?- auto_scf( F,sp),show_scf_hr_1(F),
(is_strategy_proof_scf(F)->A=sp;A='-'),
(citizens_sovereignty(F)->B='cs';B='-'),
(is_dictatorial_scf(F,D)->C=d(D);C='-'),tab(1),write([A,B,C]),fail.

scf: aaaaaaaaaaaaaaaaaaaaaaaaa [sp, -, -]
scf: aaaaaabbababbabaaaaaabbab [sp, -, -]
scf: abbababbababbababbababbab [sp, -, -]
scf: aaaaabbbbbbbbbbaaaaabbbbb [sp, -, -]
scf: abbabbbbbbbbbbbabbabbbbbb [sp, -, -]
scf: bbbbbbbbbbbbbbbbbbbbbbbbb [sp, -, -]
scf: abbccabbccabbccabbccabbcc [sp, cs, d(2)]
scf: abbccbbbbbbbbbbcbbcccbbcc [sp, cs, -]
scf: cbbccbbbbbbbbbbcbbcccbbcc [sp, -, -]
scf: abbccabbcccbbcccbbcccbbcc [sp, cs, -]
scf: cbbcccbbcccbbcccbbcccbbcc [sp, -, -]
scf: aaaaaaaaaaaacccaacccaaccc [sp, -, -]
scf: aacccaacccaacccaacccaaccc [sp, -, -]
scf: aaaaabbbbbbbbbbcccccccccc [sp, cs, d(1)]
scf: aacccbbbbbbbbbbcccccccccc [sp, cs, -]
scf: cccccbbbbbbbbbbcccccccccc [sp, -, -]
scf: aacccabbcccbbcccccccccccc [sp, cs, -]
scf: ccccccbbcccbbcccccccccccc [sp, -, -]
scf: aaaaaaaaaaccccccccccccccc [sp, -, -]
scf: aacccaacccccccccccccccccc [sp, -, -]
scf: ccccccccccccccccccccccccc [sp, -, -]

No
?- auto_scf( F,dictatorial(J)),show_scf_hr(F),nl,fail.

i=1: 2222233333444445555566666
i=2: 2345623456234562345623456
scf: aaaaabbbbbbbbbbcccccccccc

i=1: 2222233333444445555566666
i=2: 2345623456234562345623456
scf: abbccabbccabbccabbccabbcc

No
?- 


?- auto_restricted_domain(L),
   \+ (auto_cdi_domain_1(D,T),D\=[],D\=T),
nl,write(apply:L),fail.

apply:[r(1), r(2), r(3), r(4), r(5), r(6)]
apply:[r(1)]
apply:[r(2)]
apply:[r(3)]
apply:[r(4)]
apply:[r(5)]
apply:[r(6)]
apply:[]

No
?- 
?- auto_restricted_domain(L),\+ (auto_scf( F,sp),
citizens_sovereignty(F),is_non_dictatorial_scf(F)),
nl,write(L),(\+ \+ is_cdi_pairs(D,T)->write([cdi]);fail),fail.

[r(1), r(2), r(3), r(4), r(5), r(6)]
[r(1), r(2), r(3), r(4)][cdi]
[r(1), r(2), r(3)]
[r(1), r(2), r(5), r(6)][cdi]
[r(1), r(2), r(5)]
[r(1), r(2)]
[r(1), r(3), r(4)]
[r(1), r(3)]
[r(1), r(4)]
[r(1), r(5)]
[r(1)]
[r(2), r(3)]
[r(2), r(5), r(6)]
[r(2), r(5)]
[r(2), r(6)]
[r(2)]
[r(3), r(4), r(5), r(6)][cdi]
[r(3), r(4), r(6)]
[r(3), r(4)]
[r(3), r(6)]
[r(3)]
[r(4), r(5), r(6)]
[r(4), r(5)]
[r(4), r(6)]
[r(4)]
[r(5), r(6)]
[r(5)]
[r(6)]
[]

No
?- 
?- auto_restricted_domain(L),\+ \+ (auto_scf( F,sp),
citizens_sovereignty(F),is_non_dictatorial_scf(F)),
nl,write(L),(\+ \+ is_cdi_pairs(D,T)->write([cdi]);fail),fail.

[r(1), r(2), r(3), r(4), r(5)][cdi]
[r(1), r(2), r(3), r(4), r(6)][cdi]
[r(1), r(2), r(3), r(5), r(6)][cdi]
[r(1), r(2), r(3), r(5)][cdi]
[r(1), r(2), r(3), r(6)][cdi]
[r(1), r(2), r(4), r(5), r(6)][cdi]
[r(1), r(2), r(4), r(5)][cdi]
[r(1), r(2), r(4), r(6)][cdi]
[r(1), r(2), r(4)][cdi]
[r(1), r(2), r(6)][cdi]
[r(1), r(3), r(4), r(5), r(6)][cdi]
[r(1), r(3), r(4), r(5)][cdi]
[r(1), r(3), r(4), r(6)][cdi]
[r(1), r(3), r(5), r(6)][cdi]
[r(1), r(3), r(5)][cdi]
[r(1), r(3), r(6)][cdi]
[r(1), r(4), r(5), r(6)][cdi]
[r(1), r(4), r(5)][cdi]
[r(1), r(4), r(6)][cdi]
[r(1), r(5), r(6)][cdi]
[r(1), r(6)][cdi]
[r(2), r(3), r(4), r(5), r(6)][cdi]
[r(2), r(3), r(4), r(5)][cdi]
[r(2), r(3), r(4), r(6)][cdi]
[r(2), r(3), r(4)][cdi]
[r(2), r(3), r(5), r(6)][cdi]
[r(2), r(3), r(5)][cdi]
[r(2), r(3), r(6)][cdi]
[r(2), r(4), r(5), r(6)][cdi]
[r(2), r(4), r(5)][cdi]
[r(2), r(4), r(6)][cdi]
[r(2), r(4)][cdi]
[r(3), r(4), r(5)][cdi]
[r(3), r(5), r(6)][cdi]
[r(3), r(5)][cdi]

No
?- 

% proof of Lemma 4 in Kelly and Muller (1977).

?- auto_restricted_domain(L),\+ \+ (auto_scf( F,sp),
citizens_sovereignty(F),is_non_dictatorial_scf(F)),
is_cdi_pairs(D,T),member(X,T),\+ member(X,D),
\+ (
is_cdi_pairs(D1,T),subtract(D1,[X|D],[])).

No
?- auto_restricted_domain(L),\+ (auto_scf( F,sp),
citizens_sovereignty(F),is_non_dictatorial_scf(F)),
is_cdi_pairs(D,T),member(X,T),\+ member(X,D),
\+ (
is_cdi_pairs(D1,T),subtract(D1,[X|D],[])).

No
?-

% The inheritance relationship of NDNM scfs in permissible domain
% added: 23 Apr 2006.

?- auto_restricted_domain(L),length(L,5), (auto_scf( F,sp),
citizens_sovereignty(F),is_non_dictatorial_scf(F)),
show_scf_hr_1(F),write(L),fail.

scf: aabbaaabbabbbbbbbbbbaabbc[r(1), r(2), r(3), r(4), r(5)]
scf: aabbaaabbaaabbaaabbcaabbc[r(1), r(2), r(3), r(4), r(5)]
scf: aaaaaaaaaabbbbbbbbbbaaacc[r(1), r(2), r(3), r(4), r(5)]
scf: aaaaaaaaaaaabbaaabbcaaacc[r(1), r(2), r(3), r(4), r(5)]
scf: aaaaaaaaaaaabbbaabbbaabbc[r(1), r(2), r(3), r(4), r(6)]
scf: aabbbaabbcaabbbaabbbaabbc[r(1), r(2), r(3), r(4), r(6)]
scf: aaaaaaaaaabbbbbbbbbbbcbbc[r(1), r(2), r(3), r(4), r(6)]
scf: aabbbaabbcbbbbbbbbbbbcbbc[r(1), r(2), r(3), r(4), r(6)]
scf: aaaaaaaaaaaababaaaccaabcc[r(1), r(2), r(3), r(5), r(6)]
scf: aaaccaaaccaabccaaaccaabcc[r(1), r(2), r(3), r(5), r(6)]
scf: aaaaaaaaaaaababcccccccccc[r(1), r(2), r(3), r(5), r(6)]
scf: aaaccaaaccaabcccccccccccc[r(1), r(2), r(3), r(5), r(6)]
scf: aaaaaaaaaaaabccaacccaaccc[r(1), r(2), r(4), r(5), r(6)]
scf: aabccaacccaabccaacccaaccc[r(1), r(2), r(4), r(5), r(6)]
scf: aaaaaaaaaabcbcccccccccccc[r(1), r(2), r(4), r(5), r(6)]
scf: aabccaacccbcbcccccccccccc[r(1), r(2), r(4), r(5), r(6)]
scf: abbabbbbbbbbbbbabbccbbbcc[r(1), r(3), r(4), r(5), r(6)]
scf: abbccbbbccbbbccabbccbbbcc[r(1), r(3), r(4), r(5), r(6)]
scf: abbabbbbbbbbbbbcccccccccc[r(1), r(3), r(4), r(5), r(6)]
scf: abbccbbbccbbbcccccccccccc[r(1), r(3), r(4), r(5), r(6)]
scf: abbccbbbbbbbbbbcbbcccbbcc[r(2), r(3), r(4), r(5), r(6)]
scf: abbccabbcccbbcccbbcccbbcc[r(2), r(3), r(4), r(5), r(6)]
scf: aacccbbbbbbbbbbcccccccccc[r(2), r(3), r(4), r(5), r(6)]
scf: aacccabbcccbbcccccccccccc[r(2), r(3), r(4), r(5), r(6)]

No
?- 

% NDNM domain-scf pairs which does not has a basis in 5 rankings NDNM.
% (basis=The maximal domains where the smaller NMDM scf can be embedded.)

?- findall((U,G), (
auto_restricted_domain(U),length(U,5), (auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G))),
SL),
auto_restricted_domain(L),length(L,N),N<5, (auto_scf( F,sp),
citizens_sovereignty(F),is_non_dictatorial_scf(F)),
\+ (member((U,G),SL),subset(L,U),subset(F,G)),)),
show_scf_hr_1(F),write(L),fail.

scf: aaaaaaaaaabcaabc[r(1), r(2), r(4), r(6)]
scf: aaaaaaaabcbcbcbc[r(1), r(2), r(4), r(6)]
scf: aabcaabcbcbcbcbc[r(1), r(2), r(4), r(6)]
scf: aaaaaaaaaabbaacc[r(1), r(2), r(4), r(6)]
scf: aabbaaccaabbaacc[r(1), r(2), r(4), r(6)]
scf: aabbaaccbbbbcccc[r(1), r(2), r(4), r(6)]
scf: aabaacbbb[r(1), r(2), r(4)]
scf: aabaabbcb[r(1), r(2), r(4)]
scf: aacaacbcc[r(1), r(2), r(6)]
scf: aabaacccc[r(1), r(2), r(6)]
scf: abababababccabcc[r(1), r(3), r(5), r(6)]
scf: aaaabbbbaaccbbcc[r(1), r(3), r(5), r(6)]
scf: aaccbbccaaccbbcc[r(1), r(3), r(5), r(6)]
scf: ababababcccccccc[r(1), r(3), r(5), r(6)]
scf: abccabcccccccccc[r(1), r(3), r(5), r(6)]
scf: aaccbbcccccccccc[r(1), r(3), r(5), r(6)]
scf: aacbbcaac[r(1), r(3), r(5)]
scf: abaabaccc[r(1), r(3), r(5)]
scf: abcabcccc[r(1), r(3), r(5)]
scf: aacbbcccc[r(1), r(3), r(5)]
scf: aacbbcbbc[r(1), r(3), r(6)]
scf: abbabbccc[r(1), r(3), r(6)]
scf: abcabcccc[r(1), r(3), r(6)]
scf: aacbbcccc[r(1), r(3), r(6)]
scf: ababbcabc[r(1), r(4), r(5)]
scf: ababbbacc[r(1), r(4), r(5)]
scf: abaabcacc[r(1), r(4), r(5)]
scf: aaabbcacc[r(1), r(4), r(5)]
scf: ababbcacc[r(1), r(4), r(5)]
scf: abcbbcacc[r(1), r(4), r(5)]
scf: ababbcccc[r(1), r(4), r(5)]
scf: aaaabcabc[r(1), r(4), r(6)]
scf: aaabbcbbc[r(1), r(4), r(6)]
scf: aaaabbacc[r(1), r(4), r(6)]
scf: abbabbacc[r(1), r(4), r(6)]
scf: aabaccacc[r(1), r(5), r(6)]
scf: aaaaccbcc[r(1), r(5), r(6)]
scf: abbcbbbbbbbbabbc[r(2), r(3), r(4), r(5)]
scf: abbabbbbbbbbcbbc[r(2), r(3), r(4), r(5)]
scf: abbaabbacbbccbbc[r(2), r(3), r(4), r(5)]
scf: aaccbbbbbbbbaacc[r(2), r(3), r(4), r(5)]
scf: aaccabbcabbcaacc[r(2), r(3), r(4), r(5)]
scf: aaaaabbacbbccccc[r(2), r(3), r(4), r(5)]
scf: aacabbabb[r(2), r(3), r(4)]
scf: aaaabbcbb[r(2), r(3), r(4)]
scf: aacbbbaac[r(2), r(3), r(5)]
scf: abcbbbabc[r(2), r(3), r(5)]
scf: abaabacbc[r(2), r(3), r(5)]
scf: ababbbcbc[r(2), r(3), r(5)]
scf: aacabbabc[r(2), r(3), r(6)]
scf: aaaabbcbc[r(2), r(3), r(6)]
scf: aacabbcbc[r(2), r(3), r(6)]
scf: abcabbcbc[r(2), r(3), r(6)]
scf: aacbbbcbc[r(2), r(3), r(6)]
scf: aacabccbc[r(2), r(3), r(6)]
scf: aacabbccc[r(2), r(3), r(6)]
scf: abcbbbabc[r(2), r(4), r(5)]
scf: ababbbcbc[r(2), r(4), r(5)]
scf: abacbccbc[r(2), r(4), r(5)]
scf: accbbbacc[r(2), r(4), r(5)]
scf: aaaabcabc[r(2), r(4), r(6)]
scf: aaacbccbc[r(2), r(4), r(6)]
scf: aaaabbacc[r(2), r(4), r(6)]
scf: accabbacc[r(2), r(4), r(6)]
scf: bbcbbcacc[r(3), r(4), r(5)]
scf: bbabbcccc[r(3), r(4), r(5)]
scf: bbbaccbcc[r(3), r(5), r(6)]
scf: babbccbcc[r(3), r(5), r(6)]

No
?-

% NDNM domain-scf pairs of 2 rankings which has a basis in 5 rankings NDNM.

?- findall((U,G), (
auto_restricted_domain(U),length(U,5), (auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G))),
SL),
auto_restricted_domain(L),length(L,N),N=2, (auto_scf( F,sp),
citizens_sovereignty(F),is_non_dictatorial_scf(F)),
\+ \+ (member((U,G),SL),subset(L,U),subset(F,G)),
show_scf_hr_1(F),write(L),fail.

scf: abac[r(1), r(6)]
scf: aabc[r(1), r(6)]
scf: abbc[r(1), r(6)]
scf: acbc[r(1), r(6)]
scf: abcc[r(1), r(6)]
scf: acab[r(2), r(4)]
scf: acbb[r(2), r(4)]
scf: aacb[r(2), r(4)]
scf: abcb[r(2), r(4)]
scf: accb[r(2), r(4)]
scf: baac[r(3), r(5)]
scf: bbac[r(3), r(5)]
scf: bcac[r(3), r(5)]
scf: babc[r(3), r(5)]
scf: bacc[r(3), r(5)]

No
?- 

% The maximal NDNM basis for each 2 rankings NDNM is near unique.

?- findall((K,U,G), (auto_restricted_domain(U),length(U,K), (auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G))),
SL),length(SL,N),nl,write(N:scf_and_domains),
member((2,L,F),SL),show_scf_hr_0(F),write(L),write(2),
member((5,U,G),SL),subset(L,U),subset(F,G),
show_scf_hr_0(G),write(U),write(5),
fail.

290:scf_and_domains
scf: a----b------------------------a----c[r(1), r(6)]2
scf: aabb-baabb-caabb-baabb-b------aabb-c[r(1), r(2), r(3), r(4), r(6)]5
scf: a----a------------------------b----c[r(1), r(6)]2
scf: aaaa-aaaaa-abbbb-bbbbb-b------bcbb-c[r(1), r(2), r(3), r(4), r(6)]5
scf: a----b------------------------b----c[r(1), r(6)]2
scf: aabb-baabb-cbbbb-bbbbb-b------bcbb-c[r(1), r(2), r(3), r(4), r(6)]5
scf: a-bbab------b-bbbbb-bbbba-bbccb-bbcc[r(1), r(3), r(4), r(5), r(6)]5
scf: a----c------------------------b----c[r(1), r(6)]2
scf: a-bbcc------b-bbccb-bbcca-bbccb-bbcc[r(1), r(3), r(4), r(5), r(6)]5
scf: a----b------------------------c----c[r(1), r(6)]2
scf: a-bbab------b-bbbbb-bbbbc-ccccc-cccc[r(1), r(3), r(4), r(5), r(6)]5
scf: -------a-c---------a-b--------------[r(2), r(4)]2
scf: aa-bccaa-ccc------aa-bccaa-cccaa-ccc[r(1), r(2), r(4), r(5), r(6)]5
scf: -------a-c---------b-b--------------[r(2), r(4)]2
scf: -------aaccc-bbbbb-bbbbb-ccccc-ccccc[r(2), r(3), r(4), r(5), r(6)]5
scf: -------a-a---------c-b--------------[r(2), r(4)]2
scf: aa-aaaaa-aaa------bc-bcccc-ccccc-ccc[r(1), r(2), r(4), r(5), r(6)]5
scf: -------a-b---------c-b--------------[r(2), r(4)]2
scf: -------abbcc-abbcc-cbbcc-cbbcc-cbbcc[r(2), r(3), r(4), r(5), r(6)]5
scf: -------a-c---------c-b--------------[r(2), r(4)]2
scf: aa-bccaa-ccc------bc-bcccc-ccccc-ccc[r(1), r(2), r(4), r(5), r(6)]5
scf: -------aaccc-abbcc-cbbcc-ccccc-ccccc[r(2), r(3), r(4), r(5), r(6)]5
scf: --------------b-a---------a-c-------[r(3), r(5)]2
scf: aaaaa-aaaaa-aabba-aabbc-aaacc-------[r(1), r(2), r(3), r(4), r(5)]5
scf: aaa-aaaaa-aaaab-ab------aaa-ccaab-cc[r(1), r(2), r(3), r(5), r(6)]5
scf: --------------b-b---------a-c-------[r(3), r(5)]2
scf: aaaaa-aaaaa-bbbbb-bbbbb-aaacc-------[r(1), r(2), r(3), r(4), r(5)]5
scf: --------------b-c---------a-c-------[r(3), r(5)]2
scf: aaa-ccaaa-ccaab-cc------aaa-ccaab-cc[r(1), r(2), r(3), r(5), r(6)]5
scf: --------------b-a---------b-c-------[r(3), r(5)]2
scf: aabba-aabba-aabba-aabbc-aabbc-------[r(1), r(2), r(3), r(4), r(5)]5
scf: --------------b-a---------c-c-------[r(3), r(5)]2
scf: aaa-aaaaa-aaaab-ab------ccc-ccccc-cc[r(1), r(2), r(3), r(5), r(6)]5

No
?-


% NDNM pairs which has two or more basis in 5 rankings NDNM.

?- findall((U,G), (auto_restricted_domain(U),length(U,5), (auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G))),
SL),
auto_restricted_domain(L),length(L,N),N<5, (auto_scf( F,sp),
citizens_sovereignty(F),is_non_dictatorial_scf(F)),
findall((U,G), (member((U,G),SL),subset(L,U),subset(F,G)),Par),
length(Par,K),K>1,show_scf_hr_1(F),write(L),write(K),fail.

scf: aaaaaaaaaabaaaac[r(1), r(2), r(3), r(5)]2
scf: aaaaaaaaaabbaabc[r(1), r(2), r(3), r(6)]2
scf: aaaaaaaaaabcaacc[r(1), r(2), r(4), r(5)]2
scf: abbabbbbbbbbabbc[r(1), r(3), r(4), r(5)]2
scf: abbbbbbbbbbbbbbc[r(1), r(3), r(4), r(6)]2
scf: aaaabaaac[r(1), r(3), r(5)]2
scf: ababbbabc[r(1), r(3), r(5)]2
scf: aaaabbabc[r(1), r(3), r(6)]2
scf: abbbbbbbc[r(1), r(3), r(6)]2
scf: abccbbcccccccccc[r(1), r(4), r(5), r(6)]2
scf: ababbbabc[r(1), r(4), r(5)]2
scf: aaaabcacc[r(1), r(4), r(5)]2
scf: abcbbcccc[r(1), r(4), r(5)]2
scf: abbbbbbbc[r(1), r(4), r(6)]2
scf: abcbbcccc[r(1), r(4), r(6)]2
scf: abbc[r(1), r(6)]2
scf: abbcbbbbbbbbcbbc[r(2), r(3), r(4), r(6)]2
scf: aaccabcccccccccc[r(2), r(3), r(5), r(6)]2
scf: aaaabaaac[r(2), r(3), r(5)]2
scf: aacabcccc[r(2), r(3), r(5)]2
scf: aaaabbabc[r(2), r(3), r(6)]2
scf: abcbbbcbc[r(2), r(3), r(6)]2
scf: aacabcccc[r(2), r(3), r(6)]2
scf: accccbcccccccccc[r(2), r(4), r(5), r(6)]2
scf: aaaabcacc[r(2), r(4), r(5)]2
scf: acccbcccc[r(2), r(4), r(5)]2
scf: abcbbbcbc[r(2), r(4), r(6)]2
scf: acccbcccc[r(2), r(4), r(6)]2
scf: accb[r(2), r(4)]2
scf: baac[r(3), r(5)]2

No
?- 

% NDNM pairs which has two or more basis in 5 rankings NDNM.
% showing the parents.

?- findall((U,G), (auto_restricted_domain(U),length(U,5), (auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G))),
SL),
auto_restricted_domain(L),length(L,N),N<5, (auto_scf( F,sp),
citizens_sovereignty(F),is_non_dictatorial_scf(F)),
findall(D, (member((U,G),SL),subset(L,U),subset(F,G),subtract(U,L,D)),Par),
length(Par,K),K>1,show_scf_hr_1(F),write(L),write(Par),fail.

scf: aaaaaaaaaabaaaac[r(1), r(2), r(3), r(5)][[r(4)], [r(6)]]
scf: aaaaaaaaaabbaabc[r(1), r(2), r(3), r(6)][[r(4)], [r(5)]]
scf: aaaaaaaaaabcaacc[r(1), r(2), r(4), r(5)][[r(3)], [r(6)]]
scf: abbabbbbbbbbabbc[r(1), r(3), r(4), r(5)][[r(2)], [r(6)]]
scf: abbbbbbbbbbbbbbc[r(1), r(3), r(4), r(6)][[r(2)], [r(5)]]
scf: aaaabaaac[r(1), r(3), r(5)][[r(2), r(4)], [r(2), r(6)]]
scf: ababbbabc[r(1), r(3), r(5)][[r(2), r(4)], [r(4), r(6)]]
scf: aaaabbabc[r(1), r(3), r(6)][[r(2), r(4)], [r(2), r(5)]]
scf: abbbbbbbc[r(1), r(3), r(6)][[r(2), r(4)], [r(4), r(5)]]
scf: abccbbcccccccccc[r(1), r(4), r(5), r(6)][[r(2)], [r(3)]]
scf: ababbbabc[r(1), r(4), r(5)][[r(2), r(3)], [r(3), r(6)]]
scf: aaaabcacc[r(1), r(4), r(5)][[r(2), r(3)], [r(2), r(6)]]
scf: abcbbcccc[r(1), r(4), r(5)][[r(2), r(6)], [r(3), r(6)]]
scf: abbbbbbbc[r(1), r(4), r(6)][[r(2), r(3)], [r(3), r(5)]]
scf: abcbbcccc[r(1), r(4), r(6)][[r(2), r(5)], [r(3), r(5)]]
scf: abbc[r(1), r(6)][[r(2), r(3), r(4)], [r(3), r(4), r(5)]]
scf: abbcbbbbbbbbcbbc[r(2), r(3), r(4), r(6)][[r(1)], [r(5)]]
scf: aaccabcccccccccc[r(2), r(3), r(5), r(6)][[r(1)], [r(4)]]
scf: aaaabaaac[r(2), r(3), r(5)][[r(1), r(4)], [r(1), r(6)]]
scf: aacabcccc[r(2), r(3), r(5)][[r(1), r(6)], [r(4), r(6)]]
scf: aaaabbabc[r(2), r(3), r(6)][[r(1), r(4)], [r(1), r(5)]]
scf: abcbbbcbc[r(2), r(3), r(6)][[r(1), r(4)], [r(4), r(5)]]
scf: aacabcccc[r(2), r(3), r(6)][[r(1), r(5)], [r(4), r(5)]]
scf: accccbcccccccccc[r(2), r(4), r(5), r(6)][[r(1)], [r(3)]]
scf: aaaabcacc[r(2), r(4), r(5)][[r(1), r(3)], [r(1), r(6)]]
scf: acccbcccc[r(2), r(4), r(5)][[r(1), r(6)], [r(3), r(6)]]
scf: abcbbbcbc[r(2), r(4), r(6)][[r(1), r(3)], [r(3), r(5)]]
scf: acccbcccc[r(2), r(4), r(6)][[r(1), r(5)], [r(3), r(5)]]
scf: accb[r(2), r(4)][[r(1), r(5), r(6)], [r(3), r(5), r(6)]]
scf: baac[r(3), r(5)][[r(1), r(2), r(4)], [r(1), r(2), r(6)]]

No
?- 

% NDNM basis:
% The maximal domains where the smaller NMDM scf can be embedded.

?- findall((K,U,G), (auto_restricted_domain(U),length(U,K), (auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G))),
SL),length(SL,N),nl,write(N:scf_and_domains),
member((K,L,F),SL),\+ (member((_,U,G),SL),G\=F,subset(L,U),subset(F,G)),
show_scf_hr_1(F),write(L),write(K),fail.

290:scf_and_domains
scf: aabbaaabbabbbbbbbbbbaabbc[r(1), r(2), r(3), r(4), r(5)]5
scf: aabbaaabbaaabbaaabbcaabbc[r(1), r(2), r(3), r(4), r(5)]5
scf: aaaaaaaaaabbbbbbbbbbaaacc[r(1), r(2), r(3), r(4), r(5)]5
scf: aaaaaaaaaaaabbaaabbcaaacc[r(1), r(2), r(3), r(4), r(5)]5
scf: aaaaaaaaaaaabbbaabbbaabbc[r(1), r(2), r(3), r(4), r(6)]5
scf: aabbbaabbcaabbbaabbbaabbc[r(1), r(2), r(3), r(4), r(6)]5
scf: aaaaaaaaaabbbbbbbbbbbcbbc[r(1), r(2), r(3), r(4), r(6)]5
scf: aabbbaabbcbbbbbbbbbbbcbbc[r(1), r(2), r(3), r(4), r(6)]5
scf: aaaaaaaaaaaababaaaccaabcc[r(1), r(2), r(3), r(5), r(6)]5
scf: aaaccaaaccaabccaaaccaabcc[r(1), r(2), r(3), r(5), r(6)]5
scf: aaaaaaaaaaaababcccccccccc[r(1), r(2), r(3), r(5), r(6)]5
scf: aaaccaaaccaabcccccccccccc[r(1), r(2), r(3), r(5), r(6)]5
scf: aaaaaaaaaaaabccaacccaaccc[r(1), r(2), r(4), r(5), r(6)]5
scf: aabccaacccaabccaacccaaccc[r(1), r(2), r(4), r(5), r(6)]5
scf: aaaaaaaaaabcbcccccccccccc[r(1), r(2), r(4), r(5), r(6)]5
scf: aabccaacccbcbcccccccccccc[r(1), r(2), r(4), r(5), r(6)]5
scf: aaaaaaaaaabcaabc[r(1), r(2), r(4), r(6)]4
scf: aaaaaaaabcbcbcbc[r(1), r(2), r(4), r(6)]4
scf: aabcaabcbcbcbcbc[r(1), r(2), r(4), r(6)]4
scf: aaaaaaaaaabbaacc[r(1), r(2), r(4), r(6)]4
scf: aabbaaccaabbaacc[r(1), r(2), r(4), r(6)]4
scf: aabbaaccbbbbcccc[r(1), r(2), r(4), r(6)]4
scf: abbabbbbbbbbbbbabbccbbbcc[r(1), r(3), r(4), r(5), r(6)]5
scf: abbccbbbccbbbccabbccbbbcc[r(1), r(3), r(4), r(5), r(6)]5
scf: abbabbbbbbbbbbbcccccccccc[r(1), r(3), r(4), r(5), r(6)]5
scf: abbccbbbccbbbcccccccccccc[r(1), r(3), r(4), r(5), r(6)]5
scf: abababababccabcc[r(1), r(3), r(5), r(6)]4
scf: aaaabbbbaaccbbcc[r(1), r(3), r(5), r(6)]4
scf: aaccbbccaaccbbcc[r(1), r(3), r(5), r(6)]4
scf: ababababcccccccc[r(1), r(3), r(5), r(6)]4
scf: abccabcccccccccc[r(1), r(3), r(5), r(6)]4
scf: aaccbbcccccccccc[r(1), r(3), r(5), r(6)]4
scf: ababbcabc[r(1), r(4), r(5)]3
scf: ababbbacc[r(1), r(4), r(5)]3
scf: abaabcacc[r(1), r(4), r(5)]3
scf: aaabbcacc[r(1), r(4), r(5)]3
scf: ababbcacc[r(1), r(4), r(5)]3
scf: abcbbcacc[r(1), r(4), r(5)]3
scf: ababbcccc[r(1), r(4), r(5)]3
scf: abbccbbbbbbbbbbcbbcccbbcc[r(2), r(3), r(4), r(5), r(6)]5
scf: abbccabbcccbbcccbbcccbbcc[r(2), r(3), r(4), r(5), r(6)]5
scf: aacccbbbbbbbbbbcccccccccc[r(2), r(3), r(4), r(5), r(6)]5
scf: aacccabbcccbbcccccccccccc[r(2), r(3), r(4), r(5), r(6)]5
scf: abbcbbbbbbbbabbc[r(2), r(3), r(4), r(5)]4
scf: abbabbbbbbbbcbbc[r(2), r(3), r(4), r(5)]4
scf: abbaabbacbbccbbc[r(2), r(3), r(4), r(5)]4
scf: aaccbbbbbbbbaacc[r(2), r(3), r(4), r(5)]4
scf: aaccabbcabbcaacc[r(2), r(3), r(4), r(5)]4
scf: aaaaabbacbbccccc[r(2), r(3), r(4), r(5)]4
scf: aacabbabc[r(2), r(3), r(6)]3
scf: aaaabbcbc[r(2), r(3), r(6)]3
scf: aacabbcbc[r(2), r(3), r(6)]3
scf: abcabbcbc[r(2), r(3), r(6)]3
scf: aacbbbcbc[r(2), r(3), r(6)]3
scf: aacabccbc[r(2), r(3), r(6)]3
scf: aacabbccc[r(2), r(3), r(6)]3

No
?-

% NDNM basis:
% another display for all logically possible profiles

?- findall((K,U,G), (auto_restricted_domain(U),length(U,K), (auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G))),
SL),length(SL,N),nl,write(N:scf_and_domains),findall((K,L,F),(
member((K,L,F),SL),\+ (member((_,U,G),SL),G\=F,subset(L,U),subset(F,G))),BL),member((K,L,F),BL),
show_scf_hr_0(F),write(L),write(K),fail.

290:scf_and_domains
scf: aabba-aabba-bbbbb-bbbbb-aabbc-------[r(1), r(2), r(3), r(4), r(5)]5
scf: aabba-aabba-aabba-aabbc-aabbc-------[r(1), r(2), r(3), r(4), r(5)]5
scf: aaaaa-aaaaa-bbbbb-bbbbb-aaacc-------[r(1), r(2), r(3), r(4), r(5)]5
scf: aaaaa-aaaaa-aabba-aabbc-aaacc-------[r(1), r(2), r(3), r(4), r(5)]5
scf: aaaa-aaaaa-aaabb-baabb-b------aabb-c[r(1), r(2), r(3), r(4), r(6)]5
scf: aabb-baabb-caabb-baabb-b------aabb-c[r(1), r(2), r(3), r(4), r(6)]5
scf: aaaa-aaaaa-abbbb-bbbbb-b------bcbb-c[r(1), r(2), r(3), r(4), r(6)]5
scf: aabb-baabb-cbbbb-bbbbb-b------bcbb-c[r(1), r(2), r(3), r(4), r(6)]5
scf: aaa-aaaaa-aaaab-ab------aaa-ccaab-cc[r(1), r(2), r(3), r(5), r(6)]5
scf: aaa-ccaaa-ccaab-cc------aaa-ccaab-cc[r(1), r(2), r(3), r(5), r(6)]5
scf: aaa-aaaaa-aaaab-ab------ccc-ccccc-cc[r(1), r(2), r(3), r(5), r(6)]5
scf: aaa-ccaaa-ccaab-cc------ccc-ccccc-cc[r(1), r(2), r(3), r(5), r(6)]5
scf: aa-aaaaa-aaa------aa-bccaa-cccaa-ccc[r(1), r(2), r(4), r(5), r(6)]5
scf: aa-bccaa-ccc------aa-bccaa-cccaa-ccc[r(1), r(2), r(4), r(5), r(6)]5
scf: aa-aaaaa-aaa------bc-bcccc-ccccc-ccc[r(1), r(2), r(4), r(5), r(6)]5
scf: aa-bccaa-ccc------bc-bcccc-ccccc-ccc[r(1), r(2), r(4), r(5), r(6)]5
scf: aa-a-aaa-a-a------aa-b-c------aa-b-c[r(1), r(2), r(4), r(6)]4
scf: aa-a-aaa-a-a------bc-b-c------bc-b-c[r(1), r(2), r(4), r(6)]4
scf: aa-b-caa-b-c------bc-b-c------bc-b-c[r(1), r(2), r(4), r(6)]4
scf: aa-a-aaa-a-a------aa-b-b------aa-c-c[r(1), r(2), r(4), r(6)]4
scf: aa-b-baa-c-c------aa-b-b------aa-c-c[r(1), r(2), r(4), r(6)]4
scf: aa-b-baa-c-c------bb-b-b------cc-c-c[r(1), r(2), r(4), r(6)]4
scf: a-bbab------b-bbbbb-bbbba-bbccb-bbcc[r(1), r(3), r(4), r(5), r(6)]5
scf: a-bbcc------b-bbccb-bbcca-bbccb-bbcc[r(1), r(3), r(4), r(5), r(6)]5
scf: a-bbab------b-bbbbb-bbbbc-ccccc-cccc[r(1), r(3), r(4), r(5), r(6)]5
scf: a-bbcc------b-bbccb-bbccc-ccccc-cccc[r(1), r(3), r(4), r(5), r(6)]5
scf: a-b-ab------a-b-ab------a-b-cca-b-cc[r(1), r(3), r(5), r(6)]4
scf: a-a-aa------b-b-bb------a-a-ccb-b-cc[r(1), r(3), r(5), r(6)]4
scf: a-a-cc------b-b-cc------a-a-ccb-b-cc[r(1), r(3), r(5), r(6)]4
scf: a-b-ab------a-b-ab------c-c-ccc-c-cc[r(1), r(3), r(5), r(6)]4
scf: a-b-cc------a-b-cc------c-c-ccc-c-cc[r(1), r(3), r(5), r(6)]4
scf: a-a-cc------b-b-cc------c-c-ccc-c-cc[r(1), r(3), r(5), r(6)]4
scf: a--ba-------------b--bc-a--bc-------[r(1), r(4), r(5)]3
scf: a--ba-------------b--bb-a--cc-------[r(1), r(4), r(5)]3
scf: a--ba-------------a--bc-a--cc-------[r(1), r(4), r(5)]3
scf: a--aa-------------b--bc-a--cc-------[r(1), r(4), r(5)]3
scf: a--ba-------------b--bc-a--cc-------[r(1), r(4), r(5)]3
scf: a--bc-------------b--bc-a--cc-------[r(1), r(4), r(5)]3
scf: a--ba-------------b--bc-c--cc-------[r(1), r(4), r(5)]3
scf: -------abbcc-bbbbb-bbbbb-cbbcc-cbbcc[r(2), r(3), r(4), r(5), r(6)]5
scf: -------abbcc-abbcc-cbbcc-cbbcc-cbbcc[r(2), r(3), r(4), r(5), r(6)]5
scf: -------aaccc-bbbbb-bbbbb-ccccc-ccccc[r(2), r(3), r(4), r(5), r(6)]5
scf: -------aaccc-abbcc-cbbcc-ccccc-ccccc[r(2), r(3), r(4), r(5), r(6)]5
scf: -------abbc--bbbb--bbbb--abbc-------[r(2), r(3), r(4), r(5)]4
scf: -------abba--bbbb--bbbb--cbbc-------[r(2), r(3), r(4), r(5)]4
scf: -------abba--abba--cbbc--cbbc-------[r(2), r(3), r(4), r(5)]4
scf: -------aacc--bbbb--bbbb--aacc-------[r(2), r(3), r(4), r(5)]4
scf: -------aacc--abbc--abbc--aacc-------[r(2), r(3), r(4), r(5)]4
scf: -------aaaa--abba--cbbc--cccc-------[r(2), r(3), r(4), r(5)]4
scf: -------aa--c-ab--b-------------ab--c[r(2), r(3), r(6)]3
scf: -------aa--a-ab--b-------------cb--c[r(2), r(3), r(6)]3
scf: -------aa--c-ab--b-------------cb--c[r(2), r(3), r(6)]3
scf: -------ab--c-ab--b-------------cb--c[r(2), r(3), r(6)]3
scf: -------aa--c-bb--b-------------cb--c[r(2), r(3), r(6)]3
scf: -------aa--c-ab--c-------------cb--c[r(2), r(3), r(6)]3
scf: -------aa--c-ab--b-------------cc--c[r(2), r(3), r(6)]3

No
?-

% There are relatively few moderate basis NDNMs.   

?- findall((K,U,G), (auto_restricted_domain(U),length(U,K), (auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G))),
SL),length(SL,N),nl,write(N:scf_and_domains),findall((K,L,F),(
member((K,L,F),SL),\+ (member((_,U,G),SL),G\=F,subset(L,U),subset(F,G))),BL),
member((K,L,F),BL),is_moderate_scf(F),
show_scf_hr_0(F),write(L),write(K),fail.

290:scf_and_domains
scf: aa-b-caa-b-c------bc-b-c------bc-b-c[r(1), r(2), r(4), r(6)]4
scf: aa-b-baa-c-c------bb-b-b------cc-c-c[r(1), r(2), r(4), r(6)]4
scf: a-b-ab------a-b-ab------a-b-cca-b-cc[r(1), r(3), r(5), r(6)]4
scf: a-a-aa------b-b-bb------a-a-ccb-b-cc[r(1), r(3), r(5), r(6)]4
scf: a--ba-------------b--bc-a--cc-------[r(1), r(4), r(5)]3
scf: -------aacc--abbc--abbc--aacc-------[r(2), r(3), r(4), r(5)]4
scf: -------aaaa--abba--cbbc--cccc-------[r(2), r(3), r(4), r(5)]4
scf: -------aa--c-ab--b-------------cb--c[r(2), r(3), r(6)]3

No
?- 

% Other moderate (non)basis NDNMs at level 4.   

?- findall((K,U,G), (auto_restricted_domain(U),length(U,K), (auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G))),
SL),member((K,L,F),SL),K=4,is_moderate_scf(F),
show_scf_hr_0(F),write(L),write(K),fail.

scf: aaa-a-aaa-a-aab-a-------aaa-c-------[r(1), r(2), r(3), r(5)]4
scf: aa-b-baa-b-c------bb-b-b------bc-b-c[r(1), r(2), r(4), r(6)]4
scf: aa-b-caa-b-c------bc-b-c------bc-b-c[r(1), r(2), r(4), r(6)]4
scf: aa-b-baa-c-c------bb-b-b------cc-c-c[r(1), r(2), r(4), r(6)]4
scf: aa-b-caa-c-c------bc-b-c------cc-c-c[r(1), r(2), r(4), r(6)]4
scf: a-bb-b------b-bb-bb-bb-b------b-bb-c[r(1), r(3), r(4), r(6)]4
scf: a-a-aa------a-b-ab------a-a-cca-b-cc[r(1), r(3), r(5), r(6)]4
scf: a-b-ab------a-b-ab------a-b-cca-b-cc[r(1), r(3), r(5), r(6)]4
scf: a-a-aa------b-b-bb------a-a-ccb-b-cc[r(1), r(3), r(5), r(6)]4
scf: a-b-ab------b-b-bb------a-b-ccb-b-cc[r(1), r(3), r(5), r(6)]4
scf: -------aaaa--abba--abbc--aacc-------[r(2), r(3), r(4), r(5)]4
scf: -------aacc--abbc--abbc--aacc-------[r(2), r(3), r(4), r(5)]4
scf: -------aaaa--abba--cbbc--cccc-------[r(2), r(3), r(4), r(5)]4
scf: -------aacc--abbc--cbbc--cccc-------[r(2), r(3), r(4), r(5)]4
scf: -------a-ccc-------c-bcc-c-ccc-c-ccc[r(2), r(4), r(5), r(6)]4

No
?- 
% simple majority rule for permissible NDNM domains:

% Some of them are NDNM. 
% But there are lot of non-NDNM simple majority SCFs.


% Q. Every NDNM for two rankings domain can be a simple majority rule?
% A. Yes.

?- auto_restricted_domain(U),length(U,2),auto_scf(F,sp),
citizens_sovereignty(F),is_non_dictatorial_scf(F),
(auto_scf(F,majority)->M=1;M=0),
show_scf_hr_0(F),write(U),write(2:M),fail.

scf: a----b------------------------a----c[r(1), r(6)]2:1
scf: a----a------------------------b----c[r(1), r(6)]2:1
scf: a----b------------------------b----c[r(1), r(6)]2:1
scf: a----c------------------------b----c[r(1), r(6)]2:1
scf: a----b------------------------c----c[r(1), r(6)]2:1
scf: -------a-c---------a-b--------------[r(2), r(4)]2:1
scf: -------a-c---------b-b--------------[r(2), r(4)]2:1
scf: -------a-a---------c-b--------------[r(2), r(4)]2:1
scf: -------a-b---------c-b--------------[r(2), r(4)]2:1
scf: -------a-c---------c-b--------------[r(2), r(4)]2:1
scf: --------------b-a---------a-c-------[r(3), r(5)]2:1
scf: --------------b-b---------a-c-------[r(3), r(5)]2:1
scf: --------------b-c---------a-c-------[r(3), r(5)]2:1
scf: --------------b-a---------b-c-------[r(3), r(5)]2:1
scf: --------------b-a---------c-c-------[r(3), r(5)]2:1

No
?- 

% Q. Every simple majority rule is nonmanipulable at K=2 ?
% A. No.

?- auto_restricted_domain(U),length(U,2),auto_scf(F,majority),
is_non_manipulable_scf(F),
show_scf_hr_0(F).

scf: aa----aa----------------------------

U = [r(1), r(2)]
F = [ (r(1), r(1)->a), (r(1), r(2)->a), (r(2), r(1)->a), (r(2), r(2)->a)] 

Yes
?- auto_restricted_domain(U),length(U,2),auto_scf(F,majority),
\+ is_non_manipulable_scf(F),
show_scf_hr_0(F).

scf: ab----aa----------------------------

U = [r(1), r(2)]
F = [ (r(1), r(1)->a), (r(1), r(2)->b), (r(2), r(1)->a), (r(2), r(2)->a)] 

Yes
?- 


% Q. Is there a simple majority decision SCF in the set of NDNM pairs ?
% A. Yes.
% For example, at K=5 as shown below, every NDNM scf is a simple majority SCF.

?- findall((M,K,U,G), (auto_restricted_domain(U),length(U,K), auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G),(auto_scf(G,majority)->M=1;M=0)),
SL),length(SL,N),nl,write(N:scf_and_domains),member((M,K,L,F),SL),K=5,
show_scf_hr_0(F),write(L:K:M),fail.

290:scf_and_domains
scf: aabba-aabba-bbbbb-bbbbb-aabbc-------[r(1), r(2), r(3), r(4), r(5)]:5:1
scf: aabba-aabba-aabba-aabbc-aabbc-------[r(1), r(2), r(3), r(4), r(5)]:5:1
scf: aaaaa-aaaaa-bbbbb-bbbbb-aaacc-------[r(1), r(2), r(3), r(4), r(5)]:5:1
scf: aaaaa-aaaaa-aabba-aabbc-aaacc-------[r(1), r(2), r(3), r(4), r(5)]:5:1
scf: aaaa-aaaaa-aaabb-baabb-b------aabb-c[r(1), r(2), r(3), r(4), r(6)]:5:1
scf: aabb-baabb-caabb-baabb-b------aabb-c[r(1), r(2), r(3), r(4), r(6)]:5:1
scf: aaaa-aaaaa-abbbb-bbbbb-b------bcbb-c[r(1), r(2), r(3), r(4), r(6)]:5:1
scf: aabb-baabb-cbbbb-bbbbb-b------bcbb-c[r(1), r(2), r(3), r(4), r(6)]:5:1
scf: aaa-aaaaa-aaaab-ab------aaa-ccaab-cc[r(1), r(2), r(3), r(5), r(6)]:5:1
scf: aaa-ccaaa-ccaab-cc------aaa-ccaab-cc[r(1), r(2), r(3), r(5), r(6)]:5:1
scf: aaa-aaaaa-aaaab-ab------ccc-ccccc-cc[r(1), r(2), r(3), r(5), r(6)]:5:1
scf: aaa-ccaaa-ccaab-cc------ccc-ccccc-cc[r(1), r(2), r(3), r(5), r(6)]:5:1
scf: aa-aaaaa-aaa------aa-bccaa-cccaa-ccc[r(1), r(2), r(4), r(5), r(6)]:5:1
scf: aa-bccaa-ccc------aa-bccaa-cccaa-ccc[r(1), r(2), r(4), r(5), r(6)]:5:1
scf: aa-aaaaa-aaa------bc-bcccc-ccccc-ccc[r(1), r(2), r(4), r(5), r(6)]:5:1
scf: aa-bccaa-ccc------bc-bcccc-ccccc-ccc[r(1), r(2), r(4), r(5), r(6)]:5:1
scf: a-bbab------b-bbbbb-bbbba-bbccb-bbcc[r(1), r(3), r(4), r(5), r(6)]:5:1
scf: a-bbcc------b-bbccb-bbcca-bbccb-bbcc[r(1), r(3), r(4), r(5), r(6)]:5:1
scf: a-bbab------b-bbbbb-bbbbc-ccccc-cccc[r(1), r(3), r(4), r(5), r(6)]:5:1
scf: a-bbcc------b-bbccb-bbccc-ccccc-cccc[r(1), r(3), r(4), r(5), r(6)]:5:1
scf: -------abbcc-bbbbb-bbbbb-cbbcc-cbbcc[r(2), r(3), r(4), r(5), r(6)]:5:1
scf: -------abbcc-abbcc-cbbcc-cbbcc-cbbcc[r(2), r(3), r(4), r(5), r(6)]:5:1
scf: -------aaccc-bbbbb-bbbbb-ccccc-ccccc[r(2), r(3), r(4), r(5), r(6)]:5:1
scf: -------aaccc-abbcc-cbbcc-ccccc-ccccc[r(2), r(3), r(4), r(5), r(6)]:5:1

No
?-

% And I show the cases of NDNM basis for K=3.

?- findall((M,K,U,G), (auto_restricted_domain(U),length(U,K), auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G),(auto_scf(G,majority)->M=1;M=0)),
SL),length(SL,N),nl,write(N:scf_and_domains),
member((M,K,L,F),SL),K=3,
\+ (member((_,_,U,G),SL),G\=F,subset(L,U),subset(F,G)),
show_scf_hr_0(F),write(L),write(K:M),fail.

290:scf_and_domains
scf: a--ba-------------b--bc-a--bc-------[r(1), r(4), r(5)]3:1
scf: a--ba-------------b--bb-a--cc-------[r(1), r(4), r(5)]3:1
scf: a--ba-------------a--bc-a--cc-------[r(1), r(4), r(5)]3:1
scf: a--aa-------------b--bc-a--cc-------[r(1), r(4), r(5)]3:1
scf: a--ba-------------b--bc-a--cc-------[r(1), r(4), r(5)]3:1
scf: a--bc-------------b--bc-a--cc-------[r(1), r(4), r(5)]3:1
scf: a--ba-------------b--bc-c--cc-------[r(1), r(4), r(5)]3:1
scf: -------aa--c-ab--b-------------ab--c[r(2), r(3), r(6)]3:1
scf: -------aa--a-ab--b-------------cb--c[r(2), r(3), r(6)]3:1
scf: -------aa--c-ab--b-------------cb--c[r(2), r(3), r(6)]3:1
scf: -------ab--c-ab--b-------------cb--c[r(2), r(3), r(6)]3:1
scf: -------aa--c-bb--b-------------cb--c[r(2), r(3), r(6)]3:1
scf: -------aa--c-ab--c-------------cb--c[r(2), r(3), r(6)]3:1
scf: -------aa--c-ab--b-------------cc--c[r(2), r(3), r(6)]3:1

No
?- 


% Q. Is there a non simple majority decision SCF (intransitivity) 
% in the set of NDNM pairs ?
% A. No.


?- auto_restricted_domain(U),length(U,K), auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G),\+ auto_scf(G,majority).

No
?-

% embedding (non-maximal) 3 rankings NDNM scfs 
% into 5 rankings (maximal) NDMS scfs.

?- findall((K,U,G), (auto_restricted_domain(U),length(U,K), (auto_scf( G,sp),
citizens_sovereignty(G),is_non_dictatorial_scf(G))),
SL),length(SL,N),nl,write(N:scf_and_domains),member(L,[[r(1),r(4),r(5)],[r(2),r(3),r(6)]]),3,L,F),SL),show_scf_hr_0(F),write(L),write(2),
member((3,L,F),SL),show_scf_hr_0(F),write(L),write(2),
member((5,U,G),SL),subset(L,U),subset(F,G),
show_scf_hr_0(G),write(U),write(5),fail.

290:scf_and_domains
scf: a--ba-------------b--bb-a--bc-------[r(1), r(4), r(5)]2
scf: aabba-aabba-bbbbb-bbbbb-aabbc-------[r(1), r(2), r(3), r(4), r(5)]5
scf: a-bbab------b-bbbbb-bbbba-bbccb-bbcc[r(1), r(3), r(4), r(5), r(6)]5
scf: a--ba-------------a--bc-a--bc-------[r(1), r(4), r(5)]2
scf: aabba-aabba-aabba-aabbc-aabbc-------[r(1), r(2), r(3), r(4), r(5)]5
scf: a--ba-------------b--bc-a--bc-------[r(1), r(4), r(5)]2
scf: a--bc-------------b--bc-a--bc-------[r(1), r(4), r(5)]2
scf: a-bbcc------b-bbccb-bbcca-bbccb-bbcc[r(1), r(3), r(4), r(5), r(6)]5
scf: a--aa-------------b--bb-a--cc-------[r(1), r(4), r(5)]2
scf: aaaaa-aaaaa-bbbbb-bbbbb-aaacc-------[r(1), r(2), r(3), r(4), r(5)]5
scf: a--ba-------------b--bb-a--cc-------[r(1), r(4), r(5)]2
scf: a--aa-------------a--bc-a--cc-------[r(1), r(4), r(5)]2
scf: aaaaa-aaaaa-aabba-aabbc-aaacc-------[r(1), r(2), r(3), r(4), r(5)]5
scf: aa-aaaaa-aaa------aa-bccaa-cccaa-ccc[r(1), r(2), r(4), r(5), r(6)]5
scf: a--ba-------------a--bc-a--cc-------[r(1), r(4), r(5)]2
scf: a--bc-------------a--bc-a--cc-------[r(1), r(4), r(5)]2
scf: aa-bccaa-ccc------aa-bccaa-cccaa-ccc[r(1), r(2), r(4), r(5), r(6)]5
scf: a--aa-------------b--bc-a--cc-------[r(1), r(4), r(5)]2
scf: a--ba-------------b--bc-a--cc-------[r(1), r(4), r(5)]2
scf: a--bc-------------b--bc-a--cc-------[r(1), r(4), r(5)]2
scf: a--ba-------------b--bb-c--cc-------[r(1), r(4), r(5)]2
scf: a-bbab------b-bbbbb-bbbbc-ccccc-cccc[r(1), r(3), r(4), r(5), r(6)]5
scf: a--aa-------------b--bc-c--cc-------[r(1), r(4), r(5)]2
scf: aa-aaaaa-aaa------bc-bcccc-ccccc-ccc[r(1), r(2), r(4), r(5), r(6)]5
scf: a--ba-------------b--bc-c--cc-------[r(1), r(4), r(5)]2
scf: a--bc-------------b--bc-c--cc-------[r(1), r(4), r(5)]2
scf: aa-bccaa-ccc------bc-bcccc-ccccc-ccc[r(1), r(2), r(4), r(5), r(6)]5
scf: a-bbcc------b-bbccb-bbccc-ccccc-cccc[r(1), r(3), r(4), r(5), r(6)]5
scf: -------aa--a-ab--b-------------ab--c[r(2), r(3), r(6)]2
scf: aaaa-aaaaa-aaabb-baabb-b------aabb-c[r(1), r(2), r(3), r(4), r(6)]5
scf: aaa-aaaaa-aaaab-ab------aaa-ccaab-cc[r(1), r(2), r(3), r(5), r(6)]5
scf: -------aa--c-ab--b-------------ab--c[r(2), r(3), r(6)]2
scf: -------ab--c-ab--b-------------ab--c[r(2), r(3), r(6)]2
scf: -------ab--c-ab--b-------------ab--c[r(2), r(3), r(6)]2
scf: aabb-baabb-caabb-baabb-b------aabb-c[r(1), r(2), r(3), r(4), r(6)]5
scf: -------aa--c-ab--c-------------ab--c[r(2), r(3), r(6)]2
scf: aaa-ccaaa-ccaab-cc------aaa-ccaab-cc[r(1), r(2), r(3), r(5), r(6)]5
scf: -------aa--a-ab--b-------------cb--c[r(2), r(3), r(6)]2
scf: -------aa--c-ab--b-------------cb--c[r(2), r(3), r(6)]2
scf: -------ab--c-ab--b-------------cb--c[r(2), r(3), r(6)]2
scf: -------aa--a-bb--b-------------cb--c[r(2), r(3), r(6)]2
scf: aaaa-aaaaa-abbbb-bbbbb-b------bcbb-c[r(1), r(2), r(3), r(4), r(6)]5
scf: -------aa--c-bb--b-------------cb--c[r(2), r(3), r(6)]2
scf: -------ab--c-bb--b-------------cb--c[r(2), r(3), r(6)]2
scf: aabb-baabb-cbbbb-bbbbb-b------bcbb-c[r(1), r(2), r(3), r(4), r(6)]5
scf: -------abbcc-bbbbb-bbbbb-cbbcc-cbbcc[r(2), r(3), r(4), r(5), r(6)]5
scf: -------aa--c-ab--c-------------cb--c[r(2), r(3), r(6)]2
scf: -------ab--c-ab--c-------------cb--c[r(2), r(3), r(6)]2
scf: -------abbcc-abbcc-cbbcc-cbbcc-cbbcc[r(2), r(3), r(4), r(5), r(6)]5
scf: -------aa--a-ab--b-------------cc--c[r(2), r(3), r(6)]2
scf: aaa-aaaaa-aaaab-ab------ccc-ccccc-cc[r(1), r(2), r(3), r(5), r(6)]5
scf: -------aa--c-ab--b-------------cc--c[r(2), r(3), r(6)]2
scf: -------aa--c-bb--b-------------cc--c[r(2), r(3), r(6)]2
scf: -------aaccc-bbbbb-bbbbb-ccccc-ccccc[r(2), r(3), r(4), r(5), r(6)]5
scf: -------aa--c-ab--c-------------cc--c[r(2), r(3), r(6)]2
scf: aaa-ccaaa-ccaab-cc------ccc-ccccc-cc[r(1), r(2), r(3), r(5), r(6)]5
scf: -------aaccc-abbcc-cbbcc-ccccc-ccccc[r(2), r(3), r(4), r(5), r(6)]5

No
?-

*/



%-------------------------------------------------
% avoiding voting paradoxes
%-------------------------------------------------

% betweenness and single-peaked preference 
%-------------------------------------------------
% Arrow(1963 p.77). See also Black(1948), and Sen (1982).
% revised: 18 Apr 2006.

betweenness((X,Y,Z),S,O):-
   distinct_ordered_triple( (X,Y,Z)),
   possible_ranking_0(S,O),   % R=r(1,6),r(2,4),r(3,5)
   member(O,[[X,Y,Z],[Z,Y,X]]).

betweenness_lemma:-
   \+ violates_betweenness_lemma(_,_,_).

violates_betweenness_lemma((X,Y,Z),[O,B,C],(P,F)):-
   BL=[(X,Y,Z),(Y,X,Z),(Y,Z,X)],
   distinct_ordered_triple( (X,Y,Z)),
   ((member(B,BL), betweenness(B,_,O))->P=y;P=n),
   ((P=y,member(C,BL), C\=B, betweenness(C,_,O))->F=n;F=y),
   (P,F) \= (y,y).

/*

?- auto_restricted_domain(H),H\=[],
violates_betweenness_lemma(A,B,C).

No
?- 

*/

is_single_peaked:-
   \+ \+ (
      betweenness((X,Y,Z),_S,_),
      \+ is_not_single_peaked((X,Y,Z),_R)
   ).

% nogood. 

is_not_single_peaked((X,Y,Z),R):-
   prefer_x_to_y(X,Y,R),
   \+ prefer_x_to_y(Y,Z,R).

is_not_single_peaked_b((X,Y,Z),R):-
   prefer_x_to_y(X,Y,R),
   prefer_x_to_y(Z,Y,R).

is_single_peaked_1:-
   forall(
%     triple_of_alternative((X,Y,Z)),
     distinct_ordered_triple( (X,Y,Z)),
     (
      alternative(W),
      forall( 
        profile_of_rankings( R12),
        is_agreed_on( not_worst, W,(X,Y,Z), R12)
      )
     )
   ).

% See Muller and Satterthwaite(1977).
% which coincides with  Sen& Pattanaik. 

% Note: if possible_ranking/2 instead of possible_ranking_0/2
% then [1,2],[3,4],[5,6],[] (which are ERs) will fail.

is_single_peaked_2:-
   \+ \+ (
    (
    %distinct_ordered_triple( (X,Y,Z)),
     possible_ranking_0(Q,[X,Y,Z]);
     possible_ranking_0(Q,[Z,Y,X])
    ),
    \+ (
     prefer_x_to_y(X,Y,R),
     prefer_x_to_y(Z,Y,R)
    )
   ).

% a version

is_single_peaked_2_b:-
   \+ \+ (
    (
    %distinct_ordered_triple( (X,Y,Z)),
     possible_ranking_0(Q,[X,Y,Z]);
     possible_ranking_0(Q,[Z,Y,X])
    ),
    \+ (
     prefer_x_to_y(X,Y,R),
     \+ prefer_x_to_y(Y,Z,R)
    )
   ).

% nogood. The following is ER (sa me as old is_s._p.)

is_single_peaked_2_er:-
   forall(
    (
    %distinct_ordered_triple( (X,Y,Z)),
     possible_ranking_0(_P,[X,Y,Z])
    ),
    \+ (
      prefer_x_to_y(X,Y,R),
      prefer_x_to_y(Z,Y,R)
    )
   ).

set_of_single_peaked_preferences_relative_to(P,S):-
   possible_ranking_0(P,[X,Y,Z]),
   findall(R,
    (
     possible_ranking_0(R,_),
     \+ (
       prefer_x_to_y_0(X,Y,R),
       prefer_x_to_y_0(Z,Y,R)
     )
    ),
   S).

/*

?- set_of_single_peaked_preferences_relative_to(P,S).

P = r(1)
S = [r(1), r(3), r(4), r(6)] ;

P = r(2)
S = [r(2), r(4), r(5), r(6)] ;

P = r(3)
S = [r(1), r(2), r(3), r(5)] ;

P = r(4)
S = [r(2), r(4), r(5), r(6)] ;

P = r(5)
S = [r(1), r(2), r(3), r(5)] ;

P = r(6)
S = [r(1), r(3), r(4), r(6)] ;

No
?- 

*/


% value restriction (VR) 
%-------------------------------------------------
% See Inada (1964), Sen (1982).
% revised: 18 Apr
% revised: 16-24,28 May for the auto-generation (later part)

% for logically possible rankings

value_restriction_in_rankings( S, (C, W), (X,Y,Z), L):-
   type_of_value_restriction( S,agree_on(C),_),
   member(W,[X,Y,Z]),
   subtract([X,Y,Z],[W],[U,V]),
   forall(
     (possible_ranking_0( R,_),member(R,L)),
     value_restriction_0( S, C, (W,U,V), R)
   ).

value_restriction_0( sp, not_worst, (X,Y,Z), R):-
   prefer_x_to_y_0( X, Y, R)
   ;
   prefer_x_to_y_0( X, Z, R).

value_restriction_0( sc, not_best, (X,Y,Z), R):-
   prefer_x_to_y_0( Y, X, R)
   ;
   prefer_x_to_y_0( Z, X, R).

value_restriction_0( s2, not_medium, (X,Y,Z), R):-
   prefer_x_to_y_0( X, Y, R),
   prefer_x_to_y_0( X, Z, R).

value_restriction_0( s2, not_medium, (X,Y,Z), R):-
   prefer_x_to_y_0( Y, X, R),
   prefer_x_to_y_0( Z, X, R).


% an earlier non-recursive version.

value_restriction( S):-
%   type_of_value_restriction( S,agree_on(_C),_),
   forall(
     triple_of_alternative( (X,Y,Z)),
     value_restriction( S, _C, (X,Y,Z))
   ).

value_restriction( S, C, (X,Y,Z)):-
   type_of_value_restriction( S,agree_on(C),_),
   member(W,[X,Y,Z]),
   subtract([X,Y,Z],[W],[U,V]),
   forall(
     possible_ranking( R,_),
     value_restriction( S, C, (W,U,V), R)
   ).

value_restriction( sp, not_worst, (X,Y,Z), R):-
   prefer_x_to_y( X, Y, R)
   ;
   prefer_x_to_y( X, Z, R).

value_restriction( sc, not_best, (X,Y,Z), R):-
   prefer_x_to_y( Y, X, R)
   ;
   prefer_x_to_y( Z, X, R).

value_restriction( s2, not_medium, (X,Y,Z), R):-
   prefer_x_to_y( X, Y, R),
   prefer_x_to_y( X, Z, R).

value_restriction( s2, not_medium, (X,Y,Z), R):-
   prefer_x_to_y( Y, X, R),
   prefer_x_to_y( Z, X, R).



% the alternative but relatively slow.

value_restriction_1( S):-
   forall(
     triple_of_alternative((X,Y,Z)),
%     distinct_ordered_triple( (X,Y,Z)),
     (
      type_of_value_restriction( S,agree_on(C),_),
      alternative(W),
      member(W,[X,Y,Z]),
      forall( 
        profile_of_rankings( R12),
        is_agreed_on( C, W,(X,Y,Z), R12)
      )
     )
   ).


% The majority-decision-SDF iff VR
% (Sen and Pattanaik, 1969, Theorem VIII).


type_of_value_restriction( 'sp',
  agree_on( not_worst),
  'A weaker version of Single-Peakedness by Black(1948) and Arrow(1963)'
).
type_of_value_restriction( 'sc',
   agree_on( not_best),
  'A weaker version of Single-Cavedness by Inada(1964)'
).
type_of_value_restriction( 's2',
  agree_on( not_medium),
  'A weaker version of Separability into 2 Groups by Inada(1964)'
).

% modified: 16 may 2006.

is_agreed_on( C, W, (X,Y,Z), Rankings):-
   member((K,C),[
     (1, not_best),
     (2, not_medium),
     (3, not_worst)
   ]),
   member(W, [X,Y,Z]),
   \+ (
     member( R, Rankings),
     rank_in_list( K, W, [X,Y,Z], R)
   ).

rank_in_list( K, A, List, R):-
   possible_ranking( R,_),
   member( A, List),
   rank_in_list_1( K, A, List, R).

rank_in_list_1( 1, A, List, R):-
   \+ (
     member( B, List),
     prefer_x_to_y( B, A, R)
   ). 
rank_in_list_1( 3, A, List, R):-
   \+ (
     member( B, List),
     prefer_x_to_y( A, B, R)
   ). 
rank_in_list_1( 2, A, List, R):-
   \+ rank_in_list( 1, A, List, R),
   \+ rank_in_list( 3, A, List, R).

/*

?- auto_restricted_domain(H),findall(A,(
  member(S,[sp,sc,s2]),(value_restriction(S)->A=S;A='-')),L),
  (\+ \+ is_cdi_pairs(_,_)->Z=cdi;Z='-'),
((Z=cdi,L=[sp|_])->(nl,write([Z|L]:H));true),fail.

[cdi, sp, -, -]:[r(1), r(2), r(3), r(5)]
[cdi, sp, -, -]:[r(1), r(3), r(4), r(6)]
[cdi, sp, -, s2]:[r(1), r(3), r(5)]
[cdi, sp, -, s2]:[r(1), r(3), r(6)]
[cdi, sp, -, s2]:[r(1), r(4), r(6)]
[cdi, sp, sc, s2]:[r(1), r(6)]
[cdi, sp, -, s2]:[r(2), r(3), r(5)]
[cdi, sp, -, -]:[r(2), r(4), r(5), r(6)]
[cdi, sp, -, s2]:[r(2), r(4), r(5)]
[cdi, sp, -, s2]:[r(2), r(4), r(6)]
[cdi, sp, sc, s2]:[r(2), r(4)]
[cdi, sp, sc, s2]:[r(3), r(5)]

No
?- auto_restricted_domain(H),findall(A,(
  member(S,[sp,sc,s2]),(value_restriction(S)->A=S;A='-')),L),
  (\+ \+ is_cdi_pairs(_,_)->Z=cdi;Z='-'),
((Z=cdi,member(sc,L))->(nl,write([Z|L]:H));true),fail.

[cdi, -, sc, -]:[r(1), r(2), r(3), r(4)]
[cdi, -, sc, s2]:[r(1), r(2), r(4)]
[cdi, -, sc, -]:[r(1), r(2), r(5), r(6)]
[cdi, -, sc, s2]:[r(1), r(2), r(6)]
[cdi, -, sc, s2]:[r(1), r(5), r(6)]
[cdi, sp, sc, s2]:[r(1), r(6)]
[cdi, -, sc, s2]:[r(2), r(3), r(4)]
[cdi, sp, sc, s2]:[r(2), r(4)]
[cdi, -, sc, -]:[r(3), r(4), r(5), r(6)]
[cdi, -, sc, s2]:[r(3), r(4), r(5)]
[cdi, -, sc, s2]:[r(3), r(5), r(6)]
[cdi, sp, sc, s2]:[r(3), r(5)]

No
?- auto_restricted_domain(H),findall(A,(
  member(S,[sp,sc,s2]),(value_restriction(S)->A=S;A='-')),L),
  (\+ \+ is_cdi_pairs(_,_)->Z=cdi;Z='-'),
((Z=cdi,member(s2,L))->(nl,write([Z|L]:H));true),fail.

[cdi, -, -, s2]:[r(1), r(2), r(4), r(6)]
[cdi, -, sc, s2]:[r(1), r(2), r(4)]
[cdi, -, sc, s2]:[r(1), r(2), r(6)]
[cdi, -, -, s2]:[r(1), r(3), r(5), r(6)]
[cdi, sp, -, s2]:[r(1), r(3), r(5)]
[cdi, sp, -, s2]:[r(1), r(3), r(6)]
[cdi, sp, -, s2]:[r(1), r(4), r(6)]
[cdi, -, sc, s2]:[r(1), r(5), r(6)]
[cdi, sp, sc, s2]:[r(1), r(6)]
[cdi, -, -, s2]:[r(2), r(3), r(4), r(5)]
[cdi, -, sc, s2]:[r(2), r(3), r(4)]
[cdi, sp, -, s2]:[r(2), r(3), r(5)]
[cdi, sp, -, s2]:[r(2), r(4), r(5)]
[cdi, sp, -, s2]:[r(2), r(4), r(6)]
[cdi, sp, sc, s2]:[r(2), r(4)]
[cdi, -, sc, s2]:[r(3), r(4), r(5)]
[cdi, -, sc, s2]:[r(3), r(5), r(6)]
[cdi, sp, sc, s2]:[r(3), r(5)]

No
?- 
?- 
?- auto_restricted_domain(H),findall(A,(
  member(S,[sp,sc,s2]),
  (value_restriction(S)->A=1;A=0)),L),
(\+ \+ is_cdi_pairs(_,_)->Z=1;Z=0),
(\+ member(0,[Z|L])->(nl,write([Z|L]:H));true),fail.

[1, 1, 1, 1]:[r(1), r(6)]
[1, 1, 1, 1]:[r(2), r(4)]
[1, 1, 1, 1]:[r(3), r(5)]

No
?- auto_restricted_domain(H),findall(A,(
  member(S,[sp,sc,s2]),
  (value_restriction(S)->A=1;A=0)),L),
(\+ \+ is_cdi_pairs(_,_)->Z=1;Z=0),
(member(1,L),Z=1->(nl,write([Z|L]:H));true),fail.

[1, 0, 1, 0]:[r(1), r(2), r(3), r(4)]
[1, 1, 0, 0]:[r(1), r(2), r(3), r(5)]
[1, 0, 0, 1]:[r(1), r(2), r(4), r(6)]
[1, 0, 1, 1]:[r(1), r(2), r(4)]
[1, 0, 1, 0]:[r(1), r(2), r(5), r(6)]
[1, 0, 1, 1]:[r(1), r(2), r(6)]
[1, 1, 0, 0]:[r(1), r(3), r(4), r(6)]
[1, 0, 0, 1]:[r(1), r(3), r(5), r(6)]
[1, 1, 0, 1]:[r(1), r(3), r(5)]
[1, 1, 0, 1]:[r(1), r(3), r(6)]
[1, 1, 0, 1]:[r(1), r(4), r(6)]
[1, 0, 1, 1]:[r(1), r(5), r(6)]
[1, 1, 1, 1]:[r(1), r(6)]
[1, 0, 0, 1]:[r(2), r(3), r(4), r(5)]
[1, 0, 1, 1]:[r(2), r(3), r(4)]
[1, 1, 0, 1]:[r(2), r(3), r(5)]
[1, 1, 0, 0]:[r(2), r(4), r(5), r(6)]
[1, 1, 0, 1]:[r(2), r(4), r(5)]
[1, 1, 0, 1]:[r(2), r(4), r(6)]
[1, 1, 1, 1]:[r(2), r(4)]
[1, 0, 1, 0]:[r(3), r(4), r(5), r(6)]
[1, 0, 1, 1]:[r(3), r(4), r(5)]
[1, 0, 1, 1]:[r(3), r(5), r(6)]
[1, 1, 1, 1]:[r(3), r(5)]

No
?- 
?- auto_restricted_domain(H),
value_restriction(sp),nl, write(H),fail.

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

No
?- 

*/


% Sen's latin square condition (Sen, 1966)
%-------------------------------------------------

value_restriction_by_latin_square:-
   \+ involves_latin_square(_,_,_).

/*
involves_latin_square(type(1),(X,Y,Z),(R1,R2,R3)):-
   set_of_alternatives([_,_,_]),
   possible_ranking(R1,[X,Y,Z]),
   possible_ranking(R2,[Y,Z,X]),
   possible_ranking(R3,[Z,X,Y]).

involves_latin_square(type(2),(X,Y,Z),(R1,R2,R3)):-
   set_of_alternatives([_,_,_]),
   possible_ranking(R1,[X,Z,Y]),
   possible_ranking(R2,[Z,Y,X]),
   possible_ranking(R3,[Y,X,Z]).
*/

involves_latin_square(type(1),(X,Y,Z),(R1,R2,R3)):-
%   \+ set_of_alternatives([_,_,_]),
   prefer_x_to_y(X,Y,R1),
   prefer_x_to_y(Y,Z,R1),
   prefer_x_to_y(Z,X,R2),
   prefer_x_to_y(Y,Z,R2),
   prefer_x_to_y(X,Y,R3),
   prefer_x_to_y(Z,X,R3).

involves_latin_square(type(2),(X,Y,Z),(R1,R2,R3)):-
%   \+ set_of_alternatives([_,_,_]),
   prefer_x_to_y(X,Z,R1),
   prefer_x_to_y(Z,Y,R1),
   prefer_x_to_y(Z,Y,R2),
   prefer_x_to_y(Y,X,R2),
   prefer_x_to_y(Y,X,R3),
   prefer_x_to_y(X,Z,R3).

/*
% 17-8 Apr 2006.

?- auto_restricted_domain(H),findall(A,(
 member(S,[sp,sc,s2]),(value_restriction(S)->A=(v,S);A='-')),L),
  (\+ \+ is_cdi_pairs(_,_)->Z=cdi;Z='-'),
(extremal_restriction->ER='e';ER='-'),
(limited_agreement->LA=l;LA='-'),
(is_nontrivial->NT=n;NT='-'),(is_single_peaked_2->Sp=1;Sp=0),
Z\=cdi,nl,write([Z,NT,ER,Sp,LA|L]:H),fail.

[-, n, -, 0, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5), r(6)]
[-, -, -, 0, l, (v, sp), (v, sc), -]:[r(1), r(2), r(3)]
[-, -, -, 0, l, (v, sp), (v, sc), -]:[r(1), r(2), r(5)]
[-, -, e, 0, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(2)]
[-, -, -, 0, l, (v, sp), (v, sc), -]:[r(1), r(3), r(4)]
[-, -, e, 1, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(3)]
[-, -, -, 0, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(4)]
[-, -, -, 0, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(5)]
[-, -, e, 1, l, (v, sp), (v, sc), (v, s2)]:[r(1)]
[-, -, -, 0, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(3)]
[-, -, -, 0, l, (v, sp), (v, sc), -]:[r(2), r(5), r(6)]
[-, -, e, 1, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(5)]
[-, -, -, 0, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(6)]
[-, -, e, 1, l, (v, sp), (v, sc), (v, s2)]:[r(2)]
[-, -, -, 0, l, (v, sp), (v, sc), -]:[r(3), r(4), r(6)]
[-, -, e, 0, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(4)]
[-, -, -, 0, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(6)]
[-, -, e, 1, l, (v, sp), (v, sc), (v, s2)]:[r(3)]
[-, -, -, 0, l, (v, sp), (v, sc), -]:[r(4), r(5), r(6)]
[-, -, -, 0, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(5)]
[-, -, e, 1, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(6)]
[-, -, e, 1, l, (v, sp), (v, sc), (v, s2)]:[r(4)]
[-, -, e, 0, l, (v, sp), (v, sc), (v, s2)]:[r(5), r(6)]
[-, -, e, 1, l, (v, sp), (v, sc), (v, s2)]:[r(5)]
[-, -, e, 1, l, (v, sp), (v, sc), (v, s2)]:[r(6)]
[-, -, e, 1, l, (v, sp), (v, sc), (v, s2)]:[]

No
*/


% extremal restriction (ER)
%-------------------------------------------------
% Sen and Pattanaik (1969), Inada (1969).
% revised: 17-20 Apr 2006.


extremal_restriction:-
   forall(
     distinct_ordered_triple( (X,Y,Z)),
     \+ violates_extremal_restriction((X,Y,Z),_)
   ).

violates_extremal_restriction((X,Y,Z),(R,Q)):-
   possible_ranking(R,[X,Y,Z]),
   prefer_x_to_y(Z,X,Q),
   \+ possible_ranking(Q,[Z,Y,X]).

% another definition for ER
% by using Conditions A, B, and C in Inada(1969).
%-------------------------------------------------

extremal_restriction(J):-
   member(J,[a,b,c]),
   forall(
     distinct_ordered_triple( (X,Y,Z)),
     \+ violates_extremal_restriction(inada(J,_),(X,Y,Z),_)
   ).

violates_extremal_restriction(inada(a,I),(X,Y,Z),R):-
   I= dichotomous_preference,
   possible_ranking(R,[X,Y,Z]).

violates_extremal_restriction(inada(b,I),(X,Y,Z),(P,R)):-
   I= echoic_preference,
   possible_ranking(P,[X,Y,Z]),
   prefer_x_to_y(Z,X,R).

violates_extremal_restriction(inada(c,I),(X,Y,Z),P):-
   I= antagonistic_preference,
   possible_ranking(P,[X,Y,Z]),
   possible_ranking(R,O),
   O \= [Z,Y,X],
   prefer_x_to_y(Z,X,R).

% Claim. inada(c) <-> (Z is best <-> X is worst).

violates_extremal_restriction(inada_1(c,I),(X,Y,Z),P):-
   I= antagonistic_preference,
   possible_ranking(P,[X,Y,Z]),
   possible_ranking(R,[W|_]),
   G= prefer_x_to_y(X,_,R),
   (W = Z -> G;\+ G).

% forall triple, ER <-> the majority-decision-SWF
% (Sen and Pattanaik, 1969, Theorems IV and XI).



% limited agreement (LA)
%-------------------------------------------------
% A version of 'taboo preferences' by Inada(1969).
% revised: 17-20 Apr 2006.

distinct_pair_in_triple((A,B),(X,Y,Z)):-
   member(A,[X,Y,Z]),
   member(B,[X,Y,Z]),
   B \= A.

limited_agreement:-
   forall(
     triple_of_alternative( (X,Y,Z)),
    (
     distinct_pair_in_triple((A,B),(X,Y,Z)),
     \+ prefer_x_to_y(B,A,_)
    )
   ).

% For strict orderings, ER->VR, LA->VR.
% (Sen and Pattanaik, 1969, Lemma 7).


% nontariviality (almost equivalent to decomposability)
%-------------------------------------------------
% A weaker version of 'taboo preferences' by Inada(1969).

is_nontrivial:-
   forall(
     distinct_ordered_pair( (X,Y)),
     \+ \+ prefer_x_to_y(X,Y,_)
   ).


% integrated test for restrictions
%-------------------------------------------------
% added: 30 Apr 2006.

test_restrictions(H):-
   auto_restricted_domain(H),
   test_restrictions((VR,ER,LA),(Z,NT)),
   show_test_restrictions((VR,ER,LA),(Z,NT),H).

test_restrictions_by_cdi(Z, H):-
   auto_restricted_domain(H),
   test_restrictions((VR,ER,LA),(Z,NT)),
   member(Z,[cdi,'-']),
   show_test_restrictions((VR,ER,LA),(Z,NT),H).

test_restrictions((VR,ER,LA),(Z,NT)):-
   findall(A,(
     member(S,[sp,sc,s2]),
     (value_restriction(S)->A=(v,S);A='-')
   ),VR),
   (\+ is_cdi_pairs(_,_)->Z='-';Z=cdi),
   (extremal_restriction->ER='e';ER='-'),
   (limited_agreement->LA=l;LA='-'),
   (is_nontrivial->NT=n;NT='-').

show_test_restrictions((VR,ER,LA),(Z,NT),H):-
   nl,
   write([Z,NT,ER,LA|VR]:H).


/*

?- auto_restricted_domain(U),
    (extremal_restriction->ER=1;ER=0),
    (limited_agreement->LA=1;LA=0),
    \+ \+ member(1,[ER,LA]),nl,write([ER,LA]:U),fail.

[0, 1]:[r(1), r(2), r(3)]
[0, 1]:[r(1), r(2), r(5)]
[1, 1]:[r(1), r(2)]
[0, 1]:[r(1), r(3), r(4)]
[1, 1]:[r(1), r(3)]
[0, 1]:[r(1), r(4)]
[0, 1]:[r(1), r(5)]
[1, 0]:[r(1), r(6)]
[1, 1]:[r(1)]
[0, 1]:[r(2), r(3)]
[1, 0]:[r(2), r(4)]
[0, 1]:[r(2), r(5), r(6)]
[1, 1]:[r(2), r(5)]
[0, 1]:[r(2), r(6)]
[1, 1]:[r(2)]
[0, 1]:[r(3), r(4), r(6)]
[1, 1]:[r(3), r(4)]
[1, 0]:[r(3), r(5)]
[0, 1]:[r(3), r(6)]
[1, 1]:[r(3)]
[0, 1]:[r(4), r(5), r(6)]
[0, 1]:[r(4), r(5)]
[1, 1]:[r(4), r(6)]
[1, 1]:[r(4)]
[1, 1]:[r(5), r(6)]
[1, 1]:[r(5)]
[1, 1]:[r(6)]
[1, 1]:[]

No
?- 


?- auto_restricted_domain(U),
limited_agreement, nl,write(U),fail.

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

No
?-  auto_restricted_domain(H),findall(A,(
  member(S,[sp,sc,s2]),(value_restriction(S)->A=(v,S);A='-')),L),
  (\+ \+ is_cdi_pairs(_,_)->Z=cdi;Z='-'),
(extremal_restriction->ER='e';ER='-'),
(limited_agreement->LA=l;LA='-'),
(is_nontrivial->NT=n;NT='-'),
Z=cdi,nl,write([Z,NT,ER,LA|L]:H),fail.

[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5)]
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(6)]
[cdi, n, -, -, -, (v, sc), -]:[r(1), r(2), r(3), r(4)]
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(5), r(6)]
[cdi, n, -, -, (v, sp), -, -]:[r(1), r(2), r(3), r(5)]
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(4), r(5), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(4), r(5)]
[cdi, n, -, -, -, -, (v, s2)]:[r(1), r(2), r(4), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(4)]
[cdi, n, -, -, -, (v, sc), -]:[r(1), r(2), r(5), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(3), r(4), r(5), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(3), r(4), r(5)]
[cdi, n, -, -, (v, sp), -, -]:[r(1), r(3), r(4), r(6)]
[cdi, n, -, -, -, -, (v, s2)]:[r(1), r(3), r(5), r(6)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(5)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(4), r(5), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(4), r(5)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(4), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(5), r(6)]
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(1), r(6)]
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(4), r(5), r(6)]
[cdi, n, -, -, -, -, (v, s2)]:[r(2), r(3), r(4), r(5)]
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(4), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(2), r(3), r(4)]
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(5), r(6)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(3), r(5)]
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(6)]
[cdi, n, -, -, (v, sp), -, -]:[r(2), r(4), r(5), r(6)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(5)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(6)]
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(2), r(4)]
[cdi, n, -, -, -, (v, sc), -]:[r(3), r(4), r(5), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(3), r(4), r(5)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(3), r(5), r(6)]
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(3), r(5)]

No
?- 
?- auto_restricted_domain(H),findall(A,(
  member(S,[sp,sc,s2]),(value_restriction(S)->A=(v,S);A='-')),L),
  (\+ \+ is_cdi_pairs(_,_)->Z=cdi;Z='-'),
(extremal_restriction->ER='e';ER='-'),
(limited_agreement->LA=l;LA='-'),
(is_nontrivial->NT=n;NT='-'),
Z\=cdi,nl,write([Z,NT,ER,LA|L]:H),fail.

[-, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5), r(6)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(2), r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(2), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(2)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(3), r(4)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(3)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(4)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(2), r(5), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(5)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(2)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(3), r(4), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(4)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(4), r(5), r(6)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(4)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(5), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[]

No
?- 

?- auto_restricted_domain(H),findall(A,(
  member(S,[sp,sc,s2]),(value_restriction(S)->A=(v,S);A='-')),L),
  (\+ \+ is_cdi_pairs(_,_)->Z=cdi;Z='-'),
(extremal_restriction(U)->ER=U;ER='-'),
(limited_agreement->LA=l;LA='-'),
(is_nontrivial->NT=n;NT='-'),(is_single_peaked->Sp=1;Sp=0),
Z=cdi,nl,write([Z,NT,ER,Sp,LA|L]:H),fail.

[cdi, n, -, 0, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5)]
[cdi, n, -, 0, -, -, -, -]:[r(1), r(2), r(3), r(4), r(6)]
[cdi, n, -, 0, -, -, (v, sc), -]:[r(1), r(2), r(3), r(4)]
[cdi, n, -, 0, -, -, -, -]:[r(1), r(2), r(3), r(5), r(6)]
[cdi, n, -, 1, -, (v, sp), -, -]:[r(1), r(2), r(3), r(5)]
[cdi, n, -, 0, -, -, -, -]:[r(1), r(2), r(3), r(6)]
[cdi, n, -, 0, -, -, -, -]:[r(1), r(2), r(4), r(5), r(6)]
[cdi, n, -, 0, -, -, -, -]:[r(1), r(2), r(4), r(5)]
[cdi, n, -, 0, -, -, -, (v, s2)]:[r(1), r(2), r(4), r(6)]
[cdi, n, -, 0, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(4)]
[cdi, n, -, 0, -, -, (v, sc), -]:[r(1), r(2), r(5), r(6)]
[cdi, n, -, 0, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(6)]
[cdi, n, -, 0, -, -, -, -]:[r(1), r(3), r(4), r(5), r(6)]
[cdi, n, -, 0, -, -, -, -]:[r(1), r(3), r(4), r(5)]
[cdi, n, -, 1, -, (v, sp), -, -]:[r(1), r(3), r(4), r(6)]
[cdi, n, -, 0, -, -, -, (v, s2)]:[r(1), r(3), r(5), r(6)]
[cdi, n, -, 1, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(5)]
[cdi, n, -, 1, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(6)]
[cdi, n, -, 0, -, -, -, -]:[r(1), r(4), r(5), r(6)]
[cdi, n, -, 0, -, -, -, -]:[r(1), r(4), r(5)]
[cdi, n, -, 1, -, (v, sp), -, (v, s2)]:[r(1), r(4), r(6)]
[cdi, n, -, 0, -, -, (v, sc), (v, s2)]:[r(1), r(5), r(6)]
[cdi, n, c, 1, -, (v, sp), (v, sc), (v, s2)]:[r(1), r(6)]
[cdi, n, -, 0, -, -, -, -]:[r(2), r(3), r(4), r(5), r(6)]
[cdi, n, -, 0, -, -, -, (v, s2)]:[r(2), r(3), r(4), r(5)]
[cdi, n, -, 0, -, -, -, -]:[r(2), r(3), r(4), r(6)]
[cdi, n, -, 0, -, -, (v, sc), (v, s2)]:[r(2), r(3), r(4)]
[cdi, n, -, 0, -, -, -, -]:[r(2), r(3), r(5), r(6)]
[cdi, n, -, 1, -, (v, sp), -, (v, s2)]:[r(2), r(3), r(5)]
[cdi, n, -, 0, -, -, -, -]:[r(2), r(3), r(6)]
[cdi, n, -, 1, -, (v, sp), -, -]:[r(2), r(4), r(5), r(6)]
[cdi, n, -, 1, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(5)]
[cdi, n, -, 1, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(6)]
[cdi, n, c, 1, -, (v, sp), (v, sc), (v, s2)]:[r(2), r(4)]
[cdi, n, -, 0, -, -, (v, sc), -]:[r(3), r(4), r(5), r(6)]
[cdi, n, -, 0, -, -, (v, sc), (v, s2)]:[r(3), r(4), r(5)]
[cdi, n, -, 0, -, -, (v, sc), (v, s2)]:[r(3), r(5), r(6)]
[cdi, n, c, 1, -, (v, sp), (v, sc), (v, s2)]:[r(3), r(5)]

No
?- auto_restricted_domain(H),findall(A,(
  member(S,[sp,sc,s2]),(value_restriction(S)->A=(v,S);A='-')),L),
  (\+ \+ is_cdi_pairs(_,_)->Z=cdi;Z='-'),
(extremal_restriction(U)->ER=U;ER='-'),
(limited_agreement->LA=l;LA='-'),
(is_nontrivial->NT=n;NT='-'),(is_single_peaked->Sp=1;Sp=0),
Z\=cdi,nl,write([Z,NT,ER,Sp,LA|L]:H),fail.

[-, n, -, 0, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5), r(6)]
[-, -, -, 1, l, (v, sp), (v, sc), -]:[r(1), r(2), r(3)]
[-, -, -, 1, l, (v, sp), (v, sc), -]:[r(1), r(2), r(5)]
[-, -, b, 1, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(2)]
[-, -, -, 1, l, (v, sp), (v, sc), -]:[r(1), r(3), r(4)]
[-, -, b, 1, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(3)]
[-, -, -, 1, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(4)]
[-, -, -, 1, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(5)]
[-, -, b, 1, l, (v, sp), (v, sc), (v, s2)]:[r(1)]
[-, -, -, 1, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(3)]
[-, -, -, 1, l, (v, sp), (v, sc), -]:[r(2), r(5), r(6)]
[-, -, b, 1, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(5)]
[-, -, -, 1, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(6)]
[-, -, b, 1, l, (v, sp), (v, sc), (v, s2)]:[r(2)]
[-, -, -, 1, l, (v, sp), (v, sc), -]:[r(3), r(4), r(6)]
[-, -, b, 1, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(4)]
[-, -, -, 1, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(6)]
[-, -, b, 1, l, (v, sp), (v, sc), (v, s2)]:[r(3)]
[-, -, -, 1, l, (v, sp), (v, sc), -]:[r(4), r(5), r(6)]
[-, -, -, 1, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(5)]
[-, -, b, 1, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(6)]
[-, -, b, 1, l, (v, sp), (v, sc), (v, s2)]:[r(4)]
[-, -, b, 1, l, (v, sp), (v, sc), (v, s2)]:[r(5), r(6)]
[-, -, b, 1, l, (v, sp), (v, sc), (v, s2)]:[r(5)]
[-, -, b, 1, l, (v, sp), (v, sc), (v, s2)]:[r(6)]
[-, -, a, 1, l, (v, sp), (v, sc), (v, s2)]:[]

No
?- 

% added: 29 Jul 2006
% n=3 condorcet

?- setup_model(alt:[a,b,c],soc:[1,2,3]).

Yes
?- mode_of_simple_majority(A,on).

A = condorcet 

Yes
?- test_restrictions_by_cdi('-', H),
auto_scf( F,majority_set),
(\+ \+ member(A->[],F)->write(empty);true),
(\+ \+ member(A->[_,_,_],F)->write(circ);true),fail.

[-, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5), r(6)]empty
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(2), r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(2), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(2)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(3), r(4)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(3)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(4)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(2), r(5), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(5)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(2)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(3), r(4), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(4)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(4), r(5), r(6)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(4)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(5), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[]

No
?- test_restrictions_by_cdi('cdi', H),
auto_scf( F,majority_set),
(\+ \+ member(A->[],F)->write(empty);true),
(\+ \+ member(A->[_,_,_],F)->write(circ);true),fail.

[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5)]empty
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(6)]empty
[cdi, n, -, -, -, (v, sc), -]:[r(1), r(2), r(3), r(4)]
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(5), r(6)]empty
[cdi, n, -, -, (v, sp), -, -]:[r(1), r(2), r(3), r(5)]
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(6)]empty
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(4), r(5), r(6)]empty
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(4), r(5)]empty
[cdi, n, -, -, -, -, (v, s2)]:[r(1), r(2), r(4), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(4)]
[cdi, n, -, -, -, (v, sc), -]:[r(1), r(2), r(5), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(3), r(4), r(5), r(6)]empty
[cdi, n, -, -, -, -, -]:[r(1), r(3), r(4), r(5)]empty
[cdi, n, -, -, (v, sp), -, -]:[r(1), r(3), r(4), r(6)]
[cdi, n, -, -, -, -, (v, s2)]:[r(1), r(3), r(5), r(6)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(5)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(4), r(5), r(6)]empty
[cdi, n, -, -, -, -, -]:[r(1), r(4), r(5)]empty
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(4), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(5), r(6)]
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(1), r(6)]
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(4), r(5), r(6)]empty
[cdi, n, -, -, -, -, (v, s2)]:[r(2), r(3), r(4), r(5)]
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(4), r(6)]empty
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(2), r(3), r(4)]
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(5), r(6)]empty
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(3), r(5)]
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(6)]empty
[cdi, n, -, -, (v, sp), -, -]:[r(2), r(4), r(5), r(6)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(5)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(6)]
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(2), r(4)]
[cdi, n, -, -, -, (v, sc), -]:[r(3), r(4), r(5), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(3), r(4), r(5)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(3), r(5), r(6)]
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(3), r(5)]

No
?- 

% N=2 condorcet

?- setup_model(alt:[a,b,c],soc:[1,2]).

Yes
?- mode_of_simple_majority(A,on).

A = condorcet 

Yes
?- test_restrictions_by_cdi('-', H),
auto_scf( F,majority_set),
(\+ \+ member(A->[],F)->write(empty);true),
(\+ \+ member(A->[_,_,_],F)->write(circ);true),fail.

[-, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5), r(6)]circ
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(2), r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(2), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(2)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(3), r(4)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(3)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(4)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(2), r(5), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(5)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(2)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(3), r(4), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(4)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(4), r(5), r(6)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(4)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(5), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[]

No
?- test_restrictions_by_cdi('cdi', H),
auto_scf( F,majority_set),
(\+ \+ member(A->[],F)->write(empty);true),
(\+ \+ member(A->[_,_,_],F)->write(circ);true),fail.

[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(6)]circ
[cdi, n, -, -, -, (v, sc), -]:[r(1), r(2), r(3), r(4)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(5), r(6)]circ
[cdi, n, -, -, (v, sp), -, -]:[r(1), r(2), r(3), r(5)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(6)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(4), r(5), r(6)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(4), r(5)]circ
[cdi, n, -, -, -, -, (v, s2)]:[r(1), r(2), r(4), r(6)]circ
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(4)]circ
[cdi, n, -, -, -, (v, sc), -]:[r(1), r(2), r(5), r(6)]circ
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(6)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(3), r(4), r(5), r(6)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(3), r(4), r(5)]circ
[cdi, n, -, -, (v, sp), -, -]:[r(1), r(3), r(4), r(6)]circ
[cdi, n, -, -, -, -, (v, s2)]:[r(1), r(3), r(5), r(6)]circ
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(5)]circ
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(6)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(4), r(5), r(6)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(4), r(5)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(4), r(6)]circ
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(5), r(6)]circ
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(1), r(6)]circ
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(4), r(5), r(6)]circ
[cdi, n, -, -, -, -, (v, s2)]:[r(2), r(3), r(4), r(5)]circ
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(4), r(6)]circ
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(2), r(3), r(4)]circ
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(5), r(6)]circ
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(3), r(5)]circ
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(6)]
[cdi, n, -, -, (v, sp), -, -]:[r(2), r(4), r(5), r(6)]circ
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(5)]circ
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(6)]circ
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(2), r(4)]circ
[cdi, n, -, -, -, (v, sc), -]:[r(3), r(4), r(5), r(6)]circ
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(3), r(4), r(5)]circ
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(3), r(5), r(6)]circ
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(3), r(5)]circ

No
?- 

% (old part)
% n=3, is_weak_Condorcet_winner for majority decision.
% if is_social_ranking for majority decision, then empty instead of circ.

?- test_restrictions_by_cdi('-', H),
auto_scf( F,majority_set),
(\+ \+ member(A->[],F)->write(empty);true),
(\+ \+ member(A->[_,_,_],F)->write(circ);true),fail.

[-, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5), r(6)]circ
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(2), r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(2), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(2)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(3), r(4)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(3)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(4)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(2), r(5), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(5)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(2)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(3), r(4), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(4)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(4), r(5), r(6)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(4)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(5), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[]

No
?- test_restrictions_by_cdi(cdi, H),
auto_scf( F,majority_set),
(\+ \+ member(A->[],F)->write(empty);true),
(\+ \+ member(A->[_,_,_],F)->write(circ);true),fail.

[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(6)]circ
[cdi, n, -, -, -, (v, sc), -]:[r(1), r(2), r(3), r(4)]
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(5), r(6)]circ
[cdi, n, -, -, (v, sp), -, -]:[r(1), r(2), r(3), r(5)]
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(6)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(4), r(5), r(6)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(4), r(5)]circ
[cdi, n, -, -, -, -, (v, s2)]:[r(1), r(2), r(4), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(4)]
[cdi, n, -, -, -, (v, sc), -]:[r(1), r(2), r(5), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(3), r(4), r(5), r(6)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(3), r(4), r(5)]circ
[cdi, n, -, -, (v, sp), -, -]:[r(1), r(3), r(4), r(6)]
[cdi, n, -, -, -, -, (v, s2)]:[r(1), r(3), r(5), r(6)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(5)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(4), r(5), r(6)]circ
[cdi, n, -, -, -, -, -]:[r(1), r(4), r(5)]circ
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(4), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(5), r(6)]
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(1), r(6)]
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(4), r(5), r(6)]circ
[cdi, n, -, -, -, -, (v, s2)]:[r(2), r(3), r(4), r(5)]
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(4), r(6)]circ
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(2), r(3), r(4)]
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(5), r(6)]circ
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(3), r(5)]
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(6)]circ
[cdi, n, -, -, (v, sp), -, -]:[r(2), r(4), r(5), r(6)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(5)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(6)]
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(2), r(4)]
[cdi, n, -, -, -, (v, sc), -]:[r(3), r(4), r(5), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(3), r(4), r(5)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(3), r(5), r(6)]
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(3), r(5)]

No
?-


% n=2, is_a_rational_social_choice (i.e., the majority-SDF)
% added: 29 Jun 2006.

?- [sproof_f],setup_model(_:[a,b,c],_:[1,2]).
% sproof_f compiled 0.02 sec, 2,168 bytes

?- test_restrictions_by_cdi('cdi', H),auto_scf( F,majority_set),
(\+ \+ member(A->[],F)->write(empty);true),
(\+ \+ ((member(A->B,F),B=[_,_,_]),write(A;B))->write(c);true),fail.

[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5)]r(2), r(4);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, -, (v, sc), -]:[r(1), r(2), r(3), r(4)]r(2), r(4);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(5), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, (v, sp), -, -]:[r(1), r(2), r(3), r(5)]r(3), r(5);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(4), r(5), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(4), r(5)]r(2), r(4);[a, b, c]c
[cdi, n, -, -, -, -, (v, s2)]:[r(1), r(2), r(4), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(4)]r(2), r(4);[a, b, c]c
[cdi, n, -, -, -, (v, sc), -]:[r(1), r(2), r(5), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(1), r(3), r(4), r(5), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(1), r(3), r(4), r(5)]r(3), r(5);[a, b, c]c
[cdi, n, -, -, (v, sp), -, -]:[r(1), r(3), r(4), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, -, -, (v, s2)]:[r(1), r(3), r(5), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(5)]r(3), r(5);[a, b, c]c
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(1), r(4), r(5), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(1), r(4), r(5)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(4), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(5), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(1), r(6)]r(1), r(6);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(4), r(5), r(6)]r(2), r(4);[a, b, c]c
[cdi, n, -, -, -, -, (v, s2)]:[r(2), r(3), r(4), r(5)]r(2), r(4);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(4), r(6)]r(2), r(4);[a, b, c]c
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(2), r(3), r(4)]r(2), r(4);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(5), r(6)]r(3), r(5);[a, b, c]c
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(3), r(5)]r(3), r(5);[a, b, c]c
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(6)]
[cdi, n, -, -, (v, sp), -, -]:[r(2), r(4), r(5), r(6)]r(2), r(4);[a, b, c]c
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(5)]r(2), r(4);[a, b, c]c
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(6)]r(2), r(4);[a, b, c]c
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(2), r(4)]r(2), r(4);[a, b, c]c
[cdi, n, -, -, -, (v, sc), -]:[r(3), r(4), r(5), r(6)]r(3), r(5);[a, b, c]c
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(3), r(4), r(5)]r(3), r(5);[a, b, c]c
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(3), r(5), r(6)]r(3), r(5);[a, b, c]c
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(3), r(5)]r(3), r(5);[a, b, c]c

No
?- test_restrictions_by_cdi('-', H),auto_scf( F,majority_set),
(\+ \+ member(A->[],F)->write(empty);true),
(\+ \+ ((member(A->B,F),B=[_,_,_]),write(A;B))->write(c);true),fail.

[-, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5), r(6)]r(1), r(6);[a, b, c]c
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(2), r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(2), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(2)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(3), r(4)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(3)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(4)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(2), r(5), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(5)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(2)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(3), r(4), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(4)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(3)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(4), r(5), r(6)]
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(4)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(5), r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(5)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(6)]
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[]

No
?- 


% n=3, the majority rule using is_social_ordering.

?- test_restrictions_by_cdi(cdi, H),
auto_scf( F,majority),(is_non_manipulable_scf(F)->true;write('M')),
show_scf_hr_1(F),fail.

[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5)]
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(6)]
[cdi, n, -, -, -, (v, sc), -]:[r(1), r(2), r(3), r(4)]
scf: aaaaaaaaaabbaabbaaaaaaaaaabbaabbaabbaabbbbbbbbbbaabbaabbbbbbbbbb
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(5), r(6)]
[cdi, n, -, -, (v, sp), -, -]:[r(1), r(2), r(3), r(5)]
scf: aaaaaaaaaabaaaacaaaaaaaaaabaaaacaabaaababbbbaabcaaacaaacaabccccc
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(3), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(4), r(5), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(2), r(4), r(5)]
[cdi, n, -, -, -, -, (v, s2)]:[r(1), r(2), r(4), r(6)]
scf: aaaaaaaaaabbaabcaaaaaaaaaabcaaccaabbaabcbbbbbcbcaabcaaccbcbccccc
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(4)]
scf: aaaaaaaabaaaaaaaabaabaabbbb
[cdi, n, -, -, -, (v, sc), -]:[r(1), r(2), r(5), r(6)]
scf: aaaaaaaaaaccaaccaaaaaaaaaaccaaccaaccaaccccccccccaaccaacccccccccc
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(2), r(6)]
scf: aaaaaaaacaaaaaaaacaacaacccc
[cdi, n, -, -, -, -, -]:[r(1), r(3), r(4), r(5), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(3), r(4), r(5)]
[cdi, n, -, -, (v, sp), -, -]:[r(1), r(3), r(4), r(6)]
scf: aaaaabbbabbbabbcabbbbbbbbbbbbbbcabbbbbbbbbbbbbbcabbcbbbcbbbccccc
[cdi, n, -, -, -, -, (v, s2)]:[r(1), r(3), r(5), r(6)]
scf: aaaaababaaccabccababbbbbabccbbccaaccabccccccccccabccbbcccccccccc
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(5)]
scf: aaaabaaacababbbabcaacabcccc
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(3), r(6)]
scf: aaaabbabcabbbbbbbcabcbbcccc
[cdi, n, -, -, -, -, -]:[r(1), r(4), r(5), r(6)]
[cdi, n, -, -, -, -, -]:[r(1), r(4), r(5)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(1), r(4), r(6)]
scf: aaaabbabcabbbbbbbcabcbbcccc
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(1), r(5), r(6)]
scf: aaaaccaccaccccccccacccccccc
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(1), r(6)]
scf: aaacaccc
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(4), r(5), r(6)]
[cdi, n, -, -, -, -, (v, s2)]:[r(2), r(3), r(4), r(5)]
scf: aaaaabbaabbcaaccabbabbbbbbbbabbcabbcbbbbbbbbcbbcaaccabbccbbccccc
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(4), r(6)]
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(2), r(3), r(4)]
scf: aaaabbabbabbbbbbbbabbbbbbbb
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(5), r(6)]
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(3), r(5)]
scf: aaaabaaacababbbabcaacabcccc
[cdi, n, -, -, -, -, -]:[r(2), r(3), r(6)]
[cdi, n, -, -, (v, sp), -, -]:[r(2), r(4), r(5), r(6)]
scf: aaaaabccacccacccabccbbbbcbcccbccaccccbccccccccccaccccbcccccccccc
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(5)]
scf: aaaabcaccabcbbbcbcacccbcccc
[cdi, n, -, -, (v, sp), -, (v, s2)]:[r(2), r(4), r(6)]
scf: aaaabcaccabcbbbcbcacccbcccc
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(2), r(4)]
scf: aaababbb
[cdi, n, -, -, -, (v, sc), -]:[r(3), r(4), r(5), r(6)]
scf: bbbbbbbbbbccbbccbbbbbbbbbbccbbccbbccbbccccccccccbbccbbcccccccccc
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(3), r(4), r(5)]
scf: bbbbbbbbcbbbbbbbbcbbcbbcccc
[cdi, n, -, -, -, (v, sc), (v, s2)]:[r(3), r(5), r(6)]
scf: bbbbccbccbccccccccbcccccccc
[cdi, n, e, -, (v, sp), (v, sc), (v, s2)]:[r(3), r(5)]
scf: bbbcbccc

No
?- test_restrictions_by_cdi('-', H),
auto_scf( F,majority),(is_non_manipulable_scf(F)->true;write('M')),
show_scf_hr_1(F),fail.

[-, n, -, -, -, -, -]:[r(1), r(2), r(3), r(4), r(5), r(6)]
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(2), r(3)]
scf: aaaaaaaabaaaaaaaabaabaabbbb
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(2), r(5)]
scf: aaaaaaaacaaaaaaaacaacaacccc
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(2)]
scf: aaaaaaaa
[-, -, -, l, (v, sp), (v, sc), -]:[r(1), r(3), r(4)]
scf: aaaabbabbabbbbbbbbabbbbbbbb
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(3)]
scf: aaababbb
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(4)]
scf: aaababbb
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(1), r(5)]
scf: aaacaccc
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(1)]
scf: a
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(3)]
scf: aaababbb
[-, -, -, l, (v, sp), (v, sc), -]:[r(2), r(5), r(6)]
scf: aaaaccaccaccccccccacccccccc
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(5)]
scf: aaacaccc
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(2), r(6)]
scf: aaacaccc
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(2)]
scf: a
[-, -, -, l, (v, sp), (v, sc), -]:[r(3), r(4), r(6)]
scf: bbbbbbbbcbbbbbbbbcbbcbbcccc
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(4)]
scf: bbbbbbbb
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(3), r(6)]
scf: bbbcbccc
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(3)]
scf: b
[-, -, -, l, (v, sp), (v, sc), -]:[r(4), r(5), r(6)]
scf: bbbbccbccbccccccccbcccccccc
[-, -, -, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(5)]
scf: bbbcbccc
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(4), r(6)]
scf: bbbcbccc
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(4)]
scf: b
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(5), r(6)]
scf: cccccccc
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(5)]
scf: c
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[r(6)]
scf: c
[-, -, e, l, (v, sp), (v, sc), (v, s2)]:[]
scf: 

No
?- 

?- auto_restricted_domain(H),value_restriction(sp),
auto_scf( F,majority),(is_non_manipulable_scf(F)->true;write('M')),
show_scf_hr_1(F),write(H),fail.

scf: aaaaaaaaaabaaaacaaaaaaaaaabaaaacaabaaababbbbaabcaaacaaacaabccccc[r(1), r(2), r(3), r(5)]
scf: aaaaaaaabaaaaaaaabaabaabbbb[r(1), r(2), r(3)]
scf: aaaaaaaacaaaaaaaacaacaacccc[r(1), r(2), r(5)]
scf: aaaaaaaa[r(1), r(2)]
scf: aaaaabbbabbbabbcabbbbbbbbbbbbbbcabbbbbbbbbbbbbbcabbcbbbcbbbccccc[r(1), r(3), r(4), r(6)]
scf: aaaabbabbabbbbbbbbabbbbbbbb[r(1), r(3), r(4)]
scf: aaaabaaacababbbabcaacabcccc[r(1), r(3), r(5)]
scf: aaaabbabcabbbbbbbcabcbbcccc[r(1), r(3), r(6)]
scf: aaababbb[r(1), r(3)]
scf: aaaabbabcabbbbbbbcabcbbcccc[r(1), r(4), r(6)]
scf: aaababbb[r(1), r(4)]
scf: aaacaccc[r(1), r(5)]
scf: aaacaccc[r(1), r(6)]
scf: a[r(1)]
scf: aaaabaaacababbbabcaacabcccc[r(2), r(3), r(5)]
scf: aaababbb[r(2), r(3)]
scf: aaaaabccacccacccabccbbbbcbcccbccaccccbccccccccccaccccbcccccccccc[r(2), r(4), r(5), r(6)]
scf: aaaabcaccabcbbbcbcacccbcccc[r(2), r(4), r(5)]
scf: aaaabcaccabcbbbcbcacccbcccc[r(2), r(4), r(6)]
scf: aaababbb[r(2), r(4)]
scf: aaaaccaccaccccccccacccccccc[r(2), r(5), r(6)]
scf: aaacaccc[r(2), r(5)]
scf: aaacaccc[r(2), r(6)]
scf: a[r(2)]
scf: bbbbbbbbcbbbbbbbbcbbcbbcccc[r(3), r(4), r(6)]
scf: bbbbbbbb[r(3), r(4)]
scf: bbbcbccc[r(3), r(5)]
scf: bbbcbccc[r(3), r(6)]
scf: b[r(3)]
scf: bbbbccbccbccccccccbcccccccc[r(4), r(5), r(6)]
scf: bbbcbccc[r(4), r(5)]
scf: bbbcbccc[r(4), r(6)]
scf: b[r(4)]
scf: cccccccc[r(5), r(6)]
scf: c[r(5)]
scf: c[r(6)]
scf: []

No
?- 
?- auto_restricted_domain(H),value_restriction(sp),nl,write(H),
auto_scf( F,majority),
(is_non_manipulable_scf(F)->true;(write(m),fail)),
(is_dictatorial_scf(F,_)->(write(d),fail);true),
(citizens_sovereignty(F)->true;(write(ncs),fail)),
show_scf_hr_0t(F),fail.

[r(1), r(2), r(3), r(5)]
scf: 
r1=r(1)aaa-a-aaa-a-aab-a-------aaa-c-------
r1=r(2)aaa-a-aaa-a-aab-a-------aaa-c-------
r1=r(3)aab-a-aab-a-bbb-b-------aab-c-------
r1=r(4)------------------------------------
r1=r(5)aaa-c-aaa-c-aab-c-------ccc-c-------
r1=r(6)------------------------------------
[r(1), r(2), r(3)]ncs
[r(1), r(2), r(5)]ncs
[r(1), r(2)]d
[r(1), r(3), r(4), r(6)]
scf: 
r1=r(1)a-aa-a------a-bb-ba-bb-b------a-bb-c
r1=r(2)------------------------------------
r1=r(3)a-bb-b------b-bb-bb-bb-b------b-bb-c
r1=r(4)a-bb-b------b-bb-bb-bb-b------b-bb-c
r1=r(5)------------------------------------
r1=r(6)a-bb-c------b-bb-cb-bb-c------c-cc-c
[r(1), r(3), r(4)]ncs
[r(1), r(3), r(5)]
scf: 
r1=r(1)a-a-a-------a-b-a-------a-a-c-------
r1=r(2)------------------------------------
r1=r(3)a-b-a-------b-b-b-------a-b-c-------
r1=r(4)------------------------------------
r1=r(5)a-a-c-------a-b-c-------c-c-c-------
r1=r(6)------------------------------------
[r(1), r(3), r(6)]
scf: 
r1=r(1)a-a--a------a-b--b------------a-b--c
r1=r(2)------------------------------------
r1=r(3)a-b--b------b-b--b------------b-b--c
r1=r(4)------------------------------------
r1=r(5)------------------------------------
r1=r(6)a-b--c------b-b--c------------c-c--c
[r(1), r(3)]ncs
[r(1), r(4), r(6)]
scf: 
r1=r(1)a--a-a------------a--b-b------a--b-c
r1=r(2)------------------------------------
r1=r(3)------------------------------------
r1=r(4)a--b-b------------b--b-b------b--b-c
r1=r(5)------------------------------------
r1=r(6)a--b-c------------b--b-c------c--c-c
[r(1), r(4)]ncs
[r(1), r(5)]ncs
[r(1), r(6)]ncs
[r(1)]d
[r(2), r(3), r(5)]
scf: 
r1=r(1)------------------------------------
r1=r(2)-------aa-a--ab-a--------aa-c-------
r1=r(3)-------ab-a--bb-b--------ab-c-------
r1=r(4)------------------------------------
r1=r(5)-------aa-c--ab-c--------cc-c-------
r1=r(6)------------------------------------
[r(2), r(3)]ncs
[r(2), r(4), r(5), r(6)]
scf: 
r1=r(1)------------------------------------
r1=r(2)-------a-aaa-------a-bcc-a-ccc-a-ccc
r1=r(3)------------------------------------
r1=r(4)-------a-bcc-------b-bbb-c-bcc-c-bcc
r1=r(5)-------a-ccc-------c-bcc-c-ccc-c-ccc
r1=r(6)-------a-ccc-------c-bcc-c-ccc-c-ccc
[r(2), r(4), r(5)]
scf: 
r1=r(1)------------------------------------
r1=r(2)-------a-aa--------a-bc--a-cc-------
r1=r(3)------------------------------------
r1=r(4)-------a-bc--------b-bb--c-bc-------
r1=r(5)-------a-cc--------c-bc--c-cc-------
r1=r(6)------------------------------------
[r(2), r(4), r(6)]
scf: 
r1=r(1)------------------------------------
r1=r(2)-------a-a-a-------a-b-c-------a-c-c
r1=r(3)------------------------------------
r1=r(4)-------a-b-c-------b-b-b-------c-b-c
r1=r(5)------------------------------------
r1=r(6)-------a-c-c-------c-b-c-------c-c-c
[r(2), r(4)]ncs
[r(2), r(5), r(6)]ncs
[r(2), r(5)]ncs
[r(2), r(6)]ncs
[r(2)]d
[r(3), r(4), r(6)]ncs
[r(3), r(4)]d
[r(3), r(5)]ncs
[r(3), r(6)]ncs
[r(3)]d
[r(4), r(5), r(6)]ncs
[r(4), r(5)]ncs
[r(4), r(6)]ncs
[r(4)]d
[r(5), r(6)]d
[r(5)]d
[r(6)]d
[]d

No
?- 

% 5/9 re-exam.

?- auto_restricted_domain(H),value_restriction(sp),nl,write(H),
auto_scf( F,majority),
(is_non_manipulable_scf(F)->true;(write(m),fail)),
(is_dictatorial_scf(F,_)->(write(d),fail);true),
(citizens_sovereignty(F)->true;(write(ncs),fail)),
show_scf_hr_0t(F),fail.

[r(1), r(2), r(3), r(5)]
scf: 
  #r2: 111111222222333333444444555555666666
  #r3: 123456123456123456123456123456123456
r1=r(1)aaa-a-aaa-a-aab-a-------aaa-c-------
r1=r(2)aaa-a-aaa-a-aab-a-------aaa-c-------
r1=r(3)aab-a-aab-a-bbb-b-------aab-c-------
r1=r(4)------------------------------------
r1=r(5)aaa-c-aaa-c-aab-c-------ccc-c-------
r1=r(6)------------------------------------
[r(1), r(2), r(3)]ncs
[r(1), r(2), r(5)]ncs
[r(1), r(2)]d
[r(1), r(3), r(4), r(6)]
scf: 
  #r2: 111111222222333333444444555555666666
  #r3: 123456123456123456123456123456123456
r1=r(1)a-aa-a------a-bb-ba-bb-b------a-bb-c
r1=r(2)------------------------------------
r1=r(3)a-bb-b------b-bb-bb-bb-b------b-bb-c
r1=r(4)a-bb-b------b-bb-bb-bb-b------b-bb-c
r1=r(5)------------------------------------
r1=r(6)a-bb-c------b-bb-cb-bb-c------c-cc-c
[r(1), r(3), r(4)]ncs
[r(1), r(3), r(5)]
scf: 
  #r2: 111111222222333333444444555555666666
  #r3: 123456123456123456123456123456123456
r1=r(1)a-a-a-------a-b-a-------a-a-c-------
r1=r(2)------------------------------------
r1=r(3)a-b-a-------b-b-b-------a-b-c-------
r1=r(4)------------------------------------
r1=r(5)a-a-c-------a-b-c-------c-c-c-------
r1=r(6)------------------------------------
[r(1), r(3), r(6)]
scf: 
  #r2: 111111222222333333444444555555666666
  #r3: 123456123456123456123456123456123456
r1=r(1)a-a--a------a-b--b------------a-b--c
r1=r(2)------------------------------------
r1=r(3)a-b--b------b-b--b------------b-b--c
r1=r(4)------------------------------------
r1=r(5)------------------------------------
r1=r(6)a-b--c------b-b--c------------c-c--c
[r(1), r(3)]ncs
[r(1), r(4), r(6)]
scf: 
  #r2: 111111222222333333444444555555666666
  #r3: 123456123456123456123456123456123456
r1=r(1)a--a-a------------a--b-b------a--b-c
r1=r(2)------------------------------------
r1=r(3)------------------------------------
r1=r(4)a--b-b------------b--b-b------b--b-c
r1=r(5)------------------------------------
r1=r(6)a--b-c------------b--b-c------c--c-c
[r(1), r(4)]ncs
[r(1), r(5)]ncs
[r(1), r(6)]ncs
[r(1)]d
[r(2), r(3), r(5)]
scf: 
  #r2: 111111222222333333444444555555666666
  #r3: 123456123456123456123456123456123456
r1=r(1)------------------------------------
r1=r(2)-------aa-a--ab-a--------aa-c-------
r1=r(3)-------ab-a--bb-b--------ab-c-------
r1=r(4)------------------------------------
r1=r(5)-------aa-c--ab-c--------cc-c-------
r1=r(6)------------------------------------
[r(2), r(3)]ncs
[r(2), r(4), r(5), r(6)]
scf: 
  #r2: 111111222222333333444444555555666666
  #r3: 123456123456123456123456123456123456
r1=r(1)------------------------------------
r1=r(2)-------a-aaa-------a-bcc-a-ccc-a-ccc
r1=r(3)------------------------------------
r1=r(4)-------a-bcc-------b-bbb-c-bcc-c-bcc
r1=r(5)-------a-ccc-------c-bcc-c-ccc-c-ccc
r1=r(6)-------a-ccc-------c-bcc-c-ccc-c-ccc
[r(2), r(4), r(5)]
scf: 
  #r2: 111111222222333333444444555555666666
  #r3: 123456123456123456123456123456123456
r1=r(1)------------------------------------
r1=r(2)-------a-aa--------a-bc--a-cc-------
r1=r(3)------------------------------------
r1=r(4)-------a-bc--------b-bb--c-bc-------
r1=r(5)-------a-cc--------c-bc--c-cc-------
r1=r(6)------------------------------------
[r(2), r(4), r(6)]
scf: 
  #r2: 111111222222333333444444555555666666
  #r3: 123456123456123456123456123456123456
r1=r(1)------------------------------------
r1=r(2)-------a-a-a-------a-b-c-------a-c-c
r1=r(3)------------------------------------
r1=r(4)-------a-b-c-------b-b-b-------c-b-c
r1=r(5)------------------------------------
r1=r(6)-------a-c-c-------c-b-c-------c-c-c
[r(2), r(4)]ncs
[r(2), r(5), r(6)]ncs
[r(2), r(5)]ncs
[r(2), r(6)]ncs
[r(2)]d
[r(3), r(4), r(6)]ncs
[r(3), r(4)]d
[r(3), r(5)]ncs
[r(3), r(6)]ncs
[r(3)]d
[r(4), r(5), r(6)]ncs
[r(4), r(5)]ncs
[r(4), r(6)]ncs
[r(4)]d
[r(5), r(6)]d
[r(5)]d
[r(6)]d
[]d

No
?- 

% added: 20 May 2006 (for 3-alt s2 but partial)

?- auto_restricted_domain(H),value_restriction(s2),nl,write(H),
auto_scf( F,majority),
(is_non_manipulable_scf(F)->true;(write(m),fail)),
(is_dictatorial_scf(F,_)->(write(d),fail);true),
(citizens_sovereignty(F)->true;(write(ncs),fail)),
show_scf_hr_0t(F),fail.

[r(1), r(2), r(4), r(6)]
scf: 
  #r2: 111111222222333333444444555555666666
  #r3: 123456123456123456123456123456123456
r1=r(1)aa-a-aaa-a-a------aa-b-b------aa-b-c
r1=r(2)aa-a-aaa-a-a------aa-b-c------aa-c-c
r1=r(3)------------------------------------
r1=r(4)aa-b-baa-b-c------bb-b-b------bc-b-c
r1=r(5)------------------------------------
r1=r(6)aa-b-caa-c-c------bc-b-c------cc-c-c
[r(1), r(2), r(4)]ncs
[r(1), r(2), r(6)]ncs
[r(1), r(2)]d
[r(1), r(3), r(5), r(6)]
scf: 
  #r2: 111111222222333333444444555555666666
  #r3: 123456123456123456123456123456123456
r1=r(1)a-a-aa------a-b-ab------a-a-cca-b-cc
r1=r(2)------------------------------------
r1=r(3)a-b-ab------b-b-bb------a-b-ccb-b-cc
r1=r(4)------------------------------------
r1=r(5)a-a-cc------a-b-cc------c-c-ccc-c-cc
r1=r(6)a-b-cc------b-b-cc------c-c-ccc-c-cc
[r(1), r(3), r(5)]

...

?- auto_restricted_domain(H),value_restriction(sc),nl,write(H),
auto_scf( F,majority),(\+ \+ is_cdi_pairs(_,_)->write(c);true),
(is_non_manipulable_scf(F)->true;(write(m),fail)),
(is_dictatorial_scf(F,_)->(write(d),fail);true),
(citizens_sovereignty(F)->true;(write(ncs),fail)),
show_scf_hr_0t(F),fail.

[r(1), r(2), r(3), r(4)]cncs
[r(1), r(2), r(3)]ncs
[r(1), r(2), r(4)]cncs
[r(1), r(2), r(5), r(6)]cncs
[r(1), r(2), r(5)]ncs
[r(1), r(2), r(6)]cncs
[r(1), r(2)]d
[r(1), r(3), r(4)]ncs
[r(1), r(3)]ncs
[r(1), r(4)]ncs
[r(1), r(5), r(6)]cncs
[r(1), r(5)]ncs
[r(1), r(6)]cncs
[r(1)]d
[r(2), r(3), r(4)]cncs
[r(2), r(3)]ncs
[r(2), r(4)]cncs
[r(2), r(5), r(6)]ncs
[r(2), r(5)]ncs
[r(2), r(6)]ncs
[r(2)]d
[r(3), r(4), r(5), r(6)]cncs
[r(3), r(4), r(5)]cncs
[r(3), r(4), r(6)]ncs
[r(3), r(4)]d
[r(3), r(5), r(6)]cncs
[r(3), r(5)]cncs
[r(3), r(6)]ncs
[r(3)]d
[r(4), r(5), r(6)]ncs
[r(4), r(5)]ncs
[r(4), r(6)]ncs
[r(4)]d
[r(5), r(6)]d
[r(5)]d
[r(6)]d
[]d

No
?- 

% added: 10 May 2006.

?- auto_restricted_domain(H),
\+ \+ value_restriction(S),
nl,forall(member(S,[sp,sc,s2]),
value_restriction(S)->write(S;' ')
;write('--; ')),write(H),fail.

--; sc; --; [r(1), r(2), r(3), r(4)]
sp; --; --; [r(1), r(2), r(3), r(5)]
sp; sc; --; [r(1), r(2), r(3)]
--; --; s2; [r(1), r(2), r(4), r(6)]
--; sc; s2; [r(1), r(2), r(4)]
--; sc; --; [r(1), r(2), r(5), r(6)]
sp; sc; --; [r(1), r(2), r(5)]
--; sc; s2; [r(1), r(2), r(6)]
sp; sc; s2; [r(1), r(2)]
sp; --; --; [r(1), r(3), r(4), r(6)]
sp; sc; --; [r(1), r(3), r(4)]
--; --; s2; [r(1), r(3), r(5), r(6)]
sp; --; s2; [r(1), r(3), r(5)]
sp; --; s2; [r(1), r(3), r(6)]
sp; sc; s2; [r(1), r(3)]
sp; --; s2; [r(1), r(4), r(6)]
sp; sc; s2; [r(1), r(4)]
--; sc; s2; [r(1), r(5), r(6)]
sp; sc; s2; [r(1), r(5)]
sp; sc; s2; [r(1), r(6)]
sp; sc; s2; [r(1)]
--; --; s2; [r(2), r(3), r(4), r(5)]
--; sc; s2; [r(2), r(3), r(4)]
sp; --; s2; [r(2), r(3), r(5)]
sp; sc; s2; [r(2), r(3)]
sp; --; --; [r(2), r(4), r(5), r(6)]
sp; --; s2; [r(2), r(4), r(5)]
sp; --; s2; [r(2), r(4), r(6)]
sp; sc; s2; [r(2), r(4)]
sp; sc; --; [r(2), r(5), r(6)]
sp; sc; s2; [r(2), r(5)]
sp; sc; s2; [r(2), r(6)]
sp; sc; s2; [r(2)]
--; sc; --; [r(3), r(4), r(5), r(6)]
--; sc; s2; [r(3), r(4), r(5)]
sp; sc; --; [r(3), r(4), r(6)]
sp; sc; s2; [r(3), r(4)]
--; sc; s2; [r(3), r(5), r(6)]
sp; sc; s2; [r(3), r(5)]
sp; sc; s2; [r(3), r(6)]
sp; sc; s2; [r(3)]
sp; sc; --; [r(4), r(5), r(6)]
sp; sc; s2; [r(4), r(5)]
sp; sc; s2; [r(4), r(6)]
sp; sc; s2; [r(4)]
sp; sc; s2; [r(5), r(6)]
sp; sc; s2; [r(5)]
sp; sc; s2; [r(6)]
sp; sc; s2; []

No
?- 

?- auto_restricted_domain(H),length(H,N),
value_restriction(sp).

H = [r((1, 0)), r((1, 1)), r((1, 2)), r((1, 3)), r((2, 3)), r((3, 2)), r((3, 3)), r((..., ...))]
N = 8 

Yes

*/


% generating and testing on the value restricted domains
% (depreciated)
%-------------------------------------------------
% added: 16-21 May 2006.

tell_majo(V,N,[Lower,Upper]):-
   mode_of_analysis(Alt,Soc),
%   findall(1,possible_ranking_0(_,_),L),
   all_possible_rankings_0(L),
   tell_goal('majo_345.txt',(
   (
    nl,write(Alt;Soc),
    nth1(N,L,_),
    length(H,N),(N==Lower),
    auto_restricted_domain_with_filter(H),
   %auto_restricted_domain(H),
   %value_restriction(V),
    V=vr,nl,write(V:N:H),
    auto_scf( F,majority)
   ),
   (
    (is_non_manipulable_scf(F)->true;(write(m),fail)),
    (is_dictatorial_scf(F,_)->(write(d),fail);true),
    (citizens_sovereignty(F)->true;(write(ncs),fail)),
    show_scf_hr_0t(F)
   ),fail;true)).




%-------------------------------------------------
% auto generation of value restricted domains 
%-------------------------------------------------
% 16,19, 22-29 May, 23 Jun 2006.

%/*
relative_domain_for_triple(T,L,RT,RT1):-
   (var(L)->admissible_rankings(L);true),
   triple_of_alternative(T),
   findall(K,
    (
     member(R,L),
     relative_ranking_on_triple(R, T,_,K)
    ),
   RT),
   sort(RT,RT1).
%*/

% a memory-expensive version using recursion.
% added: 18 Jun 2006.

%
/*
relative_domain_for_triple(T,L,RT,RT1):-
   (var(L)->admissible_rankings(L);true),
   triple_of_alternative(T),
   relative_domain_for_triple_1(T,L,RT,RT1).

relative_domain_for_triple_1(_,[],[],[]).
relative_domain_for_triple_1(T,[R|L],[K|KL],RT1):-
   relative_domain_for_triple_1(T,L,KL,RT0),
   relative_ranking_on_triple(R, T,_,K),
   append( [K], RT0, RT),
   sort(RT,RT1).
%
*/


% value restriction for triples
%-------------------------------------------------

vr_domain_at_triple((VR,A),(X,Y,Z),H,L):-
   member(VR,[vr,sp,sc,s2]),
   CL=[1,2,3,4,5,6],
   triple_of_alternative((X,Y,Z)),
   vr_domain_at_triple_1((VR,A),(X,Y,Z),CL,H,L).
vr_domain_at_triple_1(_,_,[],[],[]).
vr_domain_at_triple_1(VR,T,[K|M],[R|H],[K|L]):-
   vr_domain_at_triple_1(VR,T,M,H,L),
   relative_ranking_on_triple_0(T,R,K),
   constraints_of_value_for_triple(VR,T,[R|H],[K|L]).
vr_domain_at_triple_1(VR,T,[_|M],H,L):-
   vr_domain_at_triple_1(VR,T,M,H,L).

constraints_of_value_for_triple((vr,_),_,_,L):-
   \+ involves_latin_square_0(_,L).
constraints_of_value_for_triple((sp,A),(X,Y,Z),H,_):-
   member(A,[X,Y,Z]),
   \+ involves_an_alternative_of_value(worst,A,H).
constraints_of_value_for_triple((sc,A),(X,Y,Z),H,_):-
   member(A,[X,Y,Z]),
   \+ involves_an_alternative_of_value(best,A,H).  
constraints_of_value_for_triple((s2,A),(X,Y,Z),H,_):-
   member(A,[X,Y,Z]),
   \+ involves_an_alternative_of_value(middle,A,H).

involves_latin_square_0(Sq,L):-
   latin_square_0(Sq),
   subset(Sq,L).
involves_an_alternative_of_value(worst,A,H):-
   member((_,_,A),H).
involves_an_alternative_of_value(best,B,H):-
   member((B,_,_),H).
involves_an_alternative_of_value(middle,C,H):-
   member((_,C,_),H).


%relative_ranking_on_triple_0((X,Y,Z),Rxyz,K)


% generating VR domains without commitment to the database
%-------------------------------------------------

auto_value_restricted_domain_by_triples(Domain,SL,SS):-
   auto_value_restricted_domain_by_triples_1(Y,SL,SS),
   transform_domain_triples_into_rankings( Y,_, Domain).

auto_value_restricted_domain_by_triples_1(Y,SL,SS):-
   findall(T, triple_of_alternative(T),TL),
   auto_value_restriction_for_triples( SS,TL,Y),
   findall(V:T, member((V,T,_,_),Y), SL).
%   forall(member(X, SL),(nl,write(X))),
%   read(y),


auto_value_restriction_for_triples( _, [],[]).
auto_value_restriction_for_triples( SS,[T|TL],[(V,T,H,L)|Y]):-
   auto_value_restriction_for_triples( SS,TL,Y),
   ((var(SS);SS=vr)->V=vr;
     member(V,SS)
   ),
   vr_domain_at_triple((V,_),T,H,L).

transform_domain_triples_into_rankings( Y,RL, Domain):-
%   findall(R, possible_ranking_0( R,_), RL),
   (var(RL)->all_possible_rankings_0(RL);true),
   transform_domain_triples_into_rankings_1( Y,RL, Domain).

transform_domain_triples_into_rankings_1( _,[],[] ).
transform_domain_triples_into_rankings_1( Y,[R|O], RD ):-
   transform_domain_triples_into_rankings_1( Y,O,D ),
   (
    inconsistent_ranking_wrt_domain_of_triples( R, Y ,_)
    ->RD = D
    ; RD = [R|D]
   ).

inconsistent_ranking_wrt_domain_of_triples( R, Y ,(T,L,K)):-
   member((_,T,_,L),Y),
   relative_ranking_on_triple(R,T,_,K),
   \+ member(K,L).


% a restriction to maximal sizes for each triple for VR domains 
%-------------------------------------------------
% (depreciated)
%/*

auto_value_restricted_domain_by_triples_max_d(Domain,SL,SS):-
   auto_value_restricted_domain_by_triples_max_1(Y,SL,SS),
%   findall(R, possible_ranking_0( R,_), RL),
   all_possible_rankings_0(RL),
   transform_domain_triples_into_rankings( Y,RL, Domain).

auto_value_restricted_domain_by_triples_max_1(Y,SL,SS):-
   max_scheme_of_vr_domains_wrt_triples(Y,_),
   auto_value_restricted_domain_by_triples_1(Y,SL,SS).


%*/

max_scheme_of_vr_domains_wrt_triples(Y,P):-
   findall(T, triple_of_alternative(T), TL),
   length(TL,P),
   length(Y0,P),
   V =vr,
   findall(X, (member(X,Y0),X=(V,_,_,[_,_,_,_])), Y).



% generating VR domains without commitment to the database 
%-------------------------------------------------
% modified: 28-9 May 2006
% modified: 18-9,23 Jun 2006. reuse of recursion data.


:- dynamic  auto_VR_domain_0/4.

init_auto_VR_domain_0:-
   abolish(auto_VR_domain_0/4).

exist_auto_VR_domain_0(L,TR,SL,SS):-
   clause(
     auto_VR_domain_0( L,TR,SL,SS),
     true
   ).


% debug: 23-4 Jun 2006 (redundant collection of rankings)

% negligence for the earlier 3-arity rules.
% debug: 30 Jun 2006 (removed a redundant rule)

auto_value_restricted_domain_by_triples_rec(L,SL,SS):-
   auto_value_restricted_domain_by_triples_rec(L,_,SL,SS).

auto_value_restricted_domain_by_triples_max(L,SL,SS):-
   auto_value_restricted_domain_by_triples_max(L,_,SL,SS).


% the semi-recursive construction with references of the tentative data.

auto_value_restricted_domain_by_triples_rec(L,TR,SL,SS):-
   \+ exist_auto_VR_domain_0(_,TR,_,_),
%   findall(S,possible_ranking_0(S,_),TR),
   (var(TR)->all_possible_rankings_0(TR);true),
   auto_value_restricted_domain_by_triples_max(L,TR,SL,SS),
   display_first_encounter(L).

auto_value_restricted_domain_by_triples_rec(L,TR,SL,SS):-
   \+ \+ exist_auto_VR_domain_0(_,_,_,_),
%   findall(S,possible_ranking_0(S,_),TR),
   (var(TR)->all_possible_rankings_0(TR);true),
   auto_VR_domain_ref(L,TR,SL,SS,rec).


% the earlier, fully recursive, construction without references.

auto_value_restricted_domain_by_triples_max(L,TR,SL,SS):-
%   findall(S,possible_ranking_0(S,_),TR),
   (var(TR)->all_possible_rankings_0(TR);true),
   auto_VR_domain_ref(L,TR,SL,SS,max).

auto_VR_domain_ref(L,TR,SL,SS,_):-
   exist_auto_VR_domain_0(L,TR,SL,SS).

auto_VR_domain_ref(L,TR,SL,SS,rec):-
   \+ exist_auto_VR_domain_0(L,TR,SL,SS),
   auto_VR_domain(L,TR,SL,SS),
   sort(L,L1),
   assert(
     auto_VR_domain_0( L1,TR,SL,SS)
   ).

auto_VR_domain_ref(L,TR,SL,SS,max):-
   \+ exist_auto_VR_domain_0(L,TR,SL,SS),
   auto_VR_domain(1,L,TR,SL,SS),
   assert(
     auto_VR_domain_0( L,TR,SL,SS)
   ).


% the subsidiary: a construction with references of recursion records.

auto_VR_domain([R|L],[R|_],SL,SS):-
   exist_auto_VR_domain_0(L,_,SL,SS),
   \+ member(R,L),
   value_restriction_for_triples(SS,SL, [R]),
   display_suc_messeage(L,R).

auto_VR_domain(L,[_|TR],SL,SS):-
   auto_VR_domain(L,TR,SL,SS).

auto_VR_domain([],[],_,_).
   
display_suc_messeage(L,R):-
   length([R|L],N),
   nl,
   write(N:' successfully expanded by adding a ranking :'),
   nl,
   write(R).

display_first_encounter(L):-
   length(L,N),
   write('starting from a domain of the lower bound '),
   nl,
   write(N:L).

% a run 19 Jun 2006.
/*

?- abolish(auto_VR_domain_0/4).

Yes
?- test_sup_vr_by_triples(P/N,5).
start, [date(2006/6/19), time(12:2:9)]
complete
successfully expanded by adding a ranking :
r((4, 4, 3))complete
successfully expanded by adding a ranking :
r((4, 3, 3))complete
successfully expanded by adding a ranking :
r((6, 4, 5))complete
successfully expanded by adding a ranking :
r((6, 4, 4))complete

P = 21
N = 120 

Yes
?- 

*/


% a construction (probably correct)

auto_VR_domain(1,[R|L],[R|TR],SL,SS):-
   value_restriction_for_triples(SS,SL, [R]),
   auto_VR_domain(1,L,TR, SL,SS).
auto_VR_domain(1,L,[_|TR],SL,SS):-
   auto_VR_domain(1,L,TR, SL,SS).
auto_VR_domain(_,[],[],_,_).


% a problematic constructuin (not correct. first domain only.)

auto_VR_domain(2,RL,[R|TR],SL,SS):-
   auto_VR_domain(2,L,TR, SL,SS),
   (
    value_restriction_for_triples(SS,SL, [R])
    ->(RL=[R|L] ) %; RL=L)
    ; RL=L
   ).


% another problematic construction (order sensitive)
/*
auto_VR_domain(3,RL,[R|TR],SL,SS):-
   auto_VR_domain(3,L,TR, SL,SS),
   value_restriction_for_triples(SS,SL, [R]),
   RL=[R|L].
auto_VR_domain(3,L,[_|TR],SL,SS):-
   auto_VR_domain(3,L,TR, SL,SS).
*/


/*

% 5/29 a run.

?- [sproof_f],setup_K_alt_domain(4,A),
auto_value_restricted_domain_by_triples_max(L,SL,vr),length(L,N),N>8.
% sproof_f compiled 0.02 sec, 80 bytes

A = [a, b, c, d]
L = [r((1, 5)), r((3, 5)), r((3, 4)), r((4, 5)), r((4, 4)), r((4, 3)), r((4, 2)), r((..., ...)), r(...)]
SL = [sp: (a, b, c):b, sc: (a, b, d):a, sc: (a, c, d):a, sp: (b, c, d):b]
N = 9 

Yes
?- 


*/


% a test of recursion.

te_r([],[]).
te_r([A|B],[A|D]):-
   te_r(B,D),
   member(A,[1,3,5]).
te_r(B,[_|D]):-
   te_r(B,D).

te_r1([],[]).
te_r1(AB,[A|D]):-
   te_r1(B,D),
   (member(A,[1,3,5])
   ->(AB=[A|B];AB=B)
   ; AB=B
   ).



% the alternating scheme by Fishburn
%-------------------------------------------------
% added: 1 Jun 2006

:- dynamic is_alternating_scheme_active/2.

is_alternating_scheme_active(1,yes).
is_alternating_scheme_active(2,yes).
%is_alternating_scheme_active(2,no).

switch_alternating_scheme(I,yes->no):-
   retract(is_alternating_scheme_active(I,yes)),
   assert(is_alternating_scheme_active(I,no)).
switch_alternating_scheme(I,no->yes):-
   retract(is_alternating_scheme_active(I,no)),
   assert(is_alternating_scheme_active(I,yes)).

off_alternating_scheme:-
   forall(
     is_alternating_scheme_active(I,yes),
     switch_alternating_scheme(I,yes->no)
   ).


% a generalized rule
% added: 17 Jun 2006. However, this makes a bit slower.

alternating_scheme(_,(_,X,_),X,_,_):-
   \+ is_alternating_scheme_active(_,yes).

%/*
alternating_scheme(V,(_,X,_),X,Parity,AS):-
   set_of_alternatives(A),
   nth1(K,A,X),
   (0 is K mod 2->Parity=even;Parity=odd),
   is_alternating_scheme_active(AS,yes),
   member((AS,Parity,V),[
     (1,even, sc),
     (1,odd, sp),
     (2,even, sp),
     (2,odd, sc)
   ]).
%*/
%
/*
alternating_scheme(V,(_,X,_),X,Parity,1):-
   is_alternating_scheme_active(1,yes),
   set_of_alternatives(A),
   nth1(K,A,X),
   (0 is K mod 2->Parity=even;Parity=odd),
   member((Parity,V),[
     (even, sc),
     (odd, sp)
   ]).

alternating_scheme(V,(_,X,_),X,Parity,2):-
   is_alternating_scheme_active(2,yes),
   set_of_alternatives(A),
   nth1(K,A,X),
   (0 is K mod 2->Parity=even;Parity=odd),
   member((Parity,V),[
     (even, sp),
     (odd, sc)
   ]).
%
*/


% VR domain by all triples for a set of rankings
%-------------------------------------------------

value_restriction_for_triples( SS, SL, RL):-
   findall(T, triple_of_alternative(T),TL),
   value_restriction_for_triples_1( SS, TL, SL, RL).

value_restriction_for_triples( SS, SL, RL):-
   findall(T, triple_of_alternative(T),TL),
   value_restriction_for_triples_1_1( SS, TL, SL, RL).

value_restriction_for_triples_1( _, [], [], _).
value_restriction_for_triples_1( SS, [T|TL], [V:T:X|SL], RL):-
   value_restriction_for_triples_1( SS, TL, SL, RL),
   alternating_scheme(V,T,X,_,1),
   value_restriction_for_triples_2( SS, RL, T, V, X).

value_restriction_for_triples_1_1( _, [], [], _).
value_restriction_for_triples_1_1( SS, [T|TL], [V:T:X|SL], RL):-
   value_restriction_for_triples_1_1( SS, TL, SL, RL),
   alternating_scheme(V,T,X,_,2),
   value_restriction_for_triples_2( SS, RL, T, V, X).

value_restriction_for_triples_2( SS, RL, T, Sx, W):-
   (SS == vr; SS == [vr]),
   T=(X,Y,Z),
   member(W,[X,Y,Z]),
   type_of_value_restriction( Sx,agree_on(C),_),
   value_restriction_in_rankings( Sx, (C,W), T, RL).

value_restriction_for_triples_2( SS, RL, T, Sx, W):-
%   \+ (SS == vr),             % debug: 23-4 Jun 2006
   \+ (SS == vr; SS == [vr]),
   T=(X,Y,Z),
   member(W,[X,Y,Z]),
   member(Sx, SS),
   value_restriction_in_rankings( Sx, (_C,W), T, RL).


/*
% (alternative) check all the vr subrules  alternative.

value_restriction_for_triples_2( SS, RL, T, V, W):-
   T=(X,Y,Z),
   member(W,[X,Y,Z]),
   findall(Sx,
    (
     type_of_value_restriction( Sx,agree_on(C),_),
     (SS=vr->member(Sx,[sp,sc,s2]);member(Sx, SS)),
     value_restriction_in_rankings( Sx, (C,W), T, RL)
    ),
   V0),
   V0 \= [],
   sort(V0,V).
*/

/*

% (depreciated) a faster alternative.
% but it can not be consistently used in current version.

value_restriction_for_triples( vr, T, XL, vr):-
   \+ involves_latin_square_for_triple(XL,T),
   !.

*/

% an earlier version of value_restriction_for_triples.
%-------------------------------------------------
% revised: 18 Jun 2006.

value_restriction_r( SS, SL, M):-
   member(M, [no, yes, max]),
   findall(T, triple_of_alternative(T),TL),
   value_restriction_r( SS, TL, SL, M).

value_restriction_r( _, [], [],_).
value_restriction_r( SS, [T|TL], [V1:T|SL],M):-
   value_restriction_r( SS, TL, SL,M),
   findall(Sx,
    (
     type_of_value_restriction( Sx,agree_on(C),_),
     (var(SS)->true;member(Sx, SS)),
     value_restriction( Sx, C, T)
    ),
   V),
   (member(M,[yes,max])->V \= [];true),
   (M=max->relative_domain_for_triple(T,_,_,[_,_,_,_]);true),
   sort(V,V1).


% generating VR domains with commitment to the database
%-------------------------------------------------

filter_on_size_of_domain(N/P):-
%   findall(1, possible_ranking_0(_,_), L),
   all_possible_rankings_0(L,P),
%   length(L,P),
   nth1(N,L,_).

auto_vr_domains_of_size(N,H,SL,M):-
   auto_vr_domains_of_size(N,H,SL,M,[vr]).

auto_vr_domains_of_size(N,H,SL,M,SS):-
   filter_on_size_of_domain(N/_),
%   auto_vr_domains_of_size_1_pre(N,M),
   auto_vr_domains_of_size_1(N,H,SL,M,SS),
   abolish(admissible_rankings/1),
   assert(admissible_rankings(H)).

auto_vr_domains_of_size_1_pre(N,M):-
   mode_of_analysis(K-alternatives,_),
   E is 2^(K-1),
   (Nmember(M,[yes,max])
     ; M=max
   ).

auto_vr_domains_of_size_1(N,H,SL,yes,SS):-
   length(H,N),
   auto_value_restricted_domain_by_triples(H,SL,SS).

auto_vr_domains_of_size_1(N,H,SL,max,SS):-
   length(H,N),
   auto_value_restricted_domain_by_triples_max(H,SL,SS).


auto_vr_domains_of_size_old(N,H,SL,M):-
   length(H,N),
   member(M,[yes,max]),
   auto_restricted_domain(H),
   value_restriction_r(_,SL,M).

display_domain_for_triples(H,SL):-
   nl,write(H),
   CollectVR =  (
     findall(Sx,
       value_restriction_in_rankings( Sx,_, T, H),
     SSx),
     sort(SSx,VR)
   ),
   forall(
     relative_domain_for_triple(T,H,_,RE),
    (
     member(V:T,SL),
     (V \= vr -> VR =V ; CollectVR),
     nl,write(T:RE:VR)
    )
   ).


/*

?- length(H,8),auto_restricted_domain(H),
value_restriction_r(_,SL,yes).

H = [r((1, 5, 6)), r((1, 5, 5)), r((1, 5, 4)), r((1, 5, 3)), r((1, 5, 2)), r((1, 4, 6)), r((1, ..., ...)), r((..., ...))]
SL = [[s2, sc, sp]: (a, b, c), [sc, sp]: (a, b, d), [sc, sp]: (a, b, e), [sc, sp]: (a, c, d), [sc, sp]: (a, c, e), [sc]: (a, d, e), [sc|...]: (b, ..., ...), [...|...]: (..., ...), ... :...|...] 

Yes
?- test_domain_for_triple(T,L,RT,RE),nl,write(T:RE),fail.

(a, b, c):[1]
(a, b, d):[1, 2, 5]
(a, b, e):[1, 2, 5]
(a, c, d):[1, 2, 5]
(a, c, e):[1, 2, 5]
(a, d, e):[3, 4, 5, 6]
(b, c, d):[1, 2, 5]
(b, c, e):[1, 2, 5]
(b, d, e):[3, 4, 5, 6]
(c, d, e):[3, 4, 5, 6]

No
?- 

*/


% generating s2 (separability into two groups) domains
%-------------------------------------------------
% 28-9 May, 1 Jun 2006.
% (status: under construction or pending. not correct.)

partition_of_alternatives_into_two_groups(A,[B,C]):-
   set_of_alternatives(A),
   list_projection(B,A,_),
   B\=A,
   B\=[],
   subtract(A,B,C).

analyze_s2_restricted_domain([B,C],L):-
   \+ var(B),  % usable only for the verification.
%    partition_of_alternatives_into_two_groups(_,[B,C])
   (var(L)->auto_s2_restricted_domain(L);true),
   \+ (
     member(R,L),
     unable_to_separate_into_two_groups([B,C],_,R)
   ).

unable_to_separate_into_two_groups([B,C],(X,Y,Z),R):-
   member((T,U),[(B,C),(C,B)]),
   member(X,T),
   member(Y,U),
   member(Z,U),
%   Z\=Y,
   prefer_x_to_y_0(X,Y,R),
   prefer_x_to_y_0(Z,X,R).

unable_to_separate_into_two_groups([B,C],(X,Y,Z),R):-
   member((T,_),[(B,C),(C,B)]),
   member(X,T),
   member(Y,T),
   member(Z,T),
%   Z\=Y,
   prefer_x_to_y_0(X,Y,R),
   prefer_x_to_y_0(Z,X,R).

auto_s2_restricted_domain(L,[B,C]):-
%   findall(S,possible_ranking_0(S,_),TR),
   all_possible_rankings_0(TR),
   partition_of_alternatives_into_two_groups(_,[B,C]),
   auto_s2_domain(L,TR,[B,C]).

auto_s2_domain([],[],_).
auto_s2_domain([R|L],[R|TR],[B,C]):-
   \+ unable_to_separate_into_two_groups([B,C],_,R),
   auto_s2_domain(L,TR,[B,C]),
   filter_of_auto_s2_domain(R,L,[B,C]).
auto_s2_domain(L,[_|TR],[B,C]):-
   auto_s2_domain(L,TR,[B,C]).

filter_of_auto_s2_domain(R,L,[B,C]):-
   \+ (
     involves_latin_square_for_triple([R|L],(X,Y,Z)),
     member(D,[B,C]),
     subset([X,Y,Z],D)
   ).


% demo (1 Jun 2006)

/*

?- setup_K_alt_domain(3,L).

L = [a, b, c] 

Yes
?- auto_s2_restricted_domain(L,[B,C]).

L = [r(1), r(3), r(5), r(6)]
B = [a, b]
C = [c] ;

L = [r(1), r(3), r(5)]
B = [a, b]
C = [c] 

Yes
?- auto_s2_restricted_domain(L,[B,C]),
  involves_latin_square_for_triple(L,(X,Y,Z)).

No
?- 
?- setup_K_alt_domain(4,K).

K = [a, b, c, d] 

Yes
?- auto_s2_restricted_domain(L,[B,C]),
display_domain_for_triples(L,_).

[r((1, 4)), r((1, 1)), r((2, 4)), r((2, 1)), r((3, 4)), r((3, 1)), r((4, 4)), r((4, 1))]
(a, b, c):[1, 2, 3, 4]:[sc]
(a, b, d):[1, 3, 5, 6]:[s2]
(a, c, d):[1, 3, 5, 6]:[s2]
(b, c, d):[1, 3, 5, 6]:[s2]

L = [r((1, 4)), r((1, 1)), r((2, 4)), r((2, 1)), r((3, 4)), r((3, 1)), r((4, 4)), r((..., ...))]
B = [a, b, c]
C = [d] 

Yes
?- 

?- length(L,9),auto_s2_restricted_domain(L,[B,C]),
display_domain_for_triples(L,_),
(involves_latin_square_for_triple(L,(X,Y,Z))->I=0;I=1).

No
?- length(L,8),auto_s2_restricted_domain(L,[B,C]),
display_domain_for_triples(L,_),
(involves_latin_square_for_triple(L,(X,Y,Z))->I=0;I=1),
    nl,write(latin(I)),fail.

[r((1, 2)), r((1, 1)), r((3, 2)), r((3, 1)), r((5, 4)), r((5, 3)), r((6, 4)), r((6, 3))]
(a, b, c):[1, 3, 5, 6]:[s2]
(a, b, d):[1, 3, 5, 6]:[s2]
(a, c, d):[1, 2, 4, 6]:[s2]
(b, c, d):[1, 2, 4, 6]:[s2]
latin(1)
[r((2, 2)), r((2, 1)), r((3, 4)), r((3, 3)), r((4, 4)), r((4, 3)), r((5, 2)), r((5, 1))]
(a, b, c):[2, 3, 4, 5]:[s2]
(a, b, d):[1, 2, 4, 6]:[s2]
(a, c, d):[1, 3, 5, 6]:[s2]
(b, c, d):[2, 3, 4, 5]:[s2]
latin(1)
[r((1, 4)), r((1, 3)), r((2, 4)), r((2, 3)), r((4, 2)), r((4, 1)), r((6, 2)), r((6, 1))]
(a, b, c):[1, 2, 4, 6]:[s2]
(a, b, d):[2, 3, 4, 5]:[s2]
(a, c, d):[2, 3, 4, 5]:[s2]
(b, c, d):[1, 3, 5, 6]:[s2]
latin(1)
[r((1, 4)), r((1, 3)), r((2, 4)), r((2, 3)), r((4, 2)), r((4, 1)), r((6, 2)), r((6, 1))]
(a, b, c):[1, 2, 4, 6]:[s2]
(a, b, d):[2, 3, 4, 5]:[s2]
(a, c, d):[2, 3, 4, 5]:[s2]
(b, c, d):[1, 3, 5, 6]:[s2]
latin(1)
[r((2, 2)), r((2, 1)), r((3, 4)), r((3, 3)), r((4, 4)), r((4, 3)), r((5, 2)), r((5, 1))]
(a, b, c):[2, 3, 4, 5]:[s2]
(a, b, d):[1, 2, 4, 6]:[s2]
(a, c, d):[1, 3, 5, 6]:[s2]
(b, c, d):[2, 3, 4, 5]:[s2]
latin(1)
[r((1, 2)), r((1, 1)), r((3, 2)), r((3, 1)), r((5, 4)), r((5, 3)), r((6, 4)), r((6, 3))]
(a, b, c):[1, 3, 5, 6]:[s2]
(a, b, d):[1, 3, 5, 6]:[s2]
(a, c, d):[1, 2, 4, 6]:[s2]
(b, c, d):[1, 2, 4, 6]:[s2]
latin(1)
?- 

*/


max_s2_restricted_domain(L,[B,C]):-
%   findall(S,possible_ranking_0(S,_),TR),
   all_possible_rankings_0(TR),
   partition_of_alternatives_into_two_groups(_,[B,C]),
   max_s2_domain(L,TR,[B,C]).

max_s2_domain([],[],_).
max_s2_domain(RL,[R|TR],[B,C]):-
   max_s2_domain(L,TR,[B,C]),
   (
    unable_to_separate_into_two_groups([B,C],_,R)
    -> RL = L 
    ;  RL = [R|L] 
   ).

% a version
%-------------------------------------------------


max_s2_restricted_domain_1(L,SL):-
%   findall(S,possible_ranking_0(S,_),TR),
   all_possible_rankings_0(TR),
   max_s2_domain_1(L,TR,SL).

max_s2_domain_1([],[],_).
max_s2_domain_1([R|L],[R|TR],SL2):-
   max_s2_domain_1(L,TR,SL),
   value_restriction_t( s2, SL1, [R]),
   (var(SL)->SL2=SL1;findall((T,VR2),
    (
     member( (T,VR), SL),
     member( (T,VR1), SL1),
     intersection( VR,VR1,VR2)
    ),
   SL2)),
   \+ member((_,[]),SL2).
max_s2_domain_1(L,[_|TR],SL):-
   max_s2_domain_1(L,TR,SL).

value_restriction_t( SS, SL, L):-
   findall(T, triple_of_alternative(T),TL),
   value_restriction_t( SS, TL, SL, L).

value_restriction_t( _, [], [],_).
value_restriction_t( Sx, [T|TL], [(T,VR)|SL],L):-
   value_restriction_t( Sx, TL, SL,L),
   findall((Sx,B),
    (
     value_restriction_in_rankings( Sx, (_,B), T, L)
    ),
   VR).
%value_restriction_t( Sx, [_|TL], SL,L):-
%   value_restriction_t( Sx, TL, SL,L).

/*

?- [sproof_f],
setup_K_alt_domain(3,_),
auto_s2_restricted_domain(L,[B,C]),
length(L,4),nl,write(L:[B,C]),fail.
% sproof_f compiled 0.02 sec, 92 bytes

[r(1), r(3), r(5), r(6)]:[[a, b], [c]]
[r(2), r(3), r(4), r(5)]:[[a, c], [b]]
[r(1), r(2), r(4), r(6)]:[[a], [b, c]]
[r(1), r(2), r(4), r(6)]:[[b, c], [a]]
[r(2), r(3), r(4), r(5)]:[[b], [a, c]]
[r(1), r(3), r(5), r(6)]:[[c], [a, b]]

No
?- [sproof_f],
setup_K_alt_domain(3,_),
auto_s2_restricted_domain(L,[B,C]),
\+ analyze_s2_restricted_domain(_,L).
% sproof_f compiled 0.02 sec, 1,048 bytes

No
?-

% 4-alternative case

?- max_s2_restricted_domain(L,[B,C]),length(L,N),
nl,write(s2:[B,C]:N:L),fail.

s2:[[a, b, c], [d]]:12:[r((1, 5)), r((1, 2)), r((2, 5)), r((2, 2)), r((3, 5)), r((3, 2)), r((4, 5)), r((4, 2)), r((5, 5)), r((5, 2)), r((6, 5)), r((6, 2))]
s2:[[a, b, d], [c]]:12:[r((1, 5)), r((1, 4)), r((1, 3)), r((3, 5)), r((3, 4)), r((3, 3)), r((5, 4)), r((5, 3)), r((5, 2)), r((6, 4)), r((6, 3)), r((6, 2))]
s2:[[a, b], [c, d]]:8:[r((1, 3)), r((1, 2)), r((3, 3)), r((3, 2)), r((5, 5)), r((5, 4)), r((6, 5)), r((6, 4))]
s2:[[a, c, d], [b]]:12:[r((2, 5)), r((2, 4)), r((2, 3)), r((3, 4)), r((3, 3)), r((3, 2)), r((4, 4)), r((4, 3)), r((4, 2)), r((5, 5)), r((5, 4)), r((5, 3))]
s2:[[a, c], [b, d]]:8:[r((2, 3)), r((2, 2)), r((3, 5)), r((3, 4)), r((4, 5)), r((4, 4)), r((5, 3)), r((5, 2))]
s2:[[a, d], [b, c]]:8:[r((1, 5)), r((1, 4)), r((2, 5)), r((2, 4)), r((4, 3)), r((4, 2)), r((6, 3)), r((6, 2))]
s2:[[a], [b, c, d]]:12:[r((1, 4)), r((1, 3)), r((1, 2)), r((2, 4)), r((2, 3)), r((2, 2)), r((4, 5)), r((4, 4)), r((4, 3)), r((6, 5)), r((6, 4)), r((6, 3))]
s2:[[b, c, d], [a]]:12:[r((1, 4)), r((1, 3)), r((1, 2)), r((2, 4)), r((2, 3)), r((2, 2)), r((4, 5)), r((4, 4)), r((4, 3)), r((6, 5)), r((6, 4)), r((6, 3))]
s2:[[b, c], [a, d]]:8:[r((1, 5)), r((1, 4)), r((2, 5)), r((2, 4)), r((4, 3)), r((4, 2)), r((6, 3)), r((6, 2))]
s2:[[b, d], [a, c]]:8:[r((2, 3)), r((2, 2)), r((3, 5)), r((3, 4)), r((4, 5)), r((4, 4)), r((5, 3)), r((5, 2))]
s2:[[b], [a, c, d]]:12:[r((2, 5)), r((2, 4)), r((2, 3)), r((3, 4)), r((3, 3)), r((3, 2)), r((4, 4)), r((4, 3)), r((4, 2)), r((5, 5)), r((5, 4)), r((5, 3))]
s2:[[c, d], [a, b]]:8:[r((1, 3)), r((1, 2)), r((3, 3)), r((3, 2)), r((5, 5)), r((5, 4)), r((6, 5)), r((6, 4))]
s2:[[c], [a, b, d]]:12:[r((1, 5)), r((1, 4)), r((1, 3)), r((3, 5)), r((3, 4)), r((3, 3)), r((5, 4)), r((5, 3)), r((5, 2)), r((6, 4)), r((6, 3)), r((6, 2))]
s2:[[d], [a, b, c]]:12:[r((1, 5)), r((1, 2)), r((2, 5)), r((2, 2)), r((3, 5)), r((3, 2)), r((4, 5)), r((4, 2)), r((5, 5)), r((5, 2)), r((6, 5)), r((6, 2))]

No
?-

?- [menu].
% menu compiled 0.00 sec, 0 bytes

Yes
?- tell_goal('max_s2.txt', (
  [sproof_f],setup_K_alt_domain(5,_),
max_s2_restricted_domain(L,[B,C]),length(L,N),
nl,write(s2:[B,C]:N:L),fail);true).
% sproof_f compiled 0.02 sec, 68 bytes
complete

L = _G172
B = _G166
C = _G169
N = _G176 

Yes
?- 

% file output start time , [date(2006/5/28), time(18:10:23)]

%----------  start from here ------------%

s2:[[a, b, c, d], [e]]:48:[r((1, 5, 6)), r((1, 5, 2)), r((1, 4, 6)), r((1, 4, 2)), r((1, 3, 6)), r((1, 3, 2)), r((1, 2, 6)), r((1, 2, 2)), r((2, 5, 6)), r((2, 5, 2)), r((2, 4, 6)), r((2, 4, 2)), r((2, 3, 6)), r((2, 3, 2)), r((2, 2, 6)), r((2, 2, 2)), r((3, 5, 6)), r((3, 5, 2)), r((3, 4, 6)), r((3, 4, 2)), r((3, 3, 6)), r((3, 3, 2)), r((3, 2, 6)), r((3, 2, 2)), r((4, 5, 6)), r((4, 5, 2)), r((4, 4, 6)), r((4, 4, 2)), r((4, 3, 6)), r((4, 3, 2)), r((4, 2, 6)), r((4, 2, 2)), r((5, 5, 6)), r((5, 5, 2)), r((5, 4, 6)), r((5, 4, 2)), r((5, 3, 6)), r((5, 3, 2)), r((5, 2, 6)), r((5, 2, 2)), r((6, 5, 6)), r((6, 5, 2)), r((6, 4, 6)), r((6, 4, 2)), r((6, 3, 6)), r((6, 3, 2)), r((6, 2, 6)), r((6, 2, 2))]
s2:[[a, b, c, e], [d]]:48:[r((1, 5, 5)), r((1, 5, 4)), r((1, 5, 3)), r((1, 5, 2)), r((1, 2, 6)), r((1, 2, 5)), r((1, 2, 4)), r((1, 2, 3)), r((2, 5, 5)), r((2, 5, 4)), r((2, 5, 3)), r((2, 5, 2)), r((2, 2, 6)), r((2, 2, 5)), r((2, 2, 4)), r((2, 2, 3)), r((3, 5, 5)), r((3, 5, 4)), r((3, 5, 3)), r((3, 5, 2)), r((3, 2, 6)), r((3, 2, 5)), r((3, 2, 4)), r((3, 2, 3)), r((4, 5, 5)), r((4, 5, 4)), r((4, 5, 3)), r((4, 5, 2)), r((4, 2, 6)), r((4, 2, 5)), r((4, 2, 4)), r((4, 2, 3)), r((5, 5, 5)), r((5, 5, 4)), r((5, 5, 3)), r((5, 5, 2)), r((5, 2, 6)), r((5, 2, 5)), r((5, 2, 4)), r((5, 2, 3)), r((6, 5, 5)), r((6, 5, 4)), r((6, 5, 3)), r((6, 5, 2)), r((6, 2, 6)), r((6, 2, 5)), r((6, 2, 4)), r((6, 2, 3))]
s2:[[a, b, c], [d, e]]:24:[r((1, 5, 6)), r((1, 5, 5)), r((1, 2, 3)), r((1, 2, 2)), r((2, 5, 6)), r((2, 5, 5)), r((2, 2, 3)), r((2, 2, 2)), r((3, 5, 6)), r((3, 5, 5)), r((3, 2, 3)), r((3, 2, 2)), r((4, 5, 6)), r((4, 5, 5)), r((4, 2, 3)), r((4, 2, 2)), r((5, 5, 6)), r((5, 5, 5)), r((5, 2, 3)), r((5, 2, 2)), r((6, 5, 6)), r((6, 5, 5)), r((6, 2, 3)), r((6, 2, 2))]
s2:[[a, b, d, e], [c]]:48:[r((1, 5, 6)), r((1, 5, 5)), r((1, 5, 4)), r((1, 5, 3)), r((1, 4, 6)), r((1, 4, 5)), r((1, 4, 4)), r((1, 4, 3)), r((1, 3, 6)), r((1, 3, 5)), r((1, 3, 4)), r((1, 3, 3)), r((3, 5, 6)), r((3, 5, 5)), r((3, 5, 4)), r((3, 5, 3)), r((3, 4, 6)), r((3, 4, 5)), r((3, 4, 4)), r((3, 4, 3)), r((3, 3, 6)), r((3, 3, 5)), r((3, 3, 4)), r((3, 3, 3)), r((5, 4, 5)), r((5, 4, 4)), r((5, 4, 3)), r((5, 4, 2)), r((5, 3, 5)), r((5, 3, 4)), r((5, 3, 3)), r((5, 3, 2)), r((5, 2, 5)), r((5, 2, 4)), r((5, 2, 3)), r((5, 2, 2)), r((6, 4, 5)), r((6, 4, 4)), r((6, 4, 3)), r((6, 4, 2)), r((6, 3, 5)), r((6, 3, 4)), r((6, 3, 3)), r((6, 3, 2)), r((6, 2, 5)), r((6, 2, 4)), r((6, 2, 3)), r((6, 2, 2))]
s2:[[a, b, d], [c, e]]:24:[r((1, 5, 3)), r((1, 5, 2)), r((1, 4, 3)), r((1, 4, 2)), r((1, 3, 3)), r((1, 3, 2)), r((3, 5, 3)), r((3, 5, 2)), r((3, 4, 3)), r((3, 4, 2)), r((3, 3, 3)), r((3, 3, 2)), r((5, 4, 6)), r((5, 4, 5)), r((5, 3, 6)), r((5, 3, 5)), r((5, 2, 6)), r((5, 2, 5)), r((6, 4, 6)), r((6, 4, 5)), r((6, 3, 6)), r((6, 3, 5)), r((6, 2, 6)), r((6, 2, 5))]
s2:[[a, b, e], [c, d]]:24:[r((1, 3, 6)), r((1, 3, 5)), r((1, 3, 4)), r((1, 2, 6)), r((1, 2, 5)), r((1, 2, 4)), r((3, 3, 6)), r((3, 3, 5)), r((3, 3, 4)), r((3, 2, 6)), r((3, 2, 5)), r((3, 2, 4)), r((5, 5, 4)), r((5, 5, 3)), r((5, 5, 2)), r((5, 4, 4)), r((5, 4, 3)), r((5, 4, 2)), r((6, 5, 4)), r((6, 5, 3)), r((6, 5, 2)), r((6, 4, 4)), r((6, 4, 3)), r((6, 4, 2))]
s2:[[a, b], [c, d, e]]:24:[r((1, 3, 4)), r((1, 3, 3)), r((1, 3, 2)), r((1, 2, 4)), r((1, 2, 3)), r((1, 2, 2)), r((3, 3, 4)), r((3, 3, 3)), r((3, 3, 2)), r((3, 2, 4)), r((3, 2, 3)), r((3, 2, 2)), r((5, 5, 6)), r((5, 5, 5)), r((5, 5, 4)), r((5, 4, 6)), r((5, 4, 5)), r((5, 4, 4)), r((6, 5, 6)), r((6, 5, 5)), r((6, 5, 4)), r((6, 4, 6)), r((6, 4, 5)), r((6, 4, 4))]
s2:[[a, c, d, e], [b]]:48:[r((2, 5, 6)), r((2, 5, 5)), r((2, 5, 4)), r((2, 5, 3)), r((2, 4, 6)), r((2, 4, 5)), r((2, 4, 4)), r((2, 4, 3)), r((2, 3, 6)), r((2, 3, 5)), r((2, 3, 4)), r((2, 3, 3)), r((3, 4, 5)), r((3, 4, 4)), r((3, 4, 3)), r((3, 4, 2)), r((3, 3, 5)), r((3, 3, 4)), r((3, 3, 3)), r((3, 3, 2)), r((3, 2, 5)), r((3, 2, 4)), r((3, 2, 3)), r((3, 2, 2)), r((4, 4, 5)), r((4, 4, 4)), r((4, 4, 3)), r((4, 4, 2)), r((4, 3, 5)), r((4, 3, 4)), r((4, 3, 3)), r((4, 3, 2)), r((4, 2, 5)), r((4, 2, 4)), r((4, 2, 3)), r((4, 2, 2)), r((5, 5, 6)), r((5, 5, 5)), r((5, 5, 4)), r((5, 5, 3)), r((5, 4, 6)), r((5, 4, 5)), r((5, 4, 4)), r((5, 4, 3)), r((5, 3, 6)), r((5, 3, 5)), r((5, 3, 4)), r((5, 3, 3))]
s2:[[a, c, d], [b, e]]:24:[r((2, 5, 3)), r((2, 5, 2)), r((2, 4, 3)), r((2, 4, 2)), r((2, 3, 3)), r((2, 3, 2)), r((3, 4, 6)), r((3, 4, 5)), r((3, 3, 6)), r((3, 3, 5)), r((3, 2, 6)), r((3, 2, 5)), r((4, 4, 6)), r((4, 4, 5)), r((4, 3, 6)), r((4, 3, 5)), r((4, 2, 6)), r((4, 2, 5)), r((5, 5, 3)), r((5, 5, 2)), r((5, 4, 3)), r((5, 4, 2)), r((5, 3, 3)), r((5, 3, 2))]
s2:[[a, c, e], [b, d]]:24:[r((2, 3, 6)), r((2, 3, 5)), r((2, 3, 4)), r((2, 2, 6)), r((2, 2, 5)), r((2, 2, 4)), r((3, 5, 4)), r((3, 5, 3)), r((3, 5, 2)), r((3, 4, 4)), r((3, 4, 3)), r((3, 4, 2)), r((4, 5, 4)), r((4, 5, 3)), r((4, 5, 2)), r((4, 4, 4)), r((4, 4, 3)), r((4, 4, 2)), r((5, 3, 6)), r((5, 3, 5)), r((5, 3, 4)), r((5, 2, 6)), r((5, 2, 5)), r((5, 2, 4))]
s2:[[a, c], [b, d, e]]:24:[r((2, 3, 4)), r((2, 3, 3)), r((2, 3, 2)), r((2, 2, 4)), r((2, 2, 3)), r((2, 2, 2)), r((3, 5, 6)), r((3, 5, 5)), r((3, 5, 4)), r((3, 4, 6)), r((3, 4, 5)), r((3, 4, 4)), r((4, 5, 6)), r((4, 5, 5)), r((4, 5, 4)), r((4, 4, 6)), r((4, 4, 5)), r((4, 4, 4)), r((5, 3, 4)), r((5, 3, 3)), r((5, 3, 2)), r((5, 2, 4)), r((5, 2, 3)), r((5, 2, 2))]
s2:[[a, d, e], [b, c]]:24:[r((1, 5, 6)), r((1, 5, 5)), r((1, 5, 4)), r((1, 4, 6)), r((1, 4, 5)), r((1, 4, 4)), r((2, 5, 6)), r((2, 5, 5)), r((2, 5, 4)), r((2, 4, 6)), r((2, 4, 5)), r((2, 4, 4)), r((4, 3, 4)), r((4, 3, 3)), r((4, 3, 2)), r((4, 2, 4)), r((4, 2, 3)), r((4, 2, 2)), r((6, 3, 4)), r((6, 3, 3)), r((6, 3, 2)), r((6, 2, 4)), r((6, 2, 3)), r((6, 2, 2))]
s2:[[a, d], [b, c, e]]:24:[r((1, 5, 4)), r((1, 5, 3)), r((1, 5, 2)), r((1, 4, 4)), r((1, 4, 3)), r((1, 4, 2)), r((2, 5, 4)), r((2, 5, 3)), r((2, 5, 2)), r((2, 4, 4)), r((2, 4, 3)), r((2, 4, 2)), r((4, 3, 6)), r((4, 3, 5)), r((4, 3, 4)), r((4, 2, 6)), r((4, 2, 5)), r((4, 2, 4)), r((6, 3, 6)), r((6, 3, 5)), r((6, 3, 4)), r((6, 2, 6)), r((6, 2, 5)), r((6, 2, 4))]
s2:[[a, e], [b, c, d]]:24:[r((1, 4, 6)), r((1, 4, 5)), r((1, 3, 6)), r((1, 3, 5)), r((1, 2, 6)), r((1, 2, 5)), r((2, 4, 6)), r((2, 4, 5)), r((2, 3, 6)), r((2, 3, 5)), r((2, 2, 6)), r((2, 2, 5)), r((4, 5, 3)), r((4, 5, 2)), r((4, 4, 3)), r((4, 4, 2)), r((4, 3, 3)), r((4, 3, 2)), r((6, 5, 3)), r((6, 5, 2)), r((6, 4, 3)), r((6, 4, 2)), r((6, 3, 3)), r((6, 3, 2))]
s2:[[a], [b, c, d, e]]:48:[r((1, 4, 5)), r((1, 4, 4)), r((1, 4, 3)), r((1, 4, 2)), r((1, 3, 5)), r((1, 3, 4)), r((1, 3, 3)), r((1, 3, 2)), r((1, 2, 5)), r((1, 2, 4)), r((1, 2, 3)), r((1, 2, 2)), r((2, 4, 5)), r((2, 4, 4)), r((2, 4, 3)), r((2, 4, 2)), r((2, 3, 5)), r((2, 3, 4)), r((2, 3, 3)), r((2, 3, 2)), r((2, 2, 5)), r((2, 2, 4)), r((2, 2, 3)), r((2, 2, 2)), r((4, 5, 6)), r((4, 5, 5)), r((4, 5, 4)), r((4, 5, 3)), r((4, 4, 6)), r((4, 4, 5)), r((4, 4, 4)), r((4, 4, 3)), r((4, 3, 6)), r((4, 3, 5)), r((4, 3, 4)), r((4, 3, 3)), r((6, 5, 6)), r((6, 5, 5)), r((6, 5, 4)), r((6, 5, 3)), r((6, 4, 6)), r((6, 4, 5)), r((6, 4, 4)), r((6, 4, 3)), r((6, 3, 6)), r((6, 3, 5)), r((6, 3, 4)), r((6, 3, 3))]
s2:[[b, c, d, e], [a]]:48:[r((1, 4, 5)), r((1, 4, 4)), r((1, 4, 3)), r((1, 4, 2)), r((1, 3, 5)), r((1, 3, 4)), r((1, 3, 3)), r((1, 3, 2)), r((1, 2, 5)), r((1, 2, 4)), r((1, 2, 3)), r((1, 2, 2)), r((2, 4, 5)), r((2, 4, 4)), r((2, 4, 3)), r((2, 4, 2)), r((2, 3, 5)), r((2, 3, 4)), r((2, 3, 3)), r((2, 3, 2)), r((2, 2, 5)), r((2, 2, 4)), r((2, 2, 3)), r((2, 2, 2)), r((4, 5, 6)), r((4, 5, 5)), r((4, 5, 4)), r((4, 5, 3)), r((4, 4, 6)), r((4, 4, 5)), r((4, 4, 4)), r((4, 4, 3)), r((4, 3, 6)), r((4, 3, 5)), r((4, 3, 4)), r((4, 3, 3)), r((6, 5, 6)), r((6, 5, 5)), r((6, 5, 4)), r((6, 5, 3)), r((6, 4, 6)), r((6, 4, 5)), r((6, 4, 4)), r((6, 4, 3)), r((6, 3, 6)), r((6, 3, 5)), r((6, 3, 4)), r((6, 3, 3))]
s2:[[b, c, d], [a, e]]:24:[r((1, 4, 6)), r((1, 4, 5)), r((1, 3, 6)), r((1, 3, 5)), r((1, 2, 6)), r((1, 2, 5)), r((2, 4, 6)), r((2, 4, 5)), r((2, 3, 6)), r((2, 3, 5)), r((2, 2, 6)), r((2, 2, 5)), r((4, 5, 3)), r((4, 5, 2)), r((4, 4, 3)), r((4, 4, 2)), r((4, 3, 3)), r((4, 3, 2)), r((6, 5, 3)), r((6, 5, 2)), r((6, 4, 3)), r((6, 4, 2)), r((6, 3, 3)), r((6, 3, 2))]
s2:[[b, c, e], [a, d]]:24:[r((1, 5, 4)), r((1, 5, 3)), r((1, 5, 2)), r((1, 4, 4)), r((1, 4, 3)), r((1, 4, 2)), r((2, 5, 4)), r((2, 5, 3)), r((2, 5, 2)), r((2, 4, 4)), r((2, 4, 3)), r((2, 4, 2)), r((4, 3, 6)), r((4, 3, 5)), r((4, 3, 4)), r((4, 2, 6)), r((4, 2, 5)), r((4, 2, 4)), r((6, 3, 6)), r((6, 3, 5)), r((6, 3, 4)), r((6, 2, 6)), r((6, 2, 5)), r((6, 2, 4))]
s2:[[b, c], [a, d, e]]:24:[r((1, 5, 6)), r((1, 5, 5)), r((1, 5, 4)), r((1, 4, 6)), r((1, 4, 5)), r((1, 4, 4)), r((2, 5, 6)), r((2, 5, 5)), r((2, 5, 4)), r((2, 4, 6)), r((2, 4, 5)), r((2, 4, 4)), r((4, 3, 4)), r((4, 3, 3)), r((4, 3, 2)), r((4, 2, 4)), r((4, 2, 3)), r((4, 2, 2)), r((6, 3, 4)), r((6, 3, 3)), r((6, 3, 2)), r((6, 2, 4)), r((6, 2, 3)), r((6, 2, 2))]
s2:[[b, d, e], [a, c]]:24:[r((2, 3, 4)), r((2, 3, 3)), r((2, 3, 2)), r((2, 2, 4)), r((2, 2, 3)), r((2, 2, 2)), r((3, 5, 6)), r((3, 5, 5)), r((3, 5, 4)), r((3, 4, 6)), r((3, 4, 5)), r((3, 4, 4)), r((4, 5, 6)), r((4, 5, 5)), r((4, 5, 4)), r((4, 4, 6)), r((4, 4, 5)), r((4, 4, 4)), r((5, 3, 4)), r((5, 3, 3)), r((5, 3, 2)), r((5, 2, 4)), r((5, 2, 3)), r((5, 2, 2))]
s2:[[b, d], [a, c, e]]:24:[r((2, 3, 6)), r((2, 3, 5)), r((2, 3, 4)), r((2, 2, 6)), r((2, 2, 5)), r((2, 2, 4)), r((3, 5, 4)), r((3, 5, 3)), r((3, 5, 2)), r((3, 4, 4)), r((3, 4, 3)), r((3, 4, 2)), r((4, 5, 4)), r((4, 5, 3)), r((4, 5, 2)), r((4, 4, 4)), r((4, 4, 3)), r((4, 4, 2)), r((5, 3, 6)), r((5, 3, 5)), r((5, 3, 4)), r((5, 2, 6)), r((5, 2, 5)), r((5, 2, 4))]
s2:[[b, e], [a, c, d]]:24:[r((2, 5, 3)), r((2, 5, 2)), r((2, 4, 3)), r((2, 4, 2)), r((2, 3, 3)), r((2, 3, 2)), r((3, 4, 6)), r((3, 4, 5)), r((3, 3, 6)), r((3, 3, 5)), r((3, 2, 6)), r((3, 2, 5)), r((4, 4, 6)), r((4, 4, 5)), r((4, 3, 6)), r((4, 3, 5)), r((4, 2, 6)), r((4, 2, 5)), r((5, 5, 3)), r((5, 5, 2)), r((5, 4, 3)), r((5, 4, 2)), r((5, 3, 3)), r((5, 3, 2))]
s2:[[b], [a, c, d, e]]:48:[r((2, 5, 6)), r((2, 5, 5)), r((2, 5, 4)), r((2, 5, 3)), r((2, 4, 6)), r((2, 4, 5)), r((2, 4, 4)), r((2, 4, 3)), r((2, 3, 6)), r((2, 3, 5)), r((2, 3, 4)), r((2, 3, 3)), r((3, 4, 5)), r((3, 4, 4)), r((3, 4, 3)), r((3, 4, 2)), r((3, 3, 5)), r((3, 3, 4)), r((3, 3, 3)), r((3, 3, 2)), r((3, 2, 5)), r((3, 2, 4)), r((3, 2, 3)), r((3, 2, 2)), r((4, 4, 5)), r((4, 4, 4)), r((4, 4, 3)), r((4, 4, 2)), r((4, 3, 5)), r((4, 3, 4)), r((4, 3, 3)), r((4, 3, 2)), r((4, 2, 5)), r((4, 2, 4)), r((4, 2, 3)), r((4, 2, 2)), r((5, 5, 6)), r((5, 5, 5)), r((5, 5, 4)), r((5, 5, 3)), r((5, 4, 6)), r((5, 4, 5)), r((5, 4, 4)), r((5, 4, 3)), r((5, 3, 6)), r((5, 3, 5)), r((5, 3, 4)), r((5, 3, 3))]
s2:[[c, d, e], [a, b]]:24:[r((1, 3, 4)), r((1, 3, 3)), r((1, 3, 2)), r((1, 2, 4)), r((1, 2, 3)), r((1, 2, 2)), r((3, 3, 4)), r((3, 3, 3)), r((3, 3, 2)), r((3, 2, 4)), r((3, 2, 3)), r((3, 2, 2)), r((5, 5, 6)), r((5, 5, 5)), r((5, 5, 4)), r((5, 4, 6)), r((5, 4, 5)), r((5, 4, 4)), r((6, 5, 6)), r((6, 5, 5)), r((6, 5, 4)), r((6, 4, 6)), r((6, 4, 5)), r((6, 4, 4))]
s2:[[c, d], [a, b, e]]:24:[r((1, 3, 6)), r((1, 3, 5)), r((1, 3, 4)), r((1, 2, 6)), r((1, 2, 5)), r((1, 2, 4)), r((3, 3, 6)), r((3, 3, 5)), r((3, 3, 4)), r((3, 2, 6)), r((3, 2, 5)), r((3, 2, 4)), r((5, 5, 4)), r((5, 5, 3)), r((5, 5, 2)), r((5, 4, 4)), r((5, 4, 3)), r((5, 4, 2)), r((6, 5, 4)), r((6, 5, 3)), r((6, 5, 2)), r((6, 4, 4)), r((6, 4, 3)), r((6, 4, 2))]
s2:[[c, e], [a, b, d]]:24:[r((1, 5, 3)), r((1, 5, 2)), r((1, 4, 3)), r((1, 4, 2)), r((1, 3, 3)), r((1, 3, 2)), r((3, 5, 3)), r((3, 5, 2)), r((3, 4, 3)), r((3, 4, 2)), r((3, 3, 3)), r((3, 3, 2)), r((5, 4, 6)), r((5, 4, 5)), r((5, 3, 6)), r((5, 3, 5)), r((5, 2, 6)), r((5, 2, 5)), r((6, 4, 6)), r((6, 4, 5)), r((6, 3, 6)), r((6, 3, 5)), r((6, 2, 6)), r((6, 2, 5))]
s2:[[c], [a, b, d, e]]:48:[r((1, 5, 6)), r((1, 5, 5)), r((1, 5, 4)), r((1, 5, 3)), r((1, 4, 6)), r((1, 4, 5)), r((1, 4, 4)), r((1, 4, 3)), r((1, 3, 6)), r((1, 3, 5)), r((1, 3, 4)), r((1, 3, 3)), r((3, 5, 6)), r((3, 5, 5)), r((3, 5, 4)), r((3, 5, 3)), r((3, 4, 6)), r((3, 4, 5)), r((3, 4, 4)), r((3, 4, 3)), r((3, 3, 6)), r((3, 3, 5)), r((3, 3, 4)), r((3, 3, 3)), r((5, 4, 5)), r((5, 4, 4)), r((5, 4, 3)), r((5, 4, 2)), r((5, 3, 5)), r((5, 3, 4)), r((5, 3, 3)), r((5, 3, 2)), r((5, 2, 5)), r((5, 2, 4)), r((5, 2, 3)), r((5, 2, 2)), r((6, 4, 5)), r((6, 4, 4)), r((6, 4, 3)), r((6, 4, 2)), r((6, 3, 5)), r((6, 3, 4)), r((6, 3, 3)), r((6, 3, 2)), r((6, 2, 5)), r((6, 2, 4)), r((6, 2, 3)), r((6, 2, 2))]
s2:[[d, e], [a, b, c]]:24:[r((1, 5, 6)), r((1, 5, 5)), r((1, 2, 3)), r((1, 2, 2)), r((2, 5, 6)), r((2, 5, 5)), r((2, 2, 3)), r((2, 2, 2)), r((3, 5, 6)), r((3, 5, 5)), r((3, 2, 3)), r((3, 2, 2)), r((4, 5, 6)), r((4, 5, 5)), r((4, 2, 3)), r((4, 2, 2)), r((5, 5, 6)), r((5, 5, 5)), r((5, 2, 3)), r((5, 2, 2)), r((6, 5, 6)), r((6, 5, 5)), r((6, 2, 3)), r((6, 2, 2))]
s2:[[d], [a, b, c, e]]:48:[r((1, 5, 5)), r((1, 5, 4)), r((1, 5, 3)), r((1, 5, 2)), r((1, 2, 6)), r((1, 2, 5)), r((1, 2, 4)), r((1, 2, 3)), r((2, 5, 5)), r((2, 5, 4)), r((2, 5, 3)), r((2, 5, 2)), r((2, 2, 6)), r((2, 2, 5)), r((2, 2, 4)), r((2, 2, 3)), r((3, 5, 5)), r((3, 5, 4)), r((3, 5, 3)), r((3, 5, 2)), r((3, 2, 6)), r((3, 2, 5)), r((3, 2, 4)), r((3, 2, 3)), r((4, 5, 5)), r((4, 5, 4)), r((4, 5, 3)), r((4, 5, 2)), r((4, 2, 6)), r((4, 2, 5)), r((4, 2, 4)), r((4, 2, 3)), r((5, 5, 5)), r((5, 5, 4)), r((5, 5, 3)), r((5, 5, 2)), r((5, 2, 6)), r((5, 2, 5)), r((5, 2, 4)), r((5, 2, 3)), r((6, 5, 5)), r((6, 5, 4)), r((6, 5, 3)), r((6, 5, 2)), r((6, 2, 6)), r((6, 2, 5)), r((6, 2, 4)), r((6, 2, 3))]
s2:[[e], [a, b, c, d]]:48:[r((1, 5, 6)), r((1, 5, 2)), r((1, 4, 6)), r((1, 4, 2)), r((1, 3, 6)), r((1, 3, 2)), r((1, 2, 6)), r((1, 2, 2)), r((2, 5, 6)), r((2, 5, 2)), r((2, 4, 6)), r((2, 4, 2)), r((2, 3, 6)), r((2, 3, 2)), r((2, 2, 6)), r((2, 2, 2)), r((3, 5, 6)), r((3, 5, 2)), r((3, 4, 6)), r((3, 4, 2)), r((3, 3, 6)), r((3, 3, 2)), r((3, 2, 6)), r((3, 2, 2)), r((4, 5, 6)), r((4, 5, 2)), r((4, 4, 6)), r((4, 4, 2)), r((4, 3, 6)), r((4, 3, 2)), r((4, 2, 6)), r((4, 2, 2)), r((5, 5, 6)), r((5, 5, 2)), r((5, 4, 6)), r((5, 4, 2)), r((5, 3, 6)), r((5, 3, 2)), r((5, 2, 6)), r((5, 2, 2)), r((6, 5, 6)), r((6, 5, 2)), r((6, 4, 6)), r((6, 4, 2)), r((6, 3, 6)), r((6, 3, 2)), r((6, 2, 6)), r((6, 2, 2))]
%----------  end of data ------------%
% file output end time , [date(2006/5/28), time(18:10:27)]


*/


% obsolated

auto_s2_restricted_domain(L):-
%   findall(S,possible_ranking_0(S,_),TR),
   all_possible_rankings_0(TR),
   auto_s2_domain(L,TR).

auto_s2_domain([],[]).
auto_s2_domain([R|L],[R|TR]):-
   auto_s2_domain(L,TR),
   forall(
     triple_of_alternative(T),
     value_restriction_in_rankings( s2,_, T, [R|L])
   ).
auto_s2_domain(L,[_|TR]):-
   auto_s2_domain(L,TR).


%-------------------------------------------------
% the experimental scripts
%-------------------------------------------------


setup_K_alt_domain(K,A):-
   Base=[a,b,c,d,e,f,g,h,i,j,k,l,m,n],
   length(A,K),
   append(A,_,Base),
   setup_model(alt:A,soc:[1,2,3]).

:- dynamic  vr_domains_for_triples_0/3.
:- dynamic  gen_vr_domains_recent_id/1.

init_vr_domains_for_triples:-
   abolish(vr_domains_for_triples_0/3),
   abolish(gen_vr_domains_recent_id/1),
   assert(gen_vr_domains_recent_id(0)).

update_vr_domains_recent_id(J):-
   retract(gen_vr_domains_recent_id(I)),
   J is I + 1,
   assert(gen_vr_domains_recent_id(J)).


% a naive generation
%-------------------------------------------------

generate_vr_domains([N,H,SL],[M,T,J],SS):-
   stopwatch_0(
     auto_vr_domains_of_size_1(N,H,SL,M,SS),
   T),
   update_vr_domains_recent_id(J),
   assert( vr_domains_for_triples_0([H,SL,M],[T,J],SS)).


% demo (2 Jun 2006)

/*

?- generate_vr_domains([8,A,B],[max,Tm,J],vr).

A = [r((1, 1)), r((2, 2)), r((2, 1)), r((5, 4)), r((5, 3)), r((5, 2)), r((5, 1)), r((..., ...))]
B = [sc: (a, b, c):b, sc: (a, b, d):b, sp: (a, c, d):c, sp: (b, c, d):c]
Tm = 0.016
J = 3 

Yes
Yes
?- generate_vr_domains([9,A,B],[max,Tm,J],vr).

A = [r((1, 1)), r((2, 2)), r((2, 1)), r((5, 4)), r((5, 3)), r((5, 2)), r((5, 1)), r((..., ...)), r(...)]
B = [sc: (a, b, c):b, sc: (a, b, d):b, sp: (a, c, d):c, sp: (b, c, d):c]
Tm = 0
J = 2 

Yes
?- generate_vr_domains([8,A,B],[max,Tm,J],[vr]).

No
?- generate_vr_domains([8,A,B],[yes,Tm,J],[s2]).

A = [r((1, 2)), r((1, 1)), r((2, 3)), r((2, 2)), r((4, 3)), r((4, 2)), r((6, 4)), r((..., ...))]
B = [s2: (a, b, c), s2: (a, b, d), s2: (a, c, d), s2: (b, c, d)]
Tm = 0
J = 6 

Yes
?- generate_vr_domains([9,A,B],[max,Tm,J],[sp]).

No
?- 

*/


% a fast generating VR domains
%-------------------------------------------------

% an earlier code.  SS=vr,[sp],[sp,sc], ..., etc.

gen_vr_by_triples(SS, N, K, max):-
   setup_K_alt_domain(K,_),
   gen_vr_by_triples_max(SS, N).

gen_vr_by_triples(SS, N, K):-
   setup_K_alt_domain(K,_),
   gen_vr_by_triples(SS, N).

gen_vr_by_triples(SS, N):-
   tstamp(start,Ts),
   init_vr_domains_for_triples,
   forall(
     generate_vr_domains([N,_,_],[yes,Tm,J],SS),
     tell_gen_vr_domains_by_triples(yes,J,Tm,'gen_vr.txt')
   ),
   tell_gen_vr_domains_by_triples(yes,0,Ts,'gen_vr.txt').

gen_vr_by_triples_max(SS, N):-
   tstamp(start,Ts),
   init_vr_domains_for_triples,
   forall(
     generate_vr_domains([N,_,_],[max,Tm,J],SS),
     tell_gen_vr_domains_by_triples(max,J,Tm,'gen_vr_max.txt')
   ),
   tell_gen_vr_domains_by_triples(max,0,Ts,'gen_vr_max.txt').


% an earlier code.  SS=[vr],[sp],[sp,sc], ..., etc.

gen_vr_by_triples(SS):-
   init_vr_domains_for_triples,
   max_scheme_of_vr_domains_wrt_triples(Y,_Pt),
   forall(
     stopwatch_0(
       auto_value_restricted_domain_by_triples_1(Y,SL,SS),
     T),
    (
     update_vr_domains_recent_id(J),
     assert( vr_domains_for_triples_0([Y,SL],[T,J],SS))
     ,tell_gen_vr_domains_by_triples(max, J, 'gen_vr_max.txt')
    )),
   tell_gen_vr_domains_by_triples(0,'gen_vr_max.txt').

% another code

gen_vr_by_triples_001(SS, Y,SL,L,N, K):-
   setup_K_alt_domain(K,_),
   gen_vr_by_triples_001(SS,Y,SL,L,N).

gen_vr_by_triples_001(SS,Y,SL):-
   max_scheme_of_vr_domains_wrt_triples(Y,_Pt),
   stopwatch_0(
     auto_value_restricted_domain_by_triples_1(Y,SL,SS),
   T),
   assert( vr_domains_for_triples_0([Y,SL],[T,avr],SS)),
   tell_gen_vr_domains_by_triples(0,'gen_vr_001.txt').

gen_vr_by_triples_001(SS,Y,SL,L,N):-
   gen_vr_by_triples_001(SS,Y,SL),
%   findall(R, possible_ranking_0( R,_), RL),
   all_possible_rankings_0(RL),
   transform_domain_triples_into_rankings( Y,RL, L),
   length(L,N).

tell_by_J(_,0):-
   !.
tell_by_J(J1,BY):-
   (var(BY)->BY is 100;true),
   \+ 0 is J1 mod BY,
   !,
   fail.
tell_by_J(_,_).

tell_gen_vr_domains_by_triples(M, J, Ts, File):-
   member(M,[yes,max]),
   tell_by_J(J,0),
   tell_goal(File,(
     nl,write(start:Ts),
     forall(
       clause(
         vr_domains_for_triples_0([D,SL,M],[Time,J0],SS),
       _),
      (
       nl,write([J0]),
       %display_domain_for_triples(D,_SL1),
       length(D,N),
       nl,write(N:D),
       forall( member(STX,SL),(
         member(STX,[(Sx:T:X),(Sx:T)]),
         relative_domain_for_triple(T,D,_,Rt),
         nl,
         tab(1),
         (var(X) -> Sxx=Sx ; Sxx=(Sx:X) ),
         write(T:Sxx:Rt)
       )),
       nl,write(time:Time;SS;M)
      )
     )
   )).
tell_gen_vr_domains_by_triples(_, _,_, _).

tell_gen_vr_domains_by_triples(J, File):-
   tell_by_J(J,1000),
%   findall(R, possible_ranking_0(R,_), L),
   all_possible_rankings_0(L),
   tell_goal(File,
     forall(
       clause(
         vr_domains_for_triples_0([Y,SL],[T,J0],SS),
       _),
      (
       transform_domain_triples_into_rankings( Y,L, D),
       length(D,N),
       nl,write([J0]),
       display_domain_for_triples(D,SL),
       nl,write(time:T;SS;size:N)
      )
     )
   ).

close_telling_file:-
   current_stream(A,write,B),
   \+ member( A, [1,2]),
   nl,write('close?':A),
   read(y),
   close(B),
   nl,write('closed.').
close_telling_file:-
   nl,
   write('no more.').


/*

?- setup_K_alt_domain(3,B).

B = [a, b, c] 

Yes
?- generate_vr_domains([4|A],[max|B],[s2]).

A = [[r(1), r(2), r(4), r(6)], [s2: (a, b, c)]]
B = [0, 54] ;

A = [[r(1), r(3), r(5), r(6)], [s2: (a, b, c)]]
B = [2.562, 55] ;

A = [[r(2), r(3), r(4), r(5)], [s2: (a, b, c)]]
B = [5.578, 56] ;

No
?- 

*/

% generating  a given size of vr domain.

test_k_alt_domains(K,N,M,SS):-
   setup_K_alt_domain(K,_),
   init_vr_domains_for_triples,
   generate_vr_domains([N|_],[M|_],SS),
   tell_vr_domains_for_triples_0('test_k_alt.txt'),
   fail.

test_k_alt_domains(_,_,_,_).

tell_vr_domains_for_triples_0(File):-
   tell_goal(File,
     display_vr_domains_for_triples_0
   ).

display_vr_domains_for_triples_0:-
   forall(
     vr_domains_for_triples_0([H,SL,_],[T,J],SS),
    (
     nl,write([J]),
     display_domain_for_triples(H,SL),
     nl,write(time:T;SS)
    )
   ).


% M=max is recommended.

test_3_alt_domains(N,M,SS):-
   setup_model(alt:[a,b,c],soc:[1,2,3]),
   tell_goal('test_3_alt.txt',forall,
     auto_vr_domains_for_triples(N,_,_,M,SS)
   ).

test_4_alt_domains(N,M,SS):-
   init_vr_domains_for_triples,
   setup_model(alt:[a,b,c,d],soc:[1,2,3]),
   forall(
     generate_vr_domains([N|_],[M|_],SS),
     tell_vr_domains_for_triples_0('test_4_alt.txt')
   ).

test_5_alt_domains(N,M,SS):-
   setup_model(alt:[a,b,c,d,e],soc:[1,2,3]),
   forall(
     generate_vr_domains([N|_],[M|_],SS),
     tell_vr_domains_for_triples_0('test_5_alt.txt')
   ).



/*

?- setup_model(alt:[a,b,c],soc:[1,2,3]),
auto_vr_domains_for_triples(4,H,[[s2]:P],yes),fail.

[[s2]: (a, b, c)]:[r(1), r(2), r(4), r(6)]
(a, b, c):[1, 2, 4, 6]
[[s2]: (a, b, c)]:[r(1), r(3), r(5), r(6)]
(a, b, c):[1, 3, 5, 6]
[[s2]: (a, b, c)]:[r(2), r(3), r(4), r(5)]
(a, b, c):[2, 3, 4, 5]

No
?- 

*/


% testing sup of the size of VR domains
%-------------------------------------------------

:- dynamic sup_vr_0/3.

init_sup_vr:-
   abolish(sup_vr_0/3),
   tstamp(start,Ts),
   assert(sup_vr_0((0,Ts,start))).

finish_sup_vr:-
   tstamp(end,Ts),
   assert(sup_vr_0((0,Ts,end))).

update_sup_vr(N,T,A):-
   clause(sup_vr_0(N,T,A0),true),
   (A0=A->true;(
     nl,
     write('#### an updating error has occurred at ':(N,T)),
     nl,
     write(recorded:(N,T,A0)),
     nl,
     write(writing:(N,T,A))
   )), 
   retract(sup_vr_0(N,T,A0)),
   assert(sup_vr_0(N,T,A)).

update_and_save_sup_vr(N,T,A):-
   update_sup_vr(N,T,A),
   tell_goal(
     'sup_vr.txt',
     display_sup_vr_0
   ).

display_sup_vr_0:-
   clause( sup_vr_0( 0,X,_ ), _),
   nl,write(0:X),
   fail.
display_sup_vr_0:-
   forall(
     clause( sup_vr_0( N,Time,(SL,M,D) ), _),
    (
     nl,write(N:D),
     display_relative_domains_for_triples(SL,D),
     nl,write(time:Time),
     (M=max->write([max]);true)
    )
   ).


display_relative_domains_for_triples([],_).
display_relative_domains_for_triples([SD|SL],D):-
   display_relative_domains_for_triples(SL,D),
   member(SD,[(Sx,T,X),(Sx:T:X)]),
%   findall(Sx,
%     value_restriction_in_rankings( Sx,_, T, D),
%   SSx),
%   sort(SSx,VR),
   mode_of_analysis(M-alternatives,_),
   (M>6->Rt='*';
     relative_domain_for_triple(T,D,_,Rt)
   ),
   nl,
   tab(1),
   write(T:Rt:Sx:X).



% filters for test_sup_vr
%-------------------------------------------------


:- dynamic sup_vr_parity/1,sup_vr_parity/2.

%sup_vr_parity( even, inhibit).
%sup_vr_parity( odd, inhibit).
sup_vr_parity( even).
sup_vr_parity( odd).

% the setting

off_parity_of_test_sup_vr:-
   forall(
     sup_vr_parity(A),
     retract( test_sup_vr_parity( A, inhibit))
   ).

change_parity_of_test_sup_vr(P->Q):-
   sup_vr_parity( P),
   sup_vr_parity( P, inhibit),
   sup_vr_parity( Q),
   \+ sup_vr_parity( Q, inhibit),
   retract( sup_vr_parity( P, inhibit)),
   assert( sup_vr_parity( Q, inhibit)).


:- dynamic sup_vr_mode/1.

skip_mode_for_sup_vr(parity,on).
skip_mode_for_sup_vr(lower_bound,on).

filters_for_vr(N):-
   forall(
     skip_mode_for_sup_vr(M,on),
     \+ skip_sup_vr_if(M, N)
   ).

skip_sup_vr_if(lower_bound,N):-
   skip_by_lower_bound(N).

skip_sup_vr_if(parity,N):-
   skip_if_parity(_,N).

skip_if_parity(even, N):-
   0 is N mod 2,
   sup_vr_parity( even, inhibit).
skip_if_parity(odd, N):-
   1 is N mod 2,
   sup_vr_parity( odd, inhibit).

skip_by_lower_bound(N):-
   skip_mode_for_sup_vr(lower_bound,on),
   mode_of_analysis(U-alternatives,_),
   lower_bound_for_maximal_consistent_set(U,Q),
   N < Q.

%  The Abello-Johnson's lower bound when U >4,
%  otherwise the Kelly-Craven-Fishburn lower bound.

:- dynamic lower_bound/2.

lower_bound(abello,off).
lower_bound(kelly,on).

switch_lower_bound(A,O->U):-
   member((O,U),[(off,on),(on,off)]),
   retract(lower_bound( A, O)),
   assert(lower_bound( A, U)).


lower_bound_for_maximal_consistent_set(U,Q):-
   lower_bound(abello,on),
   U>4,
   !,
   Q is 3 * 2^(U-2) -4.

lower_bound_for_maximal_consistent_set(U,Q):-
   lower_bound(kelly,on),
   Q is 2^(U-1). 

/*

?- off_alternating_scheme.

Yes
?- switch_lower_bound(A,B).

A = abello
B = off->on ;

A = kelly
B = on->off ;

A = abello
B = on->off ;

No
?- switch_lower_bound(kelly,B).

B = off->on 

Yes
?- test_sup_vr_by_triples(N/P, 7).
start, [date(2006/6/2), time(21:34:53)]


*/



% test sup of size of vr domain for current model.
%-------------------------------------------------
% lastely modified: 12, 18, 23-4 Jun 2006.


test_sup_vr_by_triples(_, K):-
   \+ mode_of_analysis(K-_,_),
   setup_K_alt_domain(K,_),
   fail.

test_sup_vr_by_triples(N/P, K):-
   mode_of_analysis(K-_,_),
   test_sup_vr_by_triples(N/P).

test_sup_vr_by_triples(N/P):-
%   init_auto_VR_domain_0,
   init_sup_vr,
%   findall(R, possible_ranking_0(R,_), L),
   all_possible_rankings_0(L,P),
   length(L0,P),
   nth1(N,L0,_),
   filters_for_vr(N),
%   % earlier code with a misspecification.
%   filter_for_test_sup_vr(N,Y,_Pt),
%   max_scheme_of_vr_domains_wrt_triples(Y,_Pt), % for auto_v.._1
   \+ (
     mode_test_sup_vr_by_triples( M, on),
     length(D,N),
     test_sup_vr_by_triples_with_stopwatch(N, L,Time,(Y,M,D)),
     update_and_save_sup_vr(N,Time,(Y,M,D))
   ),
   nl,
   finish_sup_vr,
   !.
test_sup_vr_by_triples(_).


:- dynamic  mode_test_sup_vr_by_triples/2.

mode_test_sup_vr_by_triples( yes, off).
mode_test_sup_vr_by_triples( max, off).
mode_test_sup_vr_by_triples( rec, on).

switch_mode_test_sup_vr_by_triples( A->B):-
   clause(mode_test_sup_vr_by_triples( A, on),_),
   clause(mode_test_sup_vr_by_triples( B, off),_),
   retract(mode_test_sup_vr_by_triples( A, on)),
   assert(mode_test_sup_vr_by_triples( A, off)),
   retract(mode_test_sup_vr_by_triples( B, off)),
   assert(mode_test_sup_vr_by_triples( B, on)).


test_sup_vr_by_triples_with_stopwatch(N,L,Time,(Y,yes,D)):-
   M=yes,
   stopwatch_0((
     auto_value_restricted_domain_by_triples_1(Y,_,[vr]),
     transform_domain_triples_into_rankings( Y,L, D)
   ),Time),
   (var(N)->length(D,N);true),
   assert(
     sup_vr_0(N,Time,(Y,M,D))
   ).

test_sup_vr_by_triples_with_stopwatch(N, L,Time,(Y,max,D)):-
   M=max,
   stopwatch_0((
     auto_value_restricted_domain_by_triples_max(D,L,Y,vr)
   ),Time),
   (var(N)->length(D,N);true),
   assert(
     sup_vr_0(N,Time,(Y,M,D))
   ).

test_sup_vr_by_triples_with_stopwatch(N, L,Time,(Y,rec,D)):-
   M=rec,
   stopwatch_0((
     auto_value_restricted_domain_by_triples_rec(D,L,Y,vr)
   ),Time),
   (var(N)->length(D,N);true),
   assert(
     sup_vr_0(N,Time,(Y,M,D))
   ).


/*
% a demo after augmented RAM (256Kx2-> 1G+256K). 
% 23-4 Jun 2006.

?- setup_K_alt_domain(6,_).

Yes
?- test_sup_vr_by_triples_with_stopwatch(N, L,Time,(Y,max,D)).

N = 45
L = [r((((1, 4), 5), 6)), r((((1, 4), 5), 5)), r((((1, 4), 5), 4)), r((((1, 4), 5), 3)), r((((1, 4), 5), 2)), r((((..., ...), 5), 1)), r(((..., ...), 6)), r((..., ...)), r(...)|...]
Time = 13.078
Y = [sp: (a, b, c):b, sp: (a, b, d):b, sp: (a, b, e):b, sp: (a, b, f):b, sc: (a, c, d):c, sc: (a, ..., ...):c, sc: (..., ...):c, sp:... :..., ... :...|...]
D = [r((((1, 2), 2), 3)), r((((1, 2), 1), 3)), r((((1, 2), 1), 2)), r((((1, 2), 1), 1)), r((((1, 1), 1), 2)), r((((..., ...), 1), 1)), r(((..., ...), 6)), r((..., ...)), r(...)|...] 

Yes
?- 

*/


% depreciated
%-------------------------------------------------

test_sup_vr(N):-
   init_sup_vr,
   length(L,120),% 4-alternatives=> 24
   nth1(N,L,_),
   \+ (
     stopwatch_0(
%
       auto_vr_domains_for_triples(N,A,B,yes),
%       find_latin_squareless_of_length(N,_),  % depreciated
%       find_value_restricted_domain_of_length(N,_), % depreciated
     Time),
     update_and_save_sup_vr(N,Time,(A,B))
   ),
   !.
test_sup_vr(_).

test_sup_vr(N,VR):-
   member(VR,[sp,sc,s2]),
   init_sup_vr,
   length(L,120),% 4-alternatives=> 24
   nth1(N,L,_),
   \+ (
     stopwatch_0(
       auto_vr_domains_for_triples(N,A,B,yes,VR),
     Time),
     update_and_save_sup_vr(N,Time,(A,B))
   ),
   !.
test_sup_vr(_,_).


% (depreciated)

find_latin_squareless_of_length(N,H):-
   length(H,N),
   auto_restricted_domain_with_filter(H).

find_latin_squareless_of_length_1(N,H):-
   length(H,N),
   auto_restricted_domain(H),
   filter_on_restricted_domain(H,N),
   value_restriction_by_latin_square.

find_value_restricted_domain_of_length(N,H):-
   length(H,N),
   auto_restricted_domain(H),
   value_restriction(_).

filter_on_restricted_domain(H,N):-
   \+ violates_filter_on_restricted_domain(H,N).

violates_filter_on_restricted_domain(H,_):-
   member(r((J,_)),H),
   \+ member(J,[1,2,4,6]).

violates_filter_on_restricted_domain(H,N):-
   (var(N)->length(H,N);true),
   N >=4,
   member(J,[1,2,4,6]),
   \+ member(r((J,_)),H).


filter_for_test_sup_vr(N,Y,Pt):-
   mode_of_analysis(K-alternatives,_),
   E is 2^(K-1),
   (Ntrue
     ; max_scheme_of_vr_domains_wrt_triples(Y,Pt)
   ).


%:- setup_K_alt_domain(4,_).

:- setup_model(alt:[a,b,c],soc:[1,2]).

% end of program
%-------------------------------------------------


return to front page.