You selected eba01.pl


data_of_this_program([
  line('%-------------------------------------------------------%'),
  title(' elimination by aspects (EBA) model by Tversky(1972).'),
  line('%-------------------------------------------------------%'),
  program_name('eba01.pl'),
  created(by('Kenryo INDO ')),
  created(date('21-23 May 2003')),
  modified(date('25-26,28 May 2003')),
  privious_program('eba0.pl(14 May 2003)'),
  reference(1,author('Tversky, A.(1972)')),
  reference(1,title('Elimination by aspects')),
  reference(1,journal('Psychological Review 79(4): 281-299.')),
  reference(2,author('Tversky, A.(1972)')),
  reference(2,title('Choice by elimination')),
  reference(2,journal('J Mathematical Psychology 9: 341-367.')),
  line('%-------------------------------------------------------%'),
  main_predicates(aspects/3),
  main_predicates(utility/3),
  main_predicates(eliminate_by_aspects/4),
  main_predicates(iterative_elimination/4)
]).

:- data_of_this_program(X),forall(member(T,X),(nl,write(T))).

:- dynamic mc/3.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%    basic data of the alternatives
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

alternatives(model(1),[x,y,z]).
alternatives(model(2),[x,y,z]).
alternatives(model(3),[x,y,z]).

aspects(model(1),base,x,[a,w]).
aspects(model(1),base,y,[b,w]).
aspects(model(1),base,z,[c]).

aspects(model(2),base,x,[a,t,r,w]).
aspects(model(2),base,y,[b,t,s,w]).
aspects(model(2),base,z,[c,r,s,w]).

aspects(model(3),base,x,[b,c,w]).
aspects(model(3),base,y,[b,c,w]).
aspects(model(3),base,z,[a,w]).

aspects(M,subset,S,Ax):-
   alternatives(M,Alts),
   subset_of(S,_,Alts),
   S \= [],
   findall(A,
     (
      member(E,S),
      aspects(M,base,E,Asp),
      member(A,Asp)
     ),
   Ax0),
   sort(Ax0,Ax).
aspects(M,uniqueness,X,Ix):-
   aspects(M,base,X,Ax),
   alternatives(M,Alts),
   subtract(Alts,[X],OTX),
   aspects(M,subset,OTX,Bx),
   subtract(Ax,Bx,Ix).
aspects(M,shared(base),[X,Y],Axy):-
   aspects(M,base,X,Ax),
   aspects(M,base,Y,Ay),
   %Y \= X,
   intersection(Ax,Ay,Axy).
aspects(M,shared(subset),[X,Y],Axy):-
   aspects(M,subset,X,Ax),
   aspects(M,subset,Y,Ay),
   %Y \= X,
   intersection(Ax,Ay,Axy).
aspects(M,difference,S-T,Dst):-
   aspects(M,subset,S,As),
   aspects(M,subset,T,At),
   subtract(As,At,Dst).
aspects(M,vector,S,P):-
   alternatives(M,Alts),
   aspects(M,subset,Alts,Asp0),
   aspects(M,subset,S,Ax),
   list_projection(P,Asp0,Ax).


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%    utilities and probabilistic choice
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%----utility for each aspect.

utility(model(1),aspect(a),1).
utility(model(1),aspect(b),1).
utility(model(1),aspect(c),2).
utility(model(1),aspect(w),1).

utility(model(2),aspect(a),1).
utility(model(2),aspect(b),3).
utility(model(2),aspect(c),5).
utility(model(2),aspect(r),2).
utility(model(2),aspect(s),3).
utility(model(2),aspect(t),5).
utility(model(2),aspect(w),1).

utility(model(3),aspect(a),1).
utility(model(3),aspect(b),1).
utility(model(3),aspect(c),2).
utility(model(3),aspect(w),3).

%----utility for a set of alternatives.

utility(M,S=Asp,U=Uq):-
   aspects(M,subset,S,Asp),
   findall(B,
     (
      member(A,Asp),
      utility(M,aspect(A),B)
     ),
   U0),
   sum_eq(U0,Uq,U).

%----utility for a set of aspects.

