emissionOf(alpha).
emissionOf(beta).
detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta).
我面临的问题是,对于某些(可能是显而易见的)原因,Prolog不接受上述代码的最后一行。原因与:
detected(proton), detected(electron)
如果我尝试
detected(proton)
行为正确。
有什么问题?我试图说明,如果同时存在α和β的发射,则存在质子和电子的检测。
由于
答案 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。