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



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

表示这种关系的一种方式是简单的线性方程Yi=A+bXi,它将描述N种情况的样本中的关系,其中i=1,2。。。,这里a和b是常数,而Y和X是变量。

你对如何在Prolog中体现这一点有什么建议吗?我的预感有点像CCD_ 1。然而,这里似乎缺少的是一个代码,它指出X的第i个值和Y的第i值(汽车的行驶距离和汽车的油耗)之间的关联。

有什么想法吗?提前感谢!

/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"来绕过这一点。所以,在你的具体例子中,你可以建立一个世界,这样

  • 油耗只能发生在"旅行"事件或构成非旅行事件且相互排斥的其他假设中,例如"虹吸">
  • 行进"事件"和虹吸"事件"都会导致物理测量,例如行进距离。(在我们琐碎的例子中,对于虹吸事件,它可能只是零)
  • 在您的数据集中,您有关于发生了什么事件(例如旅行或虹吸)的信息关于该事件的油耗和旅行距离的信息

然后,您可以通过显示以下信息来确定"旅行"作为一个事件"导致"相对于旅行距离的线性模型形式的燃料消耗:

  • 每当你有"旅行"活动时,根据线性模型,旅行的距离确实与油耗相对应
  • 根据该模型,无论何时发生"虹吸"事件,行驶的距离都不一定与油耗相对应

更新以解决评论:问题不是推断因果关系,而是在假设因果关系已经在实践中确立的情况下如何表示因果关系。在这种情况下,以上几点仍然适用,因为你需要更清楚地定义你所指的因果关系类型,然后才能表示它

例如,如果我们谈论的是严格按时间顺序发生的事件,按时间顺序的因果关系可能看起来像这样(在类似序言的伪代码中):

%%%%%%%%%%%%%%%%%%
%%% facts database
%%%%%%%%%%%%%%%%%%
% eventtype/1: defines type of event
eventtype('travel')
eventtype('fuel_measurement') % ... etc
% eventtime/2: defines timepoints by index and a record of actual time
eventtime(1, "12:02am")
eventtime(2, "12:03am") % ... etc
% event/3: ['event type', 'time', 'related measurement']
event( [eventtype('travel'),           eventtime(1, _), 50km] )
event( [eventtype('fuel-measurement'), eventtime(2, _), 5L  ] ) % ... etc
%%%%%%%%%%%%%
%%% relations
%%%%%%%%%%%%%
immediately_precedes( event(X), event(Y) ) :- 
get_eventtime_index(X, Xind),
get_eventtime_index(Y, Yind),
plus_one(Xind, Yind).   % assumes all above helper predicates are suitably defined elsewhere
is_linearly_related( event(X), event(Y) ) :- 
get_measurement(X, Xmeas), 
get_measurement(Y, Ymeas), 
Model is a + b * Xmeas, 
Ymeas = Model.
iscausal( eventtype(Xtype), eventtype(Ytype) ) :-   % expressed as pseudocode
forall: 
[event(X), event(Y)], 
X = [Xtype, Xtime, Xmeas], 
Y = [Ytype, Ytime, Ymeas], 
immediately_precedes( event(X), event(Y) )
it applies that:
is_linearly_related( event(X), event(Y) )

根据您的建议,我认为这段代码回答了我最初的问题。谢谢

:-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))).

产生N = distance,V = -1

最新更新