utility(M,aspects(S),U=Uq):-
   alternatives(M,ALL),
   aspects(M,subset,ALL,Asp),
   subset_of(S,_,Asp),
   findall(UA,
     (
      member(A,S),
      utility(M,aspect(A),UA)
     ),
   US),
   sum_eq(US,Uq,U).


%----probabilistic choice from a set of alternatives.
% note: this not always eliminate the complement.

probabilistic_choice(M,S->T,P=(Pq1=(Pq=u(C)/u(A)))):-
   utility(M,S=A, U0=Uq0),
   U0 \= 0,
   subset_of(T,_,S),
   T \= [],
   aspects(M,shared(subset),[S,T],C),
   utility(M,aspects(C), U1=Uq1),
   Pq1 = U1/U0,
   Pq = Uq1/Uq0,
   P is Pq.


%----probabilistic choice for the set of aspects.
probabilistic_choice(M,S->T,P=(Pq=u(T)/u(S))):-
   utility(M,aspects(S),_),
   findall(US,
     (
      subset_of(T0,_,S),
      utility(M,aspects(T0),_=US)
     ),
   USS),
   sum_eq(USS,Uq0,_),
   subset_of(T,_,S),
   T\=[],
   T\=S,
   utility(M,aspects(T),_=Uq1),
   Pq =Uq1/Uq0,
   P is Pq.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%    elimination procedure
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

eliminate_by_aspects(Model,S->(T:Deleted),F):-
   aspects(Model,subset,S,AS),
   subset_of(F,_,AS),  F \=[],
   subset_of(Deleted,_,S), Deleted \=[],
   aspects(Model,subset,Deleted,AD),
   intersection(AD,F,[]),
   subtract(S,Deleted,T),
   \+ (
     member(X,T),
     aspects(Model,base,X,AX),
     \+ subset(F,AX)
   ).

eliminate_by_aspects(M,S->(T:D),F,P=Formulas):-
   eliminate_by_aspects(M,S->(T:D),F),
   utility(M,aspects(F), U1=U1eq),
   find_all_alternative_ebas(M,S,EBAs),
   %display_each_eba(EBAs),
   sum_utility_of_aspects(EBAs,_,U0sEq,U0),
   sum_equations_of_utilities(EBAs,_,UF0),
   P is U1eq / U0sEq,
   Input =[U1,U0,U1eq,U0sEq,F,UF0],
   equation_of_choice_probability(Input,Formulas).


/*
%------stock of the modeling error--------
eliminate_by_aspects(Model,S->(T:Deleted),F):-
   aspects(Model,difference,S-Deleted,FocalSet),
   subset_of(Deleted,_,S),
   subtract(S,Deleted,T),
   subset_of(F,_,FocalSet),
   F \=[],
   aspects(Model,shared(subset),[S,T],Common),
   Common \= [],
   subset_of(F,_,Common).
eliminate_by_aspects(Model,S->(T:Deleted),F):-
   aspects(Model,subset,S,AS),
   subset_of(T,_,S), T\=[],
   aspects(Model,subset,T,AT),
   subtract(AS,AT,FocalSet), FocalSet \=[],
   subset_of(F,_,FocalSet), F \=[],
   subtract(S,T,Deleted).
eliminate_by_aspects(Model,S->(T:Deleted),F):-
   aspects(Model,subset,S,AS),
   subset_of(T,_,S), T\=[],
   aspects(Model,subset,T,AT),
   subtract(AS,AT,FocalSet), FocalSet \=[],
   subset_of(F,_,FocalSet), F \=[],
   subtract(S,T,Deleted),
   aspects(Model,shared(subset),[T,Deleted],[]).
*/

find_all_alternative_ebas(M,S,EBAs):-
   EBA = eba(M,S->(T0:D0),F0,U0eq=u(F0)),
   findall(EBA,
     (
      eliminate_by_aspects(M,S->(T0:D0),F0),
      utility(M,aspects(F0),_=U0eq)
     ),
   EBAs).

display_each_eba(EBAs):-
   forall(member(X,EBAs),(nl,write(X))).

sum_utility_of_aspects(EBAs,U0s,U0sEq,U0):-
   X = eba(_,_,_,U0eq=_),
   findall(U0eq,member(X,EBAs),U0s),
   sum_eq(U0s,U0sEq,U0).

