headline:-
write('% ------------------------------------------ %'),nl,
write('% simulating interactive belief systems. %'),nl,
write('% ------------------------------------------ %'),nl,
h0.
h0:-
write('% p_belief(J,P,E,B):- probabilistic_belief,'),nl,
write('% self_evident(p_belief(J,P,E,B)):- s.e.p-b.,'),nl,
write('% cpb(P,E,B):- common_p_belief,'),nl,
write('% mpb([J1,J2],P,E,H):- mutual_p_belief,'),nl,
write('% kmpb(K,Pair,P,E,[H|F]):- k-th order mutual_p_belief,'),nl,
write('% bp(J,Q,E):- belief_potential on event,'),nl,
write('% bp(Q):- belief_potential of information system,'),nl,
write('% bp1(Q):- belief_potential_1, a faster version,'),nl,
write('% and '),nl,
write('% h0:- this.'),nl.
me:-
write('% file: cpb.pl.'),nl,
write('% imported from:ck01.pl'),nl,
write('% imported from:trade.pl'),nl,
write('% imported from:nash1.pl'),nl,
write('% created: 26-29 Jan 2003.'),nl,
write('% modified: 1 Feb 2003.'),nl,
write('% author: Kenryo INDO (Kanto Gakuen University) '),nl,
write('% url: http://www.us.kanto-gakuen.ac.jp/indo/front.html'),nl.
references:-
write('% references:'),nl,
write('% [1] Aumann, R. J. and A. Brandenburger (1995). '),nl,
write('% epistemic conditions for Nash equilibrium.'),nl,
write('% Econometrica 63(5): 1161-1180.'),nl,
write('% [2] Geanakoplos, J. (1992). Common knowledge.'),nl,
write('% Journal of Economic Perspective 6: 53-82.'),nl,
write('% also in R. J. Aumann and S. Hart (eds.),'),nl,
write('% Handbook of Game Theory 2: 1437-1496, 1994.'),nl,
write('% [3] Milgrom, P. and N. Stokey (1982). Information, trade '),nl,
write('% and common knowledge. Journal of Economic Theory 26: 17-27.'),nl,
write('% [4] Monderer, D. and D. Samet (1989). Approximating common knowledge'),nl,
write('% with common beliefs.Games and Economic Behavior 1: 170-190.'),nl,
write('% [5] Morris, S. , R. Rob and H.S. Shin(1995). p-dominance %'),nl,
write('% and belief potential. Econometrica 63(1): 145-157.'),nl,
nl.
:- dynamic true_state/1.
:- dynamic said/3.
:- dynamic said/4.
:- dynamic bp_data/3.
:- dynamic precision/1.
:- dynamic game/4.
current_model(ms).
:- headline.
% alias
pb(J,P,E,B):-
probabilistic_belief(J,P,E,B).
cpb(P,E,B):-
common_p_belief(P,E,B).
mpb(Pair,P,E,H):-
mutual_p_belief(Pair,P,E,H).
kmpb(K,Pair,P,E,[H|F]):-
kth_mutual_p_belief(K,Pair,P,E,[H|F]).
lmpb(K,Pair,P,E,[H|F]):-
lim_mutual_p_belief(K,Pair,P,E,[H|F]).
bp(J,Q,E,D):-
belief_potential(J,Q,E,D).
bp(J,Q,E):-
belief_potential(J,Q,E).
bp(Q):-
belief_potential(Q).
cep(E,H,P):-
conditional_event_probability(E,H,P).
bp1(Q):-
belief_potential_1(Q).
bp1(J,Q,E):-
belief_potential_1(J,Q,E).
bp1(J,Q,E,B):-
belief_potential_1(J,Q,E,B).
bp1(J,Q,E,B,D):-
belief_potential_1(J,Q,E,B,D).
%
% ------------------------------------------------- %
% some (local) utilities for probabilistic operations
% ------------------------------------------------- %
precision(100).
make_a_prob(N0,P):-
number(P),
precision(N0),
P =< 1,
P >= 0.
make_a_prob(N0,P):-
var(P),
precision(N0),
N1 is N0 + 1,
length(L,N1),
nth0(K,L,K),
P is K / N0.
quotient_prob(user,R, P):-
(var(R)->read(R1);true),
(
R1 = Q1/Q0
->
R = Q1/Q0
;
quotient_prob(user,R, P)
),
P is R.
%
conditional_event_probability(E,H,P):-
event(E),
event(H),
H \= [],
intersection(E,H,F),
probability_of_event(_,H,P0),
(P0 = 0 -> (nl,write('-- measure 0 --'),nl,fail);true),
probability_of_event(bp1,F,P1),
P is P1 / P0.
%
% ------------------------------------------------- %
% ex. an information system
% in Monderer and Samet(1989)
% ------------------------------------------------- %
%
agent(J):-all_agents(Is),member(J,Is).
state(S):-all_states(Ss),member(S,Ss).
all_agents([1,2]).
all_states([s1,s2,s3,s4,s5,s6,s7,s8,s9]).
partition(1,S,[s1,s2,s3]):-member(S,[s1,s2,s3]).
partition(1,S,[s4,s5,s6]):-member(S,[s4,s5,s6]).
partition(1,S,[s7,s8,s9]):-member(S,[s7,s8,s9]).
partition(2,S,[s1,s4,s7]):-member(S,[s1,s4,s7]).
partition(2,S,[s2,s5,s8]):-member(S,[s2,s5,s8]).
partition(2,S,[s3,s6,s9]):-member(S,[s3,s6,s9]).
prob(bp1,s1, 1/21).
prob(bp1,s2, 1/7).
prob(bp1,s3, 1/7).
prob(bp1,s4, 1/7).
prob(bp1,s5, 1/21).
prob(bp1,s6, 1/7).
prob(bp1,s7, 1/7).
prob(bp1,s8, 1/7).
prob(bp1,s9, 1/21).
%
probability(bp1,S, R):-
prob(bp1,S, P/Q),
R is P / Q.
%
% ------------------------------------------------- %
% @common p-belief(Monderer and Samet,1989)
% ------------------------------------------------- %
/*
E is a probabilistic belief of an agent if
BE = {s| prob(E|partition(j,s))>=p}.
E is a common p-belief at s if
E is a subset of BE for each agent i.
*/
%
common_p_belief(P,E,B):-
event(E),
E\=[],
(
make_a_prob(_,P)
),
forall(
agent(J),
self_evident(p_belief(J,P,E,B))
),
p_belief(1,P,E,B).
self_evident(p_belief(J,P,E,B)):-
agent(J),
event(E),
(
make_a_prob(_,P)
),
p_belief(J,P,E,B),
subset(E,B).
%
p_belief(J,P,E,B):-
probabilistic_belief(J,P,E,B).
probabilistic_belief(J,P,E,B):-
agent(J),
event(E),
(
make_a_prob(_,P)
),
findall(S,
(
partition(J,S,H),
conditional_event_probability(E,H,Q),
%nl,write((partition(J,S,H),Q)),
Q >= P
),
B0),
sort(B0,B).
%
% ------------------------------------------------- %
% belief potential(Morris, Rob, and Shin, 1995)
% ---- a numerical computation
% ------------------------------------------------- %
/*
let H<1,p>E = union(B<1,p>B<2,p>E,E).
sigma(E) is the belief potential of E if
sigma(E)
= max{p|finite k, H<1,p>^k E atains all states.}.
sigma* is the belief potential if
sigma* = min (sigma(nonnul_partitions)).
*/
%
ordered_pair_of_agent([J1,J2]):-
agent(J1),
agent(J2),
J2 \=J1.
mutual_p_belief([J1,J2],P,E,H):-
ordered_pair_of_agent([J1,J2]),
event(E),
%E\=[],
p_belief(J2,P,E,B1),
p_belief(J1,P,B1,B),
union(E,B,H0),
sort(H0,H).
kth_mutual_p_belief(1,[J1,J2],P,E,[H]):-
mutual_p_belief([J1,J2],P,E,H).
kth_mutual_p_belief(K,[J1,J2],P,E,[H|F]):-
kth_mutual_p_belief(K1,[J1,J2],P,E,F),
K is K1 + 1,
mutual_p_belief([J1,J2],P,E,H).
lim_mutual_p_belief(K,[J1,J2],P,E,[H|F]):-
kth_mutual_p_belief(K1,[J1,J2],P,E,[H|[H|F]]),
K is K1 - 1,
!.
%
belief_potential(J,Q,E):-
belief_potential(J,Q,E,yes),
update_bp_data(J,Q,E).
belief_potential(J,P,E,D):-
(var(P)->true; event(E)),
make_a_prob(N0,P),
lim_mutual_p_belief(_Y0,[J,_],P,E,[H0|_]),
all_states(O),
(H0 \= O -> D = down;
(
nl, write(lmpb(_Y0,J,P,E,all_states_reachable)),
P1 is P + 1 / N0,
lim_mutual_p_belief(_,[J,_],P1,E,[H1|_]),
(
H1 \= O
->
(
D = yes
,nl, write(lmpb(_Y0,J,P1,E,H1))
)
; D = up
)
)
),
!.
update_bp_data(J,Q,E):-
(
clause(bp_data(J,_,E),true)
->
retract(bp_data(J,_,E))
;
true
),
assert(bp_data(J,Q,E)),
nl,write(update_bp_data(J,Q,E)).
belief_potential(Q):-
setof((J,H),J^S^partition(J,S,H),Hs),
forall(
(
agent(J),
member((J,H),Hs),
H \= []
),
(
belief_potential(J,P,H),
% if user specified a Q value.
(var(Q)->true; P >= Q)
)
),
bagof(P,
J^E^(
member((J,E),Hs),
bp_data(J,P,E),
nl,write(bp(J,P,E))
),
Qs),
member(Q,Qs),
\+ (member(P1,Qs),P1= 1 / N0,
belief_potential(J,Q,E,D).
belief_potential_1(_,_,_,_,yes).
update_target(up,Q/[L,U],Q1/[L1,U1]):-
Q is (L + U) /2,
L1 = Q,
U1 = U,
Q1 is (L1 + U1) /2.
update_target(down,Q/[L,U],Q1/[L1,U1]):-
Q is (L + U) /2,
L1 = L,
U1 = Q,
Q1 is (L1 + U1) /2.
belief_potential_1(P):-
(var(Q)->true; P is Q),
setof((J,H),J^S^partition(J,S,H),Hs),
forall(
(
agent(J),
member((J,H),Hs),
H \= []
),
belief_potential_1(J,P,H)
),
bagof(Q,
J^E^(
member((J,E),Hs),
bp_data(J,Q,E),
nl,write(bp(J,Q,E))
),
Qs),
member(P,Qs),
\+ (member(P1,Qs),P1= P,
%nl,tab(1),write(mix(M)),
defeated_by(mixed(G),J,N,[M,_V],_D)
,nl,tab(2),write(nbr(defeated_by(J,[M,_V],_D)))
).
%
% a game in Monderer and Samet(1989)
% ------------------------------------------------- %
state_of_game(ms,s1).
game(ms(s1),payoff,[t,l],[7,7]).
game(ms(s1),payoff,[t,c],[0,0]).
game(ms(s1),payoff,[t,r],[0,0]).
game(ms(s1),payoff,[m,l],[0,0]).
game(ms(s1),payoff,[m,c],[2,2]).
game(ms(s1),payoff,[m,r],[7,0]).
game(ms(s1),payoff,[d,l],[0,0]).
game(ms(s1),payoff,[d,c],[0,7]).
game(ms(s1),payoff,[d,r],[8,8]).
game(ms(s1),
form(standard),
players([1,2]),
acts([(1,[t,m,d]), (2,[l,c,r])])).
%
%*********************************
/* cited and modified from nash1.pl */
%*********************************
%
% game forms
% ----------------------------------------------------------- %
game(G,players(N),acts(A),payoffs(P)):-
game(G,form(standard),players(N),_),
game(G,payoff,A,P).
game(mixed(G),players([1,2]),acts([X,Y]),payoffs([E1,E2])):-
mixed_strategies(G,[X,Y]),
exp_payoff(G,1,E1,[X,Y]),
exp_payoff(G,2,E2,[X,Y]).
% a 2-person game of standard form which represents a game tree below.
game(undoms(G,T),form(standard), players(N), acts(A)):-
undominated(T,G,N,_,_)->true,
setof(B,P^undominated(T,G,N,B,P),A).
game(undoms(G,T),players(N),acts(A),payoffs(P)):-
undominated(T,G,N,A,P).
%
games(Y):-
findall(G,game(G,form(_),_,_),X),
sort(X,Y).
%
% strategy space for each agent
% ----------------------------------------------------------- %
acts(G,I,S):-
game(G,form(_),players(N),acts(A)),
nth1(K,N,I),
nth1(K,A,(I,S)).
%
% payoffs for each agent
% ----------------------------------------------------------- %
payoff(G,J,S,U):-
game(G,payoff,S,P),
game(G,form(_),players(N),_),
nth1(K,N,J),
nth1(K,P,U).
%
% Nash strategy equilirium and other solution concepts
% ----------------------------------------------------------- %
mutate(G,S,J,S1):-
game(G,players(N),acts(S),_),
game(G,players(N),acts(S1),_),
subtract(N,[J],NJ),%write(remains(NJ)),nl,
forall(member(J1,NJ),
(
nth1(K,N,J1),%write(j1(J1,k(J))),
nth1(K,S,SK),%write(s(SK)),
nth1(K,S1,SK1),%write(s1(SK1)),nl,
SK = SK1
)
).
%
best_response(G,J,N,S,P):-
game(G,players(N),acts(S),payoffs(P)),
member(J,N),
\+ defeated_by(G,J,N,[S,P],_).
defeated_by(G,J,N,[S,P],[S1,P1]):-
game(G,players(N),acts(S),payoffs(P)),
nth1(K,N,J),
(
mutate(G,S,J,S1),
game(G,players(N),acts(S1),payoffs(P1)),
nth1(K,P1,PK1),
nth1(K,P,PK),
PK < PK1
).
nash(G,J,N,S,P):-
best_response(G,J,N,S,P).
nash(G,N,S,P):-
game(G,players(N),acts(S),payoffs(P)),
\+ (member(J,N), \+ best_response(G,J,N,S,P)).
%
% dominance
% ----------------------------------------------------------- %
dominance(G,J,N,S,P):-
game(G,players(N),acts(S),payoffs(P)),
nth1(K,N,J),
nth1(K,S,SJ),
\+ (
game(G,players(N),acts(S1),payoffs(P1)),
nth1(K,S1,SJ),
\+ (
best_response(G,J,N,S1,P1)
->true;
(nl,tab(2),write(defeated_by(S1,P1)),fail)
)
).
dominance(G,N,S,P):-
game(G,players(N),acts(S),payoffs(P)),
\+ (member(J,N), \+ dominance(G,J,N,S,P)).
%
% iterated dominance
% ----------------------------------------------------------- %
% modified: 25, 30 Jan 2003.
dominate(strong,G,J,SJ,DJ):-
action_pair(G,J,[SJ/_S,PJ],[DJ/_D,PDJ]),
PJ > PDJ,
\+ (
game(G,players(N),acts(S1),payoffs(P1)),
\+ G =.. [mixed,_],
nth1(K,S1,SJ),
nth1(K,P1,P1J),
game(G,players(N),acts(S2),payoffs(P2)),
nth1(K,S2,DJ),
nth1(K,P2,P2J),
P2J > P1J
).
dominate(weak,G,J,SJ,DJ):-
action_pair(G,J,[SJ/_S,PJ],[DJ/_D,PDJ]),
\+ PJ > PDJ,
\+ (
game(G,players(N),acts(S1),payoffs(P1)),
\+ G =.. [mixed,_],
nth1(K,S1,SJ),
nth1(K,P1,P1J),
game(G,players(N),acts(S2),payoffs(P2)),
nth1(K,S2,DJ),
nth1(K,P2,P2J),
P2J > P1J
).
dominated(T,G,J,S,D):-
dominate(T,G,J,D,S).
undominated(T,G,N,S,P):-
game(G,players(N),acts(S),payoffs(P)),
\+ G =.. [mixed,_],
member(T,[weak,strong]),
\+ (
nth1(K,N,J),
nth1(K,S,SJ),
dominated(T,G,J,SJ,_D)
).
action_pair(G,J,[SJ/S,PJ],[DJ/D,PDJ]):-
game(G,players(N),acts(S),payoffs(P)),
nth1(K,N,J),
nth1(K,S,SJ),
nth1(K,P,PJ),
mutate(G,S,J,D),
game(G,players(N),acts(D),payoffs(PD)),
nth1(K,D,DJ),
DJ \= SJ,
nth1(K,PD,PDJ).
%
% ----------------------------------------------------------- %
% mixed strategy and expected payoff
% ----------------------------------------------------------- %
% mixed strategy profile --> probability of each outcome
mixp_precision(5).
mixed_strategies(G,[P1,P2]):-
game(G,form(standard),players([1,2]),acts([(1,A1),(2,A2)])),
length(A1,M1),
length(A2,M2),
mixp_precision(L),
make_a_prob(P1,base(M1),steps(L)),
make_a_prob(P2,base(M2),steps(L)).
exp_payoff(G,J,E,P):-
findall(V,
(
payoff(G,J,S,U), % wn(payoff(G,J,S,U)),
index_of_acts(G,S,Index), % wn(act(Index)),
index_of_tuple(P,P1,Index),% wn(p(P1)),
product(P1,Q), % wn(q(Q)),
V is U * Q %,wn(v(V)),nl
),
Vs),
sum(Vs,E).
%
% refer to an act profile.
index_of_acts(G,A,Index):-
game(G,players(N),acts(A),payoffs(_)),
length(N,LN),
length(A,LN),
length(Index,LN),
findall(L,
(
nth1(K,N,J), % K-th agent
nth1(K,A,AJ),
acts(G,J,SJ),
nth1(L,SJ,AJ)
),
Index).
%
%*********************************
/* cited from trade.pl */
%*********************************
%
%
% conditional probability and conditional expectation
% ----------------------------------------------------------- %
probability_of_event(W,E,P):-
% conditionalization by event specified directly
event(E),
(var(E)->E = E1; sort(E,E1)),
G = member(S,E1),
findall(A,(probability(W,S,A),G),Ps),
sum(Ps,P).
probability_of_event(W,E,P,G):-
\+ var(G), % conditionalization via constraints indirectly
G=(Goal,M,[W,S,A]), % constraints with params
findall(S1,
(
(M=do->(W=W1,S=S1,A=A1);true),
probability(W1,S1,A1),
Goal
),
E0),
sort(E0,E),
findall(A1,
(
(M=do->(W=W1,S=S1,A=A1);true),
probability(W1,S1,A1),
Goal
),
Ps),
sum(Ps,P).
%
% below was not used in trade.pl
conditional_probability(S,P,E):-
state(S),
event(E1),
(var(E)->E = E1; sort(E,E1)),
findall(A,conditional_probability(_W,S,A,E),Ps),
sum(Ps,P).
conditional_probability(W,S,P,E):-
probability(W,S,P1),
event(E1),
(var(E)->E = E1; sort(E,E1)),
(\+ member(S,E)
-> P=0
;
(
probability_of_event(W,E,P0),
P is P1 / P0
)
).
conditional_probability(W,S,P,E,G):-
probability(W,S,P1),
event(E1),
(var(E)->E = E1; sort(E,E1)),
(\+ member(S,E)
-> P=0
;
(
probability_of_event(_W0,E,P0,G),
P is P1 / P0
)
).
%
conditional_expected_payoff(J,S,V,H):-
game_outcome(W,agent(J),O),
conditional_probability(W,S,P,H),
payoff(agent(J),O,U),
V is P * U.
conditional_expected_payoff(J,V,H):-
agent(J),
event(H),
findall(E,
(
conditional_expected_payoff(J,_S,E,H)
),
V0),
sum(V0,V).
%
% ------------------------------------------------- %
% knowledge operators via possibility correspondences.
% ------------------------------------------------- %
% added: 25 Jan 2003.
% However, these four predicates are not used in trade.pl
know_event_when(J,E,K):-
agent(J),
event(E),
setof(S,
H^(
partition(J,S,H),
subset(H,E)
),
K).
dont_know_event_when(J,E,DK):-
agent(J),
event(DK),
DK \= [],
event(E),
E \= [],
\+ know_event_when(J,E,DK).
think_possible_when(J,E,P):-
agent(J),
event(E),
setof(S,
H^(
partition(J,S,H),
intersection(H,E,M),
M\=[]
),
P).
think_impossible_when(J,E,U):-
think_possible_when(J,E,P),
all_states(O),
subtract(O,P,U),
U\=[],
event(U).
%
% ------------------------------------------------- %
% state, agent, information (partition),
% and possibility correspondences
% ------------------------------------------------- %
%
%
/*
true_state(s3).
all_agents([1,2]).
all_states([s1,s2,s3,s4,s5]).
*/
% partitions of Milgrom and Stokey's example.
/*
partition(1,s1,[s1]).
partition(1,S,[s2,s3]):-member(S,[s2,s3]).
partition(1,S,[s4,s5]):-member(S,[s4,s5]).
partition(2,S,[s1,s2]):-member(S,[s1,s2]).
partition(2,S,[s3,s4]):-member(S,[s3,s4]).
partition(2,s5,[s5]).
%
*/
%
% a nested example inspired by Rubinstein and Wolinsky(1990)
% which induce speculative trades everywhere.
%
/*
partition(1,s1,[s1,s2,s3,s5]).
partition(1,S,[s2,s3]):-member(S,[s2,s3]).
partition(1,s4,[s4,s5]).
partition(1,s5,[s5]).
partition(2,s1,[s1]).
partition(2,s2,[s1,s2]).
partition(2,S,[s3,s4]):-member(S,[s3,s4]).
partition(2,s5,[s1,s3,s4,s5]).
%
*/
%
% trade example of Milgrom and Stokey(1982).
% ------------------------------------------------- %
% probability and game payoffs of the trade
% ------------------------------------------------- %
%
/*
probability(w1,s1, 0.20).
probability(w1,s2, 0.05).
probability(w1,s3, 0.05).
probability(w1,s4, 0.15).
probability(w1,s5, 0.05).
probability(w2,s1, 0.05).
probability(w2,s2, 0.15).
probability(w2,s3, 0.05).
probability(w2,s4, 0.05).
probability(w2,s5, 0.20).
%
*/
%
%
%*********************************
/* cited from ck01.pl */
%*********************************
%
make_public(S):-
state(S),
assert(said(public,0,is_impossible(S))).
%
% ------------------------------------------------- %
% event, (static) knowledge, and reachability
% ------------------------------------------------- %
event(E):-
all_states(O),
subset_of(E,_N,O).
know(J,S,E):-
agent(J),
state(S),
partition(J,S,H),
event(E),
subset(H,E).
%
% ------------------------------------------------- %
% common knowledge via meet of partitions
% ------------------------------------------------- %
meet_of_partitions([J],[S],H):-
partition(J,S,H).
meet_of_partitions([J|Js],[S|Ss],M):-
meet_of_partitions(Js,Ss,M1),
partition(J,S,H),
\+ cyclic(J/Js,S/Ss),
\+ subset(H,M1),
intersection(M1,H,H12),
H12 \= [],
union(H,M1,M2),
sort(M2,M).
%
%
% ----------------------------------------------------------- %
% Arithmetic and so on including probabilistic operators
% ----------------------------------------------------------- %
%
% sum
% ----------------------------------------------------------- %
sum([],0).
sum([X|Members],Sum):-
sum(Members,Sum1),
%number(X),
Sum is Sum1 + X.
%
% product
% ----------------------------------------------------------- %
product([],1).
product([X|Members],Z):-
product(Members,Z1),
%number(X),
Z is Z1 * X.
%
% allocation
% ----------------------------------------------------------- %
allocation(N,A,[X|Y]):-
allocation(N,A,A,[X|Y]).
allocation(0,_,0,[]).
allocation(N,A,B,[X|Y]):-
integer(A),
length([X|Y],N),
allocation(_N1,A,B1,Y),
% N1 is N - 1,
% sum(Y,B1),
K is A - B1 + 1,
length(L,K),
nth0(X,L,X),
B is B1 + X.
%
% probability by using allocation
% ----------------------------------------------------------- %
probabilities(0,[]).
probabilities(N,[X|Y]):-
integer(N),
length([X|Y],N),
allocation(N,100,[X|Y]).
%
% any ratio (weight) can be interpreted into a prob.
scale(W,1/Z,P):-
findall(Y,(nth1(_K,W,X),Y is X/Z),P).
probabilities(W,N,P):-
length(W,N),
sum(W,Z),
scale(W,1/Z,P).
%
make_a_prob(P,base(M),steps(L)):-
var(P),
length(P,M),
allocation(M,L,W),
probabilities(W,M,P).
make_a_prob(P,base(M),_):-
\+ var(P),
length(P,M),
\+ (
member(P1,P),
(
var(P1);
P1 > 1;
P1 < 0
)
),
sum(P,1).
%
% expected value
% ----------------------------------------------------------- %
expected_value(W,A,E/100):-
length(A,N),
probabilities(W,N,P),
product_sum(P,A,_,E).
%
% weighted sum
% ----------------------------------------------------------- %
product_sum([],[],[],0).
product_sum([P|Q],[A|B],[E|F],V):-
length(Q,N),
length(B,N),
product_sum(Q,B,F,V1),
E is P * A,
V is V1 + E.
%
% ----------------------------------------------------------- %
% Utilities for list operations
% ----------------------------------------------------------- %
%
% index for a tuple.
% ----------------------------------------------------------- %
% 1) only mention for a direct product of sets.
index_of_tuple(B,A,Index):-
\+ var(B),
\+ var(A),
length(B,LN), % base sets
length(A,LN),
length(Index,LN),
findall(L,
(
nth1(K,B,BJ), %write(a(K,B,BJ)),
nth1(L,BJ,AJ),%write(b(L,BJ,AJ)),
nth1(K,A,AJ) %,write(c(K,A,AJ)),nl
),
Index).
index_of_tuple(B,A,Index):-
\+ var(B),
\+ var(Index),
var(A),
length(B,LN), % base sets
length(Index,LN),
length(A,LN),
findall(AJ,
(
nth1(K,B,BJ),
nth1(K,Index,L),
nth1(L,BJ,AJ)
),
A).
%
% descending/ascending natural number sequence less than N.
% ----------------------------------------------------------- %
dnum_seq([],N):-N<0,!.
dnum_seq([0],1).
dnum_seq([A|Q],N):-
A is N - 1,
length(Q,A),
dnum_seq(Q,A).
anum_seq(Aseq,N):-dnum_seq(Dseq,N),sort(Dseq,Aseq).
%
% inquire the goal multiplicity
% ----------------------------------------------------------- %
sea_multiple(Goal,Cond,N,M):-
Clause=..Goal,
findall(Cond,Clause,Z),length(Z,N),sort(Z,Q),length(Q,M).
%
bag0([],_A,0).
bag0([C|B],A,N):-
length([C|B],N),
bag0(B,A,_N1),
member(C,A).
zeros(Zero,N):-bag0(Zero,[0],N).
ones(One,N):-bag0(One,[1],N).
%
% subset_of/3 : subset-enumeration
% ----------------------------------------------------------- %
subset_of(A,N,As):-
length(As,L),
length(D,L),
list_projection(D,As,B),
length(B,N),
sort(B,A).
% a sequence of binary choice for a list:
%--------------------------------------------------
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).
%
% ----------------------------------------------------------- %
% Utilities for outputs
% ----------------------------------------------------------- %
%
% write and new line.
% ----------------------------------------------------------- %
wn(X):-write(X),nl.
%
% output to file.
% ----------------------------------------------------------- %
tell_test(Goal):-
open('tell.txt',write,S),
tell('tell.txt'),
Goal,
current_stream('tell.txt',write,S),
tell(user),wn(end),
close(S).
%
%end