有谁知道在哪里可以找到Prolog算法来计算N个依赖事件的分离概率?对于N = 2我知道P(E1或E2)= P(E1)+ P(E2) - P(E1)* P(E2),所以可以这样做:
prob_disjunct(E1, E2, P):- P is E1 + E2 - E1 * E2
但是当输入是一个列表时,如何将这个谓词推广到N个事件?也许有一个包这样做?
问候/ JCR
Robert Dodier的答案的递归公式直接转换为
p_or([], 0).
p_or([P|Ps], Or) :-
p_or(Ps, Or1),
Or is P + Or1*(1-P).
虽然这很好用,例如
?- p_or([0.5,0.3,0.7,0.1],P).
P = 0.9055
铁杆Prolog程序员不禁注意到定义不是tail-recursive。当你处理非常长的列表时,这实际上只是一个问题,但由于列表元素的顺序无关紧要,因此很容易扭转局面。这是一种标准技术,使用辅助谓词和参数的“累加器对”:
p_or(Ps, Or) :-
p_or(Ps, 0, Or).
p_or([], Or, Or).
p_or([P|Ps], Or0, Or) :-
Or1 is P + Or0*(1-P),
p_or(Ps, Or1, Or). % tail-recursive call
我对Prolog一无所知,但无论如何,以递归方式编写多个独立项p_m = Pr(S_1或S_2或S_3或......或S_m)的分离概率很方便
p_m = Pr(S_m) + p_{m - 1} (1 - P(S_m))
你可以通过剥离最后一项来证明这一点 - 看看Pr((S_1或......或S_ {m - 1})或S_m)然后根据通常的公式写出,写下Pr(A或B)= Pr(A)+ Pr(B)-Pr(A)Pr(B)= Pr(B)+ Pr(A)(1-Pr(B)),A和B独立。
上面的公式是我的论文中的C.3.10项:http://riso.sourceforge.net/docs/dodier-dissertation.pdf这是一个简单的结果,我想它必须是一些教科书中的练习,虽然我不记得看到它。
对于任何事件E我将为补充事件写E'(即如果E没有,则发生E')。然后我们有:
P(E') = 1 - P(E)
(A union B)' = A' inter B'
A and B are independent iff A' and B' are independent
所以对于独立的E1..En
P( E1 union .. union En ) = 1 - P( E1' inter .. inter En')
= 1 - product{ i<=i<=n | 1 - P(E[i])}