sum_equations_of_utilities(EBAs,UF0s,UF0):-
   X = eba(_,_,F0,_=u(F0)),
   findall(u(F0),member(X,EBAs),UF0s),
   eqsum(UF0s,UF0).

equation_of_choice_probability(Input,Formulas):-
   Input =[U1,U0,U1eq,U0sEq,F,UF0],
   Formula1= U1/U0,
   Formula2= U1eq/U0sEq,
   Formula3= u(F)/UF0,
   Formulas= (Formula1=(Formula2=Formula3)).


/*
%-------sample executions----------

?- eliminate_by_aspects(model(1),[x,y,z]->A,B,C=(D=(E=F))).

A = [x, y]:[z]
B = [w]
C = 0.2
D = 1/5
E = 1/ (1+1+2+1)
F = u([w])/ (u([a])+u([b])+u([c])+u([w])) ;

A = [z]:[x, y]
B = [c]
C = 0.4
D = 2/5
E = 2/ (1+1+2+1)
F = u([c])/ (u([a])+u([b])+u([c])+u([w])) ;

A = [y]:[x, z]
B = [b]
C = 0.2
D = 1/5
E = 1/ (1+1+2+1)
F = u([b])/ (u([a])+u([b])+u([c])+u([w])) ;

A = [x]:[y, z]
B = [a]
C = 0.2
D = 1/5
E = 1/ (1+1+2+1)
F = u([a])/ (u([a])+u([b])+u([c])+u([w])) ;

No
?- 
?- eliminate_by_aspects(model(2),A,B,C=(C1=(C2=C3))).

eba(model(1), ([y, z]->[y]:[z]), [c], 2=u([c]))
eba(model(1), ([y, z]->[y]:[z]), [b], 1=u([b]))
eba(model(1), ([y, z]->[y]:[z]), [b, c], 2+1=u([b, c]))
eba(model(1), ([y, z]->[z]:[y]), [a], 1=u([a]))

A = [y, z]->[y]:[z]
B = [c]
C = 0.285714
C1 = 2/7
C2 = 2/ (1+ (2+1)+1+2)
C3 = u([c])/ (u([a])+u([b, c])+u([b])+u([c])) ;

<--omit-->

?- eliminate_by_aspects(model(1),[x,y,z]->[z]:[x,y],B,C=(D=(E=F))).

eba(model(1), ([x, y, z]->[x, y]:[z]), [c], 2=u([c]))
eba(model(1), ([x, y, z]->[x, y]:[z]), [b], 1=u([b]))
eba(model(1), ([x, y, z]->[x, y]:[z]), [b, c], 2+1=u([b, c]))
eba(model(1), ([x, y, z]->[z]:[x, y]), [a], 1=u([a]))

B = [a]
C = 0.142857
D = 1/7
E = 1/ (1+ (2+1)+1+2)
F = u([a])/ (u([a])+u([b, c])+u([b])+u([c])) ;

No
?- eliminate_by_aspects(model(2),[x,y,z]->A,B,C=(D=(E=F))).

A = [x, y]:[z]
B = [c]
C = 0.285714
D = 2/7
E = 2/ (1+ (2+1)+1+2)
F = u([c])/ (u([a])+u([b, c])+u([b])+u([c])) ;

A = [x, y]:[z]
B = [b]
C = 0.142857
D = 1/7
E = 1/ (1+ (2+1)+1+2)
F = u([b])/ (u([a])+u([b, c])+u([b])+u([c])) ;

A = [x, y]:[z]
B = [b, c]
C = 0.428571
D = 3/7
E = (2+1)/ (1+ (2+1)+1+2)
F = u([b, c])/ (u([a])+u([b, c])+u([b])+u([c])) ;

A = [z]:[x, y]
B = [a]
C = 0.142857
D = 1/7
E = 1/ (1+ (2+1)+1+2)
F = u([a])/ (u([a])+u([b, c])+u([b])+u([c])) ;

No
?-
%-------end of sample executions----------
*/

:- dynamic ieba /5.

iterative_elimination_0(M,(S->S),([],[Asp],[1]),1=(1=1)):-
   aspects(M,subset,S,Asp).

