gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:11:51 26 4
gpt4 key购买 nike

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

sunny.

当我运行以下查询时:
sunny.

我得到:
yes

正如我所料。当我运行此查询时:
X.

我得到:
uncaught exception: error(instantiation_error,top_level/0)

当我期望得到:
X = sunny

有谁知道为什么?

最佳答案

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

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


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

仍然允许 Prolog 尝试定义 member谓词(实际上这两个定义是等价的)但是
?- X, X=member(A,[1,2,3]).

会抛出异常,因为当时 X应该是派生的,我们不知道它应该成为谓词 member(A,[1,2,3]) .

不过,您的情况要简单得多:您可以包装 sunny作为谓词中的术语,以便 Prolog 知道要尝试哪些规则。事实
weather(sunny).
weather(rainy).

定义谓词 weather这样现在我们的查询中只有一个一阶变量作为参数:
?- weather(X).
X = sunny ;
X = rainy.

现在我们正在谈论术语级别,一切都按您的预期工作。

(*) 虽然在两种情况下找出公式是否有效的问题都是不可判定的,但在一阶逻辑中,至少可以最终推导出所有正确的公式,但如果公式为假,搜索可能不会终止(即一阶逻辑是半可判定的)。对于二阶逻辑,有些公式既不能证明也不能证伪。更糟糕的是,我们甚至无法判断二阶公式是否属于这一类。

关于Prolog 单变量查询返回错误。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52582809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com