如何在Prolog中编码因果关系(作为线性函数)

如何在Prolog中编码因果关系(作为线性函数),prolog,ontology,Prolog,Ontology,假设两个变量X和Y是因果和线性相关的,因此X的增加会导致Y的增加(例如汽车的行驶距离及其燃油消耗)。X和Y都是N个观测值的向量(本例中为N辆单独的汽车) 表示这种关系的一种方法是一个简单的线性方程Yi=A+bXi,它将在N个例子中描述这种关系,其中i=1,2,…,N。这里A和b是常数,而Y和X是变量 您对如何在Prolog中表示这一点有什么建议吗?我的直觉是 原因(原因(行驶距离)、影响(燃油消耗量)、a(0.5)、b(1.23))。。然而,这里似乎缺少的是一个代码,该代码表明,该关联特别是在第

假设两个变量X和Y是因果和线性相关的,因此X的增加会导致Y的增加(例如汽车的行驶距离及其燃油消耗)。X和Y都是N个观测值的向量(本例中为N辆单独的汽车)

表示这种关系的一种方法是一个简单的线性方程Yi=A+bXi,它将在N个例子中描述这种关系,其中i=1,2,…,N。这里A和b是常数,而Y和X是变量

您对如何在Prolog中表示这一点有什么建议吗?我的直觉是
原因(原因(行驶距离)、影响(燃油消耗量)、a(0.5)、b(1.23))。
。然而,这里似乎缺少的是一个代码,该代码表明,该关联特别是在第i个值X和第i个值Y(汽车的行驶距离和该汽车的燃油消耗量)之间

有什么想法吗?提前谢谢


/JC

请原谅我在回答这个问题,只是为了使用比评论更合适的格式,尽管这可能不是您目前正在寻找的答案

除非我误解了你的问题,否则我认为你在这里描述的问题是一个定义不清/描述不清的问题。我对它的理解是,你有一个X和Y的数据集,它们恰好遵循一个线性关系,你想在没有任何其他信息的情况下“推断”X导致Y,或者只是想通过谓词来描述这种情况。问题是,相关数据集本身永远无法提供这些信息

如果你想从数据集中建立因果关系,你需要描述你想要的是什么类型的因果关系,以及如何首先进行断言和调查。如果您不知道事件的顺序,或者不知道备选方案的行为,那么数据集永远无法告诉您任何因果关系

我确信有很多因果关系模型,我只见过两个在实践中被有意义地使用的模型:按时间顺序排列的模型和反事实模型

在时间顺序模型中,如果您能够确定事件发生的“时间”,那么您可以通过非常简单的“X在Y之前”规则推断因果关系。例如,如果“X=行程”被视为发生在“Y=燃油测量”之前,则您可以使用谓词逻辑建立因果关系,通过显示:

  • 当行程先于燃油测量时,关系必然是线性的
  • 当燃油测量先于行驶时,关系不一定是线性的。(因为如果是的话,那么你就回到了只能建立相关性而不是因果关系的状态)
  • 封闭世界现象适用(即,在没有旅行的情况下,没有任何其他因素会导致燃油消耗)
反事实模型中,您没有任何关于事件年代的信息,但您拥有的是关于替代事件的信息。因此,“X导致Y”的因果关系是由它的反事实建立的,也就是说,如果你能证明“如果X没有发生,Y也不会发生”(或者相当于X意味着Y)

反事实模型中的一个复杂因素是,它考虑了“责任”的概念,即如果X和X都可以导致Y,那么它们都被认为是Y的潜在原因。然而,在数据集的上下文中,您可能可以通过以下方式绕过这一点:“如果对于所有事件X,结果是Y,而对于所有事件X,结果不一定是Y,那么我们可以推断X导致Y”。因此,在你的具体例子中,你可以建立这样一个世界:

  • 燃油消耗只能发生在“行驶”事件或构成非行驶事件且是互斥事件的替代假设中,例如,“虹吸”
  • 旅行“事件”和虹吸“事件”都会导致物理测量,例如旅行距离(在我们的小例子中,虹吸事件的距离可能为零)
  • 在您的数据集中,您有关于发生了什么事件(如行驶或虹吸)的信息,以及关于该实例的燃油消耗和行驶距离的信息
然后,您可以通过显示以下内容,确定“行驶”作为一个事件“导致”与行驶距离相关的线性模型油耗:

  • 无论何时发生“旅行”事件,根据线性模型,行驶的距离确实与燃油消耗量相对应
  • 无论何时发生“虹吸”事件,根据该模型,行驶的距离“不一定”对应于燃油消耗量

更新以回应评论:问题不是推断因果关系,而是如何在假设因果关系已经在实践中建立的情况下表示因果关系。在这种情况下,上述几点仍然适用,因为在表示因果关系之前,您需要更清楚地定义您所指的因果关系类型

例如,如果我们讨论的事件是按严格的时间顺序发生的,那么按时间顺序的因果关系可能如下所示(在类似prolog的伪代码中):

%
%%%事实数据库
%%%%%%%%%%%%%%%%%%
%eventtype/1:定义事件的类型
事件类型(“旅行”)
事件类型(‘燃油测量’)%…等
%eventtime/2:通过索引和实际时间记录定义时间点
事件时间(凌晨1点,“12:02”)
事件时间(凌晨2点,“12:03”)%…等
%事件/3:[“事件类型”、“时间”、“相关度量”]
事件([eventtype('travel'),事件时间(1,u1;),50公里])
事件([eventtype('fuel-measurement')、事件时间(2,u5;)、5L])%等
%%%%%%%%%%%%%
%%%关系
%%%%%%%%%%%%%
紧接着(事件(X),事件(Y)):
获取事件时间索引(X,Xind),
获取事件时间索引(Y,Yind),
:-use_module(library(clpfd)).

causes(
          var(
              name(distance),
              value(Distance)
          ),
          var(
              name(fuelConsumption),
              value(FuelConsumption)
          )
)
:-
FuelConsumption #= 5 + 2 * Distance.
?-causes(var(name(N), value(V)), var(name(fuelConsumption), value(3))).