帮助prolog的条款

时间:2010-09-23 17:45:01

标签: prolog logic-programming

emissionOf(alpha).
emissionOf(beta).

detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta).

我面临的问题是,对于某些(可能是显而易见的)原因,Prolog不接受上述代码的最后一行。原因与:

detected(proton), detected(electron)

如果我尝试

detected(proton)

行为正确。

有什么问题?我试图说明,如果同时存在α和β的发射,则存在质子和电子的检测。

由于

3 个答案:

答案 0 :(得分:5)

你是对的,PROLOG中的条款是Horn条款。此外,碰巧在一个条款的头部连接,例如:

detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta).

...(这不是Horn子句)实际上等同于以下两个单独的 Horn子句:

detected(proton) :- emissionOf(alpha), emissionOf(beta).
detected(electron) :- emissionOf(alpha), emissionOf(beta).

...因为身体目标的结合暗示了事实detected(proton)detected(electron)

请注意,可能还有其他几种等效的方法来编码您希望程序的含义,例如以下(作为示例):

emissionOf(alpha).
emissionOf(beta).

detected(X) :- 
  emissionOf(alpha), 
  emissionOf(beta), 
  (X = proton; X = electron).

执行目标detected(X)会将X绑定到原子proton,然后再追溯到electron

答案 1 :(得分:1)

相当于

,(detected(proton),detected(electron)) :- emissionOf(alpha), emissionOf(beta).

您实际上是在尝试重新定义,/2运算符,这是不允许的。您收到了什么错误消息?

你想说的是什么?如果detected(proton)detected(electron)为真,则emissionOf(alpha)emissionOf(beta)都为真?在这种情况下,您需要分成两个子句,如@sharky所说:

detected(proton) :- emissionOf(alpha), emissionOf(beta).
detected(electron) :- emissionOf(alpha), emissionOf(beta).

这将为您提供回溯的两种解决方案。我认为这比他的第二个建议更明确。

答案 2 :(得分:0)

从告诉我的内容来看,这是Prolog算法所固有的。每个州的句子必须是Horn clause