Prolog 为什么这会给出一个非roundProbabilisticClause错误,而不是确定性的对应项?

Prolog 为什么这会给出一个非roundProbabilisticClause错误,而不是确定性的对应项?,prolog,problog,Prolog,Problog,我想让这个程序表明,如果一个人使用特定物质列表中的一种,那么他使用尼古丁的几率为80% 在下面的例子中,我定义了substance/1仅对少数原子为真 如何解释属性/3的两个版本之间的行为差异?概率版本似乎没有中讨论的问题 更新 与@2bigpips的讨论引出了一个相关的问题。在probability子句的开头指定一个概率并不意味着将概率限制在该值。如果要将概率与估计量(例如,从实验中)联系起来,这一点很重要。简短回答:确定性子句和概率子句具有不同的语义。第二部分的详细答案 第1部分:你的计划意

我想让这个程序表明,如果一个人使用特定物质列表中的一种,那么他使用尼古丁的几率为80%

在下面的例子中,我定义了
substance/1
仅对少数原子为真

如何解释
属性/3
的两个版本之间的行为差异?概率版本似乎没有中讨论的问题

更新


与@2bigpips的讨论引出了一个相关的问题。在probability子句的开头指定一个概率并不意味着将概率限制在该值。如果要将概率与估计量(例如,从实验中)联系起来,这一点很重要。

简短回答:确定性子句和概率子句具有不同的语义。第二部分的详细答案

第1部分:你的计划意味着什么

substance(Y).        % means everything is a substance.
property(1, use, Y). % means: 1 uses everything (whatever 1 is)
如前一个问题中所述,变量的范围仅限于子句。这些事实中的Y不是同一个变量。从逻辑角度看,您有两个独立的子句:

(\forall Y: substance(Y))
 (\forall Z: person(1, use, Z))
他的建议将起作用,意味着第1人使用所有物质。 物质(美沙酮)。 物质(海洛因)

看到您的意思后进行编辑 由于无论使用1种或多种物质,您都希望其为0.8,因此可以执行以下操作:

argument-in-prolog-using-a-series-of-facts
substance(methadone). 
substance(heroin).

0.8::property(X,use,nicotine) :- 
    uses_atleast_one_substance(X).

uses_atleast_one_substance(X):-
    property(X,use,Z),
    substance(Z).


person(1).
property(1, use, Y):- substance(Y).

query(property(1,use, nicotine)).
第2部分:发生了什么事

我必须在这里做一个猜测:非概率子句可能会起作用,因为它是非概率的,因此不是带注释的析取。它可能具有类似prolog的语义

概率子句遵循带注释析取的语义。每个概率子句都隐含着一个带注释的析取-
p::head:-body.
p::head;(1-p)非头部:-身体。

这是一篇语义为“”的论文。 它说身体的每一个根植都会以特定的概率独立地导致头部真实

考虑到这一点,你得到这个错误的原因是因为证据中确实有一个非基础实体

P::property(X,use,nicotine) :-  %gives  NonGroundProbabilisticClause error
    property(X,use,W), % This can unify with person(1,use,Z), leaving Z free
    substance(Z),      % This can unify with substance(Y), leaving Z free
    P is 0.8.

身体里不能有变量,因为你不知道有多少原因。它破坏了语义,problog检测到它并抛出一个错误。这就是正在发生的事情。

你能告诉我们你希望这个节目是什么意思吗?目前,
物质(Y)
意味着一切都是物质,
属性(1,使用,Y)。
意味着1使用一切(无论Y是物质、人还是糟糕的类比)@2biggies补充道。好吧,我误解了。关于你的更新,我已经编辑了我的回答:我不确定你所说的夹紧是什么意思,但它确实以某种方式做到了。假设你观察到该人使用尼古丁证据(属性(1,使用,尼古丁))。
,并且你在使用其他物质之前有一些弱点:
0.01::属性(X,使用,美沙酮)。`和
0.001::属性(X,使用,海洛因)。
查询使用美沙酮或海洛因的可能性会回答更大的数字(0.090和0.90,而不是0.01和0.001)ProbLog创建者同时对其Git()提供了类似的解释.为什么头部的概率是0.96,而不是0.8?因为有两种解释说明使用者使用尼古丁-因为他使用海洛因或因为他使用美沙酮。每一种解释都独立地试图使尼古丁的使用成为现实。你基本上是在扔两个有偏见的硬币-如果你至少有一个头部,这意味着他使用尼古丁。本教程从他们那里可能会有帮助:我明白你的意思。让我试着想出那个版本。
argument-in-prolog-using-a-series-of-facts
substance(methadone). 
substance(heroin).

0.8::property(X,use,nicotine) :- 
    uses_atleast_one_substance(X).

uses_atleast_one_substance(X):-
    property(X,use,Z),
    substance(Z).


person(1).
property(1, use, Y):- substance(Y).

query(property(1,use, nicotine)).
P::property(X,use,nicotine) :-  %gives  NonGroundProbabilisticClause error
    property(X,use,W), % This can unify with person(1,use,Z), leaving Z free
    substance(Z),      % This can unify with substance(Y), leaving Z free
    P is 0.8.