如何在Problog中设置互斥概率?

How to set mutually exclusive probabilities in Problog?

一个人 X 可以是 inpatientoutpatient。 鉴于 location(X,outpatient) 这个事实,Problog 如何推断 location(X,inpatient) 的概率为 0?

例如我想要一个副作用:

person(1).
location(1,inpatient).
dependent(1,opioids).
receive(1,clonidine).
query(detoxification(1,opioids,success)).

推断 location(1,outpatient) 的概率为零。

如果我写 location(X,outpatient);location(X,inpatient).,所有查询 return 的概率都是 1。

如果我写 P::location(X,outpatient);(1-P)::location(X,inpatient). 会给出错误,因为我没有为 P 指定值。如果我为 P 指定一个值,则该值永远不会更新(正如预期的那样,因为 Prolog 将变量视为 algebraic 变量并且我没有告诉 Problog 更新 P.

如果我写 location(X,outpatient) :- \+ location(X,inpatient). 我创建了一个负循环,如果我要指定反向目标,我必须这样做。

一个解决方案:

P::property(X,location,inpatient);(1-P)::property(X,location, outpatient) :- 
    inpatient(X),
    P is 1. 

P::property(X,location,outpatient);(1-P)::property(X,location, inpatient) :- 
    outpatient(X),
    P is 1. 

P::inpatient(X);(1-P)::outpatient(X) :- 
    property(X,location,inpatient),
    P is 1.

P::outpatient(X);(1-P)::inpatient(X) :-
    property(X,location,outpatient),
    P is 1. 

对于值 inpatientlocation 的 属性,这会将 inpatient/1 绑定到 property/3