在Prolog中对N个相关事件进行析取的可能性

时间:2019-04-01 19:31:41

标签: prolog probability

有人知道在哪里可以找到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

3 个答案:

答案 0 :(得分:2)

我对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独立。 / p>

上面的公式在我的论文中是C.3.10项:http://riso.sourceforge.net/docs/dodier-dissertation.pdf这是一个简单的结果,我想它一定是某些教科书中的练习,尽管我不记得看过它。

答案 1 :(得分:2)

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程序员不禁注意到定义不是。这实际上仅在处理非常长的列表时才是问题,但是由于列表元素的顺序无关紧要,因此很容易解决。这是一种标准技术,使用辅助谓词和“累加器对”参数:

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

答案 2 :(得分:1)

对于任何事件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])}