Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
帮助学习prolog';s条款_Prolog_Logic Programming - Fatal编程技术网

帮助学习prolog';s条款

帮助学习prolog';s条款,prolog,logic-programming,Prolog,Logic Programming,我面临的问题是,出于某种(可能是显而易见的)原因,Prolog不接受上述代码的最后一行。原因与: emissionOf(alpha). emissionOf(beta). detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta). 如果我试着 detected(proton), detected(electron) 它的行为是正确的 有什么问题?我想说的是,如果既有α和β的发射,那么就有质子和电子

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

emissionOf(alpha).
emissionOf(beta).

detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta).
如果我试着

detected(proton), detected(electron)
它的行为是正确的

有什么问题?我想说的是,如果既有α和β的发射,那么就有质子和电子的探测


感谢大家告诉我的,这是Prolog算法的固有特性。每个陈述的句子都必须是一个。

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

你是正确的,序言中的从句是Horn从句。此外,条款开头的连词,如:

detected(proton)
…(不是Horn条款)实际上相当于以下两个单独的Horn条款:

detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta).
…因为身体目标的结合暗示了检测到的事实(质子)和检测到的事实(电子)

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


执行目标
检测(X)
X
绑定到atom
proton
,然后在回溯时绑定到
electron

您是正确的,序言中的子句是Horn子句。此外,条款开头的连词,如:

detected(proton)
…(不是Horn条款)实际上相当于以下两个单独的Horn条款:

detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta).
…因为身体目标的结合暗示了检测到的事实(质子)和检测到的事实(电子)

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

执行目标
检测到(X)
X
绑定到原子
质子
,然后在回溯时绑定到电子

它相当于

emissionOf(alpha).
emissionOf(beta).

detected(X) :- 
  emissionOf(alpha), 
  emissionOf(beta), 
  (X = proton; X = electron).
实际上,您正在尝试重新定义
,/2
运算符,这是不允许的。您收到了什么错误消息

你想说什么?如果
emissionOf(alpha)
emissionOf(beta)
为真,则
检测到的(质子)
检测到的(电子)
均为真?在这种情况下,你需要分成两个条款,如@sharky所说:

,(detected(proton),detected(electron)) :- emissionOf(alpha), emissionOf(beta).
这将为您提供两种回溯解决方案。我认为这肯定比他的第二个建议更清楚。

相当于

emissionOf(alpha).
emissionOf(beta).

detected(X) :- 
  emissionOf(alpha), 
  emissionOf(beta), 
  (X = proton; X = electron).
实际上,您正在尝试重新定义
,/2
运算符,这是不允许的。您收到了什么错误消息

你想说什么?如果
emissionOf(alpha)
emissionOf(beta)
为真,则
检测到的(质子)
检测到的(电子)
均为真?在这种情况下,你需要分成两个条款,如@sharky所说:

,(detected(proton),detected(electron)) :- emissionOf(alpha), emissionOf(beta).
这将为您提供两种回溯解决方案。我认为这肯定比他的第二个建议更清楚