Prolog中N个依赖事件脱离的可能性

问题描述 投票:1回答:3

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

prolog probability
3个回答
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
投票

我对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这是一个简单的结果,我想它必须是一些教科书中的练习,虽然我不记得看到它。


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])}
© www.soinside.com 2019 - 2024. All rights reserved.