0
emissionOf(alpha).
emissionOf(beta).

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

我面临的问题是由于某些(可能很明显)原因,Prolog 不接受上述代码的最后一行。原因与以下有关:

detected(proton), detected(electron)

如果我尝试

detected(proton)

它行为正确。

问题是什么?我试图说明,如果同时发射 alpha 和 beta,那么就会同时检测到质子和电子。

谢谢

4

3 回答 3

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到 atom proton,然后绑定到electron回溯。

于 2010-09-24T23:41:07.687 回答
1

相当于

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

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

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

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

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

于 2010-09-25T00:08:49.253 回答
0

据我所知,这是 Prolog 算法所固有的。每个陈述句必须是一个Horn 子句

于 2010-09-24T15:00:20.190 回答