代码之家  ›  专栏  ›  技术社区  ›  devoured elysium

prolog子句的帮助

  •  0
  • devoured elysium  · 技术社区  · 14 年前
    emissionOf(alpha).
    emissionOf(beta).
    
    detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta).
    

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

    detected(proton), detected(electron)
    

    如果我试着

    detected(proton)
    

    它的行为是正确的。

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

    谢谢

    3 回复  |  直到 14 年前
        1
  •  5
  •   user206428 user206428    14 年前

    你说得对,PROLOG中的子句是Horn子句。此外,一个从句开头的连词如:

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

    分离 号角条款:

    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 回溯。

        2
  •  1
  •   rvirding    14 年前

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

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

    你想说什么?两者都是 detected(proton) detected(electron) 如果 emissionOf(alpha) emissionOf(beta)

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

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

        3
  •  0
  •   devoured elysium    14 年前

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