【问题标题】:How can I fix this circular predicate in Prolog?如何在 Prolog 中修复这个循环谓词?
【发布时间】:2009-10-12 22:52:04
【问题描述】:

为什么不能在 Prolog 中定义“已婚”?

married(X,Y):-married(Y,X).

不允许使用这些循环谓词吗?我该如何解决?

谢谢

【问题讨论】:

    标签: prolog


    【解决方案1】:

    如果语法有误,请见谅,我已经有一段时间没有玩 Prolog 了。


    一个典型的解决方案是在子句中引入另一个层次,像这样:

    married(X, Y) :- wife(X, Y).
    married(X, Y) :- wife(Y, X).
    

    然后使用wife子句指定关系:

    wife(jane, bob).
    wife(alice, john).
    
    ?- married(jane, X).
    X = bob
    

    更多信息可以在这里找到:CSc 8710, Deductive Databases and Logic Programming, chapter 6 - Logic and databases,在 6.5 - 特殊关系下。

    【讨论】:

      【解决方案2】:

      据我了解,基本问题是,如果允许循环定义,尽管生成的语言是自洽的,但可能会产生微妙的后果,这往往是违反直觉的。还有效率方面的考虑(循环定义会产生额外的开销)。

      请参阅此detailed discussion 以获得更多解释和相当多的不同观点。

      【讨论】:

        【解决方案3】:

        一种可能的解决方案是使用表格,例如this answer.

        【讨论】:

          猜你喜欢
          • 2012-04-02
          • 2020-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多