gpt4 book ai didi

prolog - Prolog 真的基于封闭世界假设吗?

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

closed-world assumption下,

what is not currently known to be true, is false

Prolog 的语义通常被称为遵循封闭世界假设,例如,here :

Prolog is based on closed world assumption (CWA) -- that is, if a proposition is not in the fact database and not derivable from the fact database, then it is not true.

但是,它的行为方式并不完全如此。在 CWA 下,我希望

?- a.
false.

但是,在 SWI-Prolog 中,我得到:

?- a.
ERROR: Undefined procedure: a/0 (DWIM could not correct goal)

这是为什么呢?说Prolog是基于CWA的有错吗?

最佳答案

在 Prolog 的上下文中谈论封闭世界假设 (CWA) 时,必须区分 unknown 谓词与(运行时)系统的谓词 已知 .在这两种情况下,谓词都有或没有子句。

默认情况下,调用 unknown 谓词会引发谓词存在错误。有一个标准标志,unknown (https://www.swi-prolog.org/pldoc/man?section=flags#flag:unknown),其默认值为 error,可以设置为 fail(或 警告)。这将为您提供您显然正在寻找的行为。尽管如此,我还是强烈建议您将标志设置为其默认值 error,因为它可以更轻松地检测编程错误(例如,谓词名称或 arity 中的拼写错误)。

是什么让运行时知道谓词?谓词指令或谓词子句。最熟悉的例子是 dynamic/1 指令。如果您的代码仅包含以下文本:

:- dynamic(foo/1).

那么,编译加载后,可以期待:

?- foo(_).
no.

但其他指令具有相同的效果(例如 multifile/1discontiguous/1,假设这是符合标准的 Prolog 实现!)。

因此,对于 known 谓词,Prolog 中 CWA 的解释很简单:我们无法证明为真的东西就是假的。 IE。 失败的否定,与逻辑否定相同。 Prolog 的名称来自逻辑编程,但 Prolog 也旨在成为一种实用且实用的编程语言。

Prolog 中缺少的东西(由例如 Logtalk 提供)能够声明一个谓词而不被迫将其声明为动态或多文件,或 ... 或要求为其提供条款(例如,参见此 example )。这提供了更简单和更清晰的 CWA 语义:调用没有子句的声明谓词失败(不需要弄乱有问题的 unknown 标志);调用未声明的谓词会引发谓词存在错误。

希望这会有所帮助。搜索 negation as failure 应该提供进一步的说明。

关于prolog - Prolog 真的基于封闭世界假设吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65014705/

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