代码之家  ›  专栏  ›  技术社区  ›  Eric Zinda

Prolog单变量查询返回错误。为什么?

  •  4
  • Eric Zinda  · 技术社区  · 7 年前

    我创建了一个简单的Prolog程序(使用GNU Prolog v1.4.4),其中有一个事实:

    sunny.
    

    当我运行以下查询时:

    阳光明媚。
    

    yes
    

    如我所料。运行此查询时:

    X.
    

    uncaught exception: error(instantiation_error,top_level/0)
    

    当我期望得到:

    X = sunny
    

    1 回复  |  直到 7 年前
        1
  •  6
  •   lambda.xy.x    7 年前

    Prolog是基于一阶逻辑的,但是 X 是一个二阶逻辑查询(变量代表一个规则头/事实,而不仅仅是一个术语):询问“哪些谓词可以派生?”或者换句话说“哪些公式是真的?”。二阶逻辑的表现力如此之强,以至于我们失去了一阶逻辑的许多优良性质(*)。这就是为什么二阶变量必须被充分实例化,以便在调用时知道要尝试哪个规则(这就是错误消息的含义)。例如查询

    ?- X=member(A,[1,2,3]), X.
    

    ?- member(A,[1,2,3]).
    

    仍然允许Prolog尝试定义 member

    ?- X, X=member(A,[1,2,3]).
    

    将引发异常,因为当时 应该是派生的,我们不知道它应该成为谓词 member(A,[1,2,3])

    不过,你的情况要简单得多:你可以包装 sunny 作为一个术语插入一个谓词,这样Prolog就知道应该尝试哪些规则。事实

    weather(sunny).
    weather(rainy).
    

    weather 因此,现在我们的查询中只有一个一阶变量作为参数:

    ?- weather(X).
    X = sunny ;
    X = rainy.
    

    现在我们讨论的是术语级别,一切都如您所期望的那样工作。

    推荐文章