You selected jasmin02.pl
/*
Jasmin 2002, 17 November in Kanazawa.
Prologでナッシュ遂行理論を学ぶ
Learning Nash Implementation Theory on Prolog
---報告論文中のソースプログラム-----
犬 童 健 良
関東学園大学経済学部経営学科
*/
agents(Js):-setof(J,S^R^preference(J,S,R),Js).
states(Ss):-setof(S,J^R^preference(J,S,R),Ss).
alternatives([a,b]).
scc(f,state(1),[a]).
scc(f,state(2),[b]).
scc(f,state(3),[a]).
scc(f,state(4),[b]).
preference(agent(1),state(1),[a,b]).
preference(agent(1),state(2),[a,b]).
preference(agent(1),state(3),[b,a]).
preference(agent(1),state(4),[b,a]).
preference(agent(2),state(1),[a,b]).
preference(agent(2),state(2),[b,a]).
preference(agent(2),state(3),[a,b]).
preference(agent(2),state(4),[b,a]).
lcc([I,S,R],A,L) :-
preference(I,S,R),member(A,R),
append(_Upper, [A|Lower], R),sort([A|Lower],L).
is_maximal([I,S,R],A,X):-
lcc([I,S,R],A,Lcc),member(A,X),subset(X,Lcc).
is_prefer_to(I,S,X,Y):-
lcc([I,S,_R],X,L),
member(Y,L).
prefer_profile(S,Rks):-
bagof(Rk, I^preference(I,S,Rk), Rks).
monotone0(F):-
scc(F,_,_)->
forall(
(
scc(F,S,C),
scc(F,S1,C1),
subtract(C,C1,D),D\=[]
),
(
forall(member(A,D),
(
lcc([I,S,_R],A,L1),
lcc([I,S1,_R1],A,L2),
\+ subtract(L1,L2,[])
)
)
)
).
monotone(F):-
scc(F,_,_)->
forall(
( scc(F,S,C),
member(A,C),
scc(F,S1,C1),
\+ member(A,C1),wrv1(A,F,C,S,C1,S1)
),
( lcc([I,S,_R],A,L1),
lcc([I,S1,_R1],A,L2),
\+ subtract(L1,L2,[]),wrv2(I,L1,L2)
)
).
wrv1(A,F,C,S,C1,S1):-
write([A,is_in,F,[S,C],out,[S1,C1]]),nl.
wrv2(I,L1,L2):-tab(3),
write([reversal(I),lccs(L1,'->',L2)]),nl.
is_essential(A,X,[I,S,R],F):-
scc(F,S,C),member(A,C), lcc([I,S,R],A,Lcc), subset(Lcc,X).
ess(F,I,X,Ess):-
findall(A, is_essential(A,X,[I,_S,_R],F), Y), sort(Y,Ess).
veto_outcome(A,J,S,F):-
scc(F,S,C),
alternatives(As),
subtract(As,C,D),
member(A,D),
agents(Is),
preference(J,S,_R),
forall((member(K,Is),K\=J),
(lcc([K,S,_Rk],A,As)%,write([A,S,J,K]),nl
)
).
no_veto_power(F):-
agents(Is),
scc(F,_,_)
->
forall(member(J,Is),\+veto_outcome(_A,J,_S,F)).
nvp(F):-no_veto_power(F).
scc(gen(Cc),S,C):-
scc_tuples(Cc),
member([S,C],Cc).
scc_tuples(Cc):-
states(Ss), length(Ss,K),
scc_tuple(Cc,K,Ss).
scc_tuple([],0,[]).
scc_tuple([[S,X]|Cr],K,[S|Sc]):-
scc_tuple(Cr,K1,Sc),
K is K1 + 1,
states(Ss),reverse(Ss,Sr),nth1(K,Sr,S),
alternatives(As),
subset_of(X,As,_N1),
X \= [].
subset_of(A,As,N):-
length(As,L),
length(D,L),
list_projection(D,As,B),
length(B,N),
sort(B,A).
list_projection([],[],[]).
list_projection([X|Y],[_A|B],C):-
X = 0, list_projection(Y,B,C).
list_projection([X|Y],[A|B],[A|C]):-
X = 1, list_projection(Y,B,C).
desc_nnseq([],N):-N<0,!.
desc_nnseq([0],1).
desc_nnseq([A|Q],N):-
A is N - 1,
length(Q,A),
desc_nnseq(Q,A).
asc_nnseq(Aseq,N):-desc_nnseq(Dseq,N),sort(Dseq,Aseq).
counter(N,M,L):-
length(L,_),
findall(M,member(M,L),Mx),
length(Mx,N).
attainables(C, I, [G, Msg], Czs):-
G=..[GF,_P,Scc],
G1=..[GF,_P1,Scc],
mechanism(G, Mz,[C]),
findall( Cz,
( mutate(GF, Scc,I,Msg,Mz),
mechanism(G1, Mz,[Cz])
),
Czs1),
sort(Czs1,Czs).
mutate(GF,Scc,J,Msg,Mz):-
agents(Is), nth1(Nj,Is,J), messages(GF, Scc,Msg), nth1(Nj,Msg,MJ),
messages(GF, Scc,Mz), nth1(Nj,Mz,MJz), MJz \= MJ, subtract(Is,[J],Isz),
forall(member(K,Isz),( nth1(Nk,Is,K), nth1(Nk,Msg,Mk), nth1(Nk,Mz,Mk) )).
best_response(I, S, C, Msg, [GF, P,Scc], [_P1s,Czs,Lcc],Br):-
agents(Is), member(I,Is), alternative(C),
messages(GF, Scc,Msg),
mechanism([GF, P, Scc], Msg,[C]),
attainables(C,I,[[GF, P, Scc],Msg], Czs),
lcc([I,S,_],C,Lcc), (subset(Czs,Lcc)-> Br = yes; Br = no).
nash_equilibrium(Is,_E,[GF,Scc,S,C,P,Msg]):-
forall( member(I,Is),
best_response(I, S, C, Msg, [GF,P, Scc], [_P1s,_Czs,_Lcc],yes)
).
/*
%sample programs in section 2
agents([agent1,agent2]).
states([s1,s2,s3,s4]).
alternatives([a,b]).
sccs([f,g]).
agent(I):-agents(Is),member(I,Is).
state(S):-states(Ss),member(S,Ss).
alternative(A):-alternatives(As),member(A,As).
scc(F):-sccs(Fs),member(F,Fs).
scc(g,State,[a]):-member(State,[s1,s2]).
scc(g,State,[b]):-member(State,[s3,s4]).
preference(Agent,State, [a,b]):-
member([Agent,State],[[1,s1],[1,s2],[2,s1],[2,s3]]).
preference(Agent,State, [b,a]):-
member([Agent,State],[[1,s3],[1,s4],[2,s2],[2,s4]]).
is_prefer_to(I,S,X,Y):-
preference(I,S,Order),nth1(J,Order,X),nth1(K,Order,Y),J =< K.
%sample programs in section 3
lcc([I,S,R],A,Lcc) :-
preference(I,S,R),append(_Succ, [A|_Slcc], Lcc).
is_maximal([I,S,R],A,X):-
lcc([I,S,R],A,Lcc),member(A,X),subset(X,Lcc).
attainables(C, I, Msg, [GF, P, Scc], Czs):-
findall( Cz,
( mutate(GF, Scc,I,Msg,Mz),
mechanism([GF,P1,Scc],Mz,[Cz]) ),
Czs1),
sort(Czs1,Czs).
% 注:setoff /3 だとsort済みだが空リスト用ルールが別に要る。
mutate(GF,Scc,J,Is,Msg,Mz):-
agents(Is),
nth1(Nj,Is,J),
messages(GF, Scc,Msg,Is), nth1(Nj,Msg,MJ),
messages(GF, Scc,Mz,Is), nth1(Nj,Mz,MJz),
MJz \= MJ, subtract(Is,[J],Isz),
forall(member(K,Isz),
( nth1(Nk,Is,K), nth1(Nk,Msg,Mk), nth1(Nk,Mz,Mk) )).
best_response(I, S, C, Msg, [Is, GF, Scc], [P1s,Czs,Lcc],Br):-
agents(Is), member(I,Is), alternative(C), messages(GF, Scc,Msg,Is),
mechanism([GF, P, Scc], Is,Msg,[C]), attainables(C,I,[Is,G,Msg], Czs),
lcc([I,S,_],C,Lcc), (subset(Czs,Lcc)-> Br = yes; Br = no).
nash_equilibrium(Is,E,[GF,Scc,S,C,P,Msg]):-
forall( member(I,Is),
best_response(I, S, C, Msg, [Is, GF, Scc], [P1s,Czs,Lcc],yes)).
%sample programs in section 4
%sample programs in section 5
is_a_dictator(J,F):-
agents(Is), member(J,Is), scc(F), alternatives(B),
forall((scc(F,S,C),member(A,C)),
lcc([J,S,_R],A,B)),
forall(lcc([J,S,_R],A,B),(scc(F,S,C),member(A,C))).
is_weak_parato_optimal(A,S):-
alternative(A), state(S),
forall(alternative(B),is_prefer_to(_J,S,A,B)).
%sample programs in section 6
monotone(F,Is):-scc(F),agents(Is),
forall(
(scc(F,S,C),member(A,C),scc(F,S1,C1),\+ member(A,C1)),
( member(I,Is),
lcc([I,S,_R],A,K1),
lcc([I,S1,_R1],A,K2),
\+ subtract(K1,K2,[])) ).
is_essential(A,X,[I,S,R],F):-
scc(F,S,C),member(A,C),
lcc([I,S,R],A,Lcc), subset(Lcc,X).
ess(F,I,X,Ess):- agent(I),scc(F),
findall(A, is_essential(A,X,[I,S,R],F), Y), sort(Y,Ess).
%sample programs in section 7
game_form(gMR2(1,_Scc), [J1,J2],Msg,[C]):-Msg = [(R,C,_,_,_),(R,C,_,_,_)],!.
game_form(gMR2(P,Scc), [J1,J2],Msg,[C]):- Msg=[MJ1,MJ2],
MJ1 = (R1,A1, B1,Z1,O1), MJ2 = (R2,A2, B2,Z2,O2),
[R1,A1] \= [R2,A2], member(P,[2,3,4,5,6]),
((O1=0,O2=0) -> P=2; (O1>0,O2=0) -> P=3; (O1=0,O2>0) -> P=4; true),
Sum is Z1 + Z2, Mod is Sum mod 2,
((O1>0,O2>0,Mod = 0) -> P=5; (O1>0,O2>0,Mod = 1) -> P=6; true),!,
R1 = [_R11,R12], prefer_profile([J1,J2],S1,R1),
R2 = [R21,_R22], prefer_profile([J1,J2],S2,R2),
(mre(MR,Scc,[[A2,A1],[J1,J2],[S2,S1],[R21,R12]],[Cx1,Cx2],no)
->true; MR=non),
(P=2 -> C = MR ; P=3 -> (member(B1,Cx1)-> C = B1; C=MR);
P=4 -> (member(B2,Cx2)-> C = B2; C=MR); P=5 -> C = B1 ;
P=6 -> C = B2 ; true).
prefer_profile(Is,S,Rks):-
true_prefer_profile(Is,S,Rks).
true_prefer_profile(Is,S,Rks):-
agents(Is),
state(S),
bagof(Rk,
I^(
member(I,Is),preference(I,S,Rk)
),
Rks).
mr_msg(Is,F,J,M):-
M=(R,A,B,_Z), agents(Is), member(J,Is),
state(S),
prefer_profile(Is,S,R),
scc(F,S,V), alternative(A),member(A,V), alternative(B).
mr2_msg([J1,J2],F,J,M2):-
mr_msg([J1,J2],F,J,M),
M=(R,A,B,Z),
M2=(R,A,B,Z,Obj), member(Obj,[0,1]).
mr2_profile([J1,J2],F,Prf):-
agents([J1,J2]), scc(F),
maplist(mr2_msg([J1,J2],F),[J1,J2],Prf).
messages(gMR2, F,M,[J1,J2]):-
scc(F), mr2_profile(Is,F,M).
mechanism(G, Is,Msg,Z):-
G =.. [GF,_P,Scc],
messages(GF, Scc,Msg,Is), game_form(G,E,Msg,Z),!.
*/
% end of source
return to front page.