iterative_elimination_0(M,(S->T),Paths,P1=(P1eq=P1eq2)):-
   aspects(M,subset,S,_AS),
   subset_of(T,_,S),T\=[],T\=S,
   aspects(M,subset,T,_AT),
   eliminate_by_aspects(M,T1->(T:D),F,P=Peq),
   iterative_elimination_0(M,(S->T1),Paths0,_P0=(P0eq=P0eq2)),
   Paths0=(DelPath,AspPath,PrPath),
   Paths=([D|DelPath],[F|AspPath],[P|PrPath]),
   P1eq2 = P0eq2 * Peq,
   P1eq = P0eq * P,
   P1 is P1eq.


/*
?- iterative_elimination_0(model(2),[x,y,z]->A,B,C=_).

A = [x, y, z]
B = [], [[a, b, c, w]], [1]
C = 1 ;

A = [z]
B = [[x, y]], [[a], [a, b, c, w]], [0.142857, 1]
C = 0.142857 ;

A = [x, y]
B = [[z]], [[c], [a, b, c, w]], [0.285714, 1]
C = 0.285714 ;

A = [x, y]
B = [[z]], [[b], [a, b, c, w]], [0.142857, 1]
C = 0.142857 ;

A = [x, y]
B = [[z]], [[b, c], [a, b, c, w]], [0.428571, 1]
C = 0.428571 ;

No
?- 

*/

iterative_elimination(M,(S->S),([],[Asp],[1]),1=(1)):-
   aspects(M,subset,S,Asp).

iterative_elimination(M,(S->T),Paths,P1=(P1eq)):-
   aspects(M,subset,S,_AS),
   subset_of(T,_,S),T\=[],T\=S,
   aspects(M,subset,T,_AT),
   R = eba(M,T1->(T:D),F,P=Peq),
   findall(R,
     eliminate_by_aspects(M,T1->(T:D),F,P=Peq),
   EBA0),
   W = ieba(M,(S->T),NewPaths,P=Peq,P0=(P0eq)),
   findall(W,
     (
      member(R,EBA0),
      iterative_elimination_0(M,(S->T1),Paths0,P0=(P0eq)),
      Paths0=(DelPath,AspPath,PrPath),
      NewPaths=([D|DelPath],[F|AspPath],[P|PrPath])
     ),
   EBA),
   EBA \=[],
   forall(member(W,EBA),(nl,write(W),write('.')%,assert(W)
)),
   findall(P*P0,member(W,EBA),Ps),
   findall(NewPaths,member(W,EBA),Paths),
   sum_eq(Ps,P1eq,P1).


