gpt4 book ai didi

prolog - 哪种存储事实的方式,apple vs exists(apple) 更符合习惯?

转载 作者:行者123 更新时间:2023-12-02 15:48:45 25 4
gpt4 key购买 nike

我正在尝试开发一个“最简单”的序言程序。

方法一

从概念上讲,该程序创建了一组存储在数据库中的事实,供以后查询。

% simple facts
apple.
banana.
orange.
cherry.

可以正常查询数据库

?- apple.
true

?- mango.
procedure `mango' does not exist

方法二

大多数教授 prolog 的教科书都会使用谓词来启动这样一个“最简单”的程序,例如:

% simple facts
exists(apple).
exists(banana).
exists(orange).
exists(cherry).

然后查询将在本质上改变为测试是否可以满足谓词,例如:

?- exists(apple).
true

?- exists(mango).
false

问题:

方法 1 是对 prolog 的错误使用吗?如果是这样,为什么

据我了解,prolog 正在测试查询是否可以显示为真,为此需要搜索数据库。 “procedure `mango' does not exist” 错误引起了我的怀疑。

最佳答案

我认为您关注的是“事实”和“谓词”之间的区别,这实际上并不存在; apple.apple(). 一个没有正文和参数的谓词。以下形状:

name(argument1, argument2) :-
n2(arg3),
n3(arg4).

表示“如果 n2 和 n3 对它们的参数成立,则名称对给定的参数成立”,即名称仅在特定条件下成立。去掉条件,你会得到:

name(argument1, argument2).

现在没有条件可以失败,所以它说“名称适用于给定的参数”。它始终成立,就像一个不变的事实,但“事实”在 Prolog 中并不是另一种东西,它仍然是一个可以调用的带有仿函数和元数的术语,只是要检查的代码主体有效 true 仅此而已。

去掉参数,你会得到:

name.

“名称保留”。它类似于 name()。,没有参数。

Prolog 的实现方式,这些与其他语言中的函数、过程、子例程很接近——它们并不相同,但 Prolog 会通过您的代码查找具有匹配名称(仿函数)和匹配参数数量(类似到其他语言中的方法重载解析),并使用给定的参数调用它并查看它是否成立。如果找不到匹配的名称和参数数量,您将收到“过程不存在”错误。

在典型的 Prolog 用法中,使用样式 name(argument1, argument2) 以便“name”试图描述参数之间的逻辑关系,而参数是相关的数据。例如length(List, Quantity)试图通过长度的关系来说明List与Quantity的关系。

使用方法 2,您可以将其扩展到:

exists(apple).
exists(crabapple).
exists(concrete).

food(apple).
food(crabapple).
food(snozzcumber).

edible(apple).
edible(snozzcumber).

然后询问所有存在的事物、所有食物、所有可食用的事物,或组合,例如虚构和可食用的食物、存在但不可食用的事物等。使用方法 1,您可以说 apple 成立,但您不能轻易将其用作数据,不能轻易查询所有存在的事物,不能轻易更改代码来描述苹果存在且可食用。使用方法 2,您可以询问 ?- exists(X). 并让 Prolog 填写 X 并告诉您 apple 存在。使用方法 1 无法轻松做到这一点。

如果你用一个名为“apple.txt”的空文本文件和一个名为“banana.txt”的空文本文件等来代替存储食物的名称(仿函数),而不是把它们在一个文件 exists.txt 中。这样做不是语法或逻辑错误,如果你有理由想那样做,那么你就可以,所以很难严格地说它是“不正确的”。也喜欢使用 SQL 数据库并制作一个表“apple”和一个表“banana”等等,而不是将它们放在一个表“fruit”中。就像有一个书架,上面有一本名为“苹果”的书和一本名为“香蕉”的书等等,而不是一本名为“世界水果”的书。您可以这样做,将一本书命名为“苹果”不正确,但这不是使用书籍来存储水果列表的好方法。

如果您特别想要 codegolf 的东西,而短小胜过所有其他问题,那么可以。但它违背了规律,违背了正常使用,它限制了你能做的,而且它不是 Prolog 的构建方式。也很难将字符较少的东西描述为“更简单”,如果它意味着一种奇怪的、有限的、非标准的做事方式。

关于prolog - 哪种存储事实的方式,apple vs exists(apple) 更符合习惯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73271819/

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