/*

?- iterative_elimination(model(3),[x,y,z]->A,B,C=_).

A = [x, y, z]
B = [], [[a, b, c, w]], [1]
C = 1 ;

ieba(model(1), ([x, y, z]->[z]), ([[x, y]], [[a], [a, b, c, w]], [0.142857, 1]), 0.142857= (1/7= (1/ (1+ (2+1)+1+2)=u([a])/ (u([a])+u([b, c])+u([b])+u([c])))), 1= (1=1)).

A = [z]
B = [ ([[x, y]], [[a], [a, b, c, w]], [0.142857, 1])]
C = 0.142857*1 ;

ieba(model(1), ([x, y, z]->[x, y]), ([[z]], [[c], [a, b, c, w]], [0.285714, 1]), 0.285714= (2/7= (2/ (1+ (2+1)+1+2)=u([c])/ (u([a])+u([b, c])+u([b])+u([c])))), 1= (1=1)).
ieba(model(1), ([x, y, z]->[x, y]), ([[z]], [[b], [a, b, c, w]], [0.142857, 1]), 0.142857= (1/7= (1/ (1+ (2+1)+1+2)=u([b])/ (u([a])+u([b, c])+u([b])+u([c])))), 1= (1=1)).
ieba(model(1), ([x, y, z]->[x, y]), ([[z]], [[b, c], [a, b, c, w]], [0.428571, 1]), 0.428571= (3/7= ((2+1)/ (1+ (2+1)+1+2)=u([b, c])/ (u([a])+u([b, c])+u([b])+u([c])))), 1= (1=1)).

A = [x, y]
B = [ ([[z]], [[c], [a, b, c, w]], [0.285714, 1]), ([[z]], [[b], [a, b, c|...]], [0.142857, 1]), ([[z]], [[b, c], [a, b|...]], [0.428571, 1])]
C = 0.857143 ;

No
?-
?- tell_goal( 'out_eba.txt',
iterative_elimination(model(2),[x,y,z]->A,[B|B1],(C=(D=E)))
).

A = _G169
B = _G171
B1 = _G172
C = _G174
C1 = _G175 

Yes
?- ['out_eba.txt'].

Yes.
?- iterative_elimination(model(2),[x,y,z]->[A],[B|B1],C=C1).

A = z
B = [[y], [x]], [[r], [s], [a, b, c, r|...]], [0.0666667, 0.0247934, 1]
B1 = [ ([[y], [x]], [[r], [c], [a, b, c|...]], [0.0666667, 0.0413223, 1]), ([[y], [x]], [[r], [c, s], [a, b|...]], [0.0666667, 0.0661157, 1]), ([[y], [x]], [[r], [b], [a|...]], [0.0666667, 0.0247934, 1]), ([[y], [x]], [[r], [b|...], [...|...]], [0.0666667, 0.0495868, 1]), ([[y], [x]], [[r], [...|...]|...], [0.0666667, 0.0661157|...]), ([[y], [...]], [[...]|...], [0.0666667|...]), ([[...]|...], [...|...], [...|...]), ([...|...], ..., ...), (..., ...)|...]
C = 0.362141
C1 = ... +... +... *... +0.166667*0.0247934+0.0666667*0.0909091+0.0666667*0.0661157+0.0666667*0.0495868+0.0666667*0.0247934+0.0666667*0.0661157+0.0666667*0.0413223+0.0666667*0.0247934 ;

% and so on.


*/

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%    simulation
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ----- iterative elimination with mc trials

init_mc(M):-
   retractall(mc(M,_,_)).

eba_process(M,E_step,prob([1])):-
   init_mc(M),
   alternatives(M,S),
   E_step = [(S,S),[],[Asp]],
   iterative_elimination(M,(S,S),[],[Asp]),
   MC = mc(M,[last(0)|E_step],prob(1/1,[])),
   assert(MC).

eba_process(M,E_step,prob([P|Q])):-
   E_step = [(S,T),[_D|Path],[_F|AspPath]],
   E_step0 = [(S,T0),Path,AspPath],
   MC0 = mc(M,[last(N0)|E_step0],prob(_,Q)),
   MC0,
   N is N0 + 1,
   make_mc_data(T0->T,N,MC0),
   eba_selection(M,N,E_step,P).

% ----- monte carlo simulation

make_mc_data(T0->T,N,MC0):-
   MC0 = mc(M,[last(_)|E_step0],prob(P0/_,Q)),
   E_step0 = [(S,T0),Path,AspPath],
   E_step = [(S,T),[D|Path],[F|AspPath]],
   MC = mc(M,[last(N)|E_step],prob(P/_,[P0|Q])),
   EBA = eliminate_by_aspects(M,T0->(T:D),F),
   PROB = probabilistic_choice(M,T0->T,P=_),
   forall(
     (
      EBA,nl,write(EBA),
      T \= T0,
      PROB,
      nl,write(PROB)
     ),
     (
      update_mc(MC)
     )
   ).

update_mc(MC):-
   MC = mc(M,[last(N)|_],prob(P/CP,Q)),
   MC0 = mc(M,[last(N)|E_step0],prob(P0/CP0,Q)),
   clause(MC0,true),
   retract(MC0),
   % nl,write(retract:MC0),
   MC1 = mc(M,[N|E_step0],prob(P0/CP0,Q)),
   assert(MC1),
   % nl,write(assert:MC1),
   CP is CP0 + P,
   assert(MC),
   nl,write(new:MC).

update_mc(MC):-
   MC = mc(M,[last(N)|_],prob(P/P,Q)),
   MC0 = mc(M,[last(N)|_],prob(_,Q)),
   \+ clause(MC0,true),
   assert(MC),
   nl,write(new:MC).

eba_selection(M,N,E_step,P):-
   member(X,[best(N),last(N)]),
   mc(M,[X|E_step],prob(P/_CP,_Q)).




%------------------------------------------------
%  mathematical utiliteis
%------------------------------------------------
max_of(X,[X]).
max_of(Z,[X|Y]):-
   max_of(Z1,Y),
   (X > Z1 -> Z=X; Z=Z1).
min_of(X,[X]).
min_of(Z,[X|Y]):-
   min_of(Z1,Y),
   (X < Z1 -> Z=X; Z=Z1).
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).

dnum_seq1(Q,N):-
   M is N + 1,
   dnum_seq(Q0,M),
   subtract(Q0,[0],Q).
anum_seq1(Q,N):-
   M is N + 1,
   anum_seq(Q0,M),
   subtract(Q0,[0],Q).

% bag0/3 : allow multiplicity
% -----------------------------------------------------------  %
bag0([],_A,0).
bag0([C|B],A,N):-length([C|B],N),bag0(B,A,_N1),%N is N1 + 1,
  member(C,A).

zeros(Zero,N):-bag0(Zero,[0],N).
ones(One,N):-bag0(One,[1],N).

%
% bag1/3 : do not allow multiplicity
% -----------------------------------------------------------  %
bag1([],_A,0).
bag1([C|B],A,N1):-
  \+var(A),
  length(A,L),
  anum_seq(Q,L),
  member(N,Q),
  length(B,N),bag1(B,A,N),N1 is N + 1,
  member(C,A),\+member(C,B).

% ordering/3
% -----------------------------------------------------------  %
ordering(A,B,C):-bag1(A,B,C).

% a sequence of binary choice for a list:
%--------------------------------------------------
list_projection([],[],[]).
list_projection([X|Y],[_|B],C):-
   list_projection(Y,B,C),
   X = 0.
list_projection([X|Y],[A|B],[A|C]):-
   list_projection(Y,B,C),
   X = 1.

% complementary list projection
%--------------------------------------------------
c_list_projection([],[],[]).
c_list_projection([X|Y],[_|B],C):-
   c_list_projection(Y,B,C),
   X = 1.
c_list_projection([X|Y],[A|B],[A|C]):-
   c_list_projection(Y,B,C),
   X = 0.

subset_of(A,N,As):-
   length(As,L),
   length(D,L),
   list_projection(D,As,B),
   length(B,N),
   sort(B,A).

sum([],0).
sum([X|Members],Sum):-
   sum(Members,Sum1),
   Sum is Sum1 + X.

sum_eq([],0,0).
sum_eq([X],X,X).
sum_eq([X|Members],Eq,Sum):-
   Members \= [],
   sum_eq(Members,Eq1,Sum1),
   Eq = Eq1 + X,
   Sum is Sum1 + X.

reqsum(A,B):-
   reverse(A,C),
   eqsum(C,B).
eqsum([],0).
eqsum([X|Members],Sum):-
   eqsum(Members,Sum0),
   (
    X=0 -> Sum = Sum0
     ;
    (
     Sum0=0 -> Sum = X
      ;
     Sum = Sum0 + X
    )
   ).

%
% product
% -----------------------------------------------------------  %
product([],1).
product([X|Members],Z):-
   product(Members,Z1),
  %number(X),
   Z is Z1 * X.
%
% 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.
%
% product sum value with equational
% -----------------------------------------------------------  %
product_sum_eq([],[],[],0,0).
product_sum_eq([P|Q],[A|B],[E|F],V,Vq):-
    length(Q,N),
    length(B,N),
    product_sum_eq(Q,B,F,V1,Vq1),
    Eq = (P) * A,
    E is Eq,
    (Vq1=0 -> Vq = Eq; Vq = Vq1 + Eq),
    V is V1 + E.


% tell a successful goal
%--------------------------------

tell_goal(File,G):-
   (current_stream(File,write,S0)->close(S0);true),
   open(File,write,S),
   tell(File),
   nl,
   tstamp('% file output start time ',_),
   nl,
   write('%----------  start from here ------------%'),
   nl,
   G,
   nl,
   write('%----------  end of data ------------%'),
   nl,
   tstamp('% file output end time ',_),
   tell(user),
   close(S),
   % The following is to cope with the duplicated stream problem.
   (current_stream(File,write,S1)->close(S1);true).


% tell all successful goal
%--------------------------------

tell_goal(File,forall,G):-
   G0 = (nl,write(G),write('.')),
   G1 = forall(G,G0),
   tell_goal(File,G1).


% time stamp
%--------------------------------

tstamp(no,T):-
   get_time(U),
   convert_time(U,A,B,C,D,E,F,_G),
   T = [date(A/B/C), time(D:E:F)],
   nl.

tstamp(Word,T):-
   \+ var(Word),
   Word \= no,
   get_time(U),
   convert_time(U,A,B,C,D,E,F,_G),
   T = [date(A/B/C), time(D:E:F)],
%   format('~`.t~t~a~30|~`.t~t~70|~n',[Word]),
   write((Word,T)),
   nl.




%----------end of pogram ----------%


/*

%-----------tombeau of bugs -----------------

init_mc(M):-
   retractall(mc(M,_,_)).

eba_process(M,E_step,prob([1])):-
   init_mc(M),
   alternatives(M,S),
   E_step = [(S,S),[],[Asp]],
   iterative_elimination(M,(S,S),[],[Asp]),
   MC = mc(M,[last(0)|E_step],prob(1/1,[])),
   assert(MC).

eba_process(M,E_step,prob([P|Q])):-
   E_step = [(S,T),[_D|Path],[_F|AspPath]],
   E_step0 = [(S,T0),Path,AspPath],
   MC0 = mc(M,[last(N0)|E_step0],prob(_,Q)),
   MC0,
   N is N0 + 1,
   make_mc_data(T0->T,N,MC0),
   eba_selection(M,N,E_step,P).

% ----- monte carlo simulation

make_mc_data(T0->T,N,MC0):-
   MC0 = mc(M,[last(_)|E_step0],prob(P0/_,Q)),
   E_step0 = [(S,T0),Path,AspPath],
   E_step = [(S,T),[D|Path],[F|AspPath]],
   MC = mc(M,[last(N)|E_step],prob(P/_,[P0|Q])),
   EBA = eliminate_by_aspects(M,T0->(T:D),F),
   PROB = probabilistic_choice(M,T0->T,P=_),
   forall(
     (
      EBA,nl,write(EBA),
      T \= T0,
      PROB,
      nl,write(PROB)
     ),
     (
      update_mc(MC)
     )
   ).

update_mc(MC):-
   MC = mc(M,[last(N)|_],prob(P/CP,Q)),
   MC0 = mc(M,[last(N)|E_step0],prob(P0/CP0,Q)),
   clause(MC0,true),
   retract(MC0),
   % nl,write(retract:MC0),
   MC1 = mc(M,[N|E_step0],prob(P0/CP0,Q)),
   assert(MC1),
   % nl,write(assert:MC1),
   CP is CP0 + P,
   assert(MC),
   nl,write(new:MC).

update_mc(MC):-
   MC = mc(M,[last(N)|_],prob(P/P,Q)),
   MC0 = mc(M,[last(N)|_],prob(_,Q)),
   \+ clause(MC0,true),
   assert(MC),
   nl,write(new:MC).

eba_selection(M,N,E_step,P):-
   member(X,[best(N),last(N)]),
   mc(M,[X|E_step],prob(P/_CP,_Q)).

iterative_elimination_0(M,(S,S),([],[Asp],[1]),1=(1=1)):-
   aspects(M,subset,S,Asp).

iterative_elimination_0(M,(S,T),Paths,Q=((Q0*P)=Qeq)):-
   subset_of(T,_,S),T\=[],T\=S,
   aspects(M,subset,T,_AT),
   iterative_elimination_0(M,(S,T1),(DelPath,AspPath,PrPath),Q0=(_=Q0eq)),
   Paths=([D|DelPath],[F|AspPath],[P|PrPath]),
   eliminate_by_aspects(M,T1->(T:D),F,P=Peq),
   Qeq= Q0eq * Peq,
   Q is Qeq.

*/


return to front page.