5

Prolog 的维基百科文章指出:

Prolog 中的高阶编程风格在 HiLog 和 λProlog 中首创。

HiLog的动机包括它实现高阶谓词的能力,例如maplist

maplist(F)([],[]).
maplist(F)([X|Xs],[Y|Ys]) <- F(X,Y), maplist(F)(Xs,Ys).

描述 HiLog 的论文假设 Prolog 只有call/1,没有call/3

但是,由于 Prolog(现在)有call/3,maplist可以很容易地在其中实现:

maplist(_, [], []).
maplist(P, [X|Xs], [Y|Ys]) :- call(P, X, Y), maplist(P, Xs, Ys).

HiLog 是否主要具有历史意义,还是它的“高阶”逻辑比现在 Prolog 中可用的逻辑更普遍?

4

3 回答 3

4

来自维基

虽然 HiLog 在语法上严格扩展了一阶逻辑,但 HiLog 可以嵌入到这个逻辑中。

任何 HiLog 术语都可以翻译成 Prolog 术语(HiLog:高阶逻辑编程的基础 - Weidong Chen,Michael Kifer,David S.Warren - 1993)。所以在某种意义上是的,它并不比 Prolog 更通用。

让我从论文中引用一些结论

首先,在 HiLog 中编程使更多的逻辑程序具有逻辑性。我们都告诫 Prolog 程序员要使他们的程序尽可能纯洁,并避免 Prolog 非逻辑结构的弊端。在 Prolog 中,谓词和函数符号的混合,特别是在谓词 call/1 中,是非逻辑的,而在 HiLog 中,它是完全合乎逻辑的并且是一等公民。因此在 HiLog 中,程序员不必避免使用 call/l,从而在编写纯逻辑程序的任务中具有更大的灵活性。

其次,尽管有人可能会说 HiLog 只是 Prolog 的一种语法变体,但在进行元编程时,语法很重要。由于在元编程中,语法决定了要操作的数据结构,更简单的语法意味着元程序可以更简单。

于 2020-11-14T07:34:36.460 回答
3

有点模糊:

HiLog 不在 Prolog 中(Prolog 仍然是 Prolog),但在Flora中使用,它基本上是一个基于逻辑的面向对象的数据库。它有自己的语法并在XSB Prolog上运行。

如果我理解正确,HiLog 的想法是通过在谓词名称位置允许变量来为“高阶”谓词定义实用的语法。maplist这是两个示例之间的区别。

这看起来好像这是二阶逻辑(它变得不可计算/难以处理,因为通常无法确定谓词F是否与谓词相关,G因为您可能被迫比较它们的范围,它们所在的所有点成功),但通过限制句法相等(如果名称相同的谓词,则相同F)被展平为一阶(可计算),此时可以部署以生成 Prolog 代码。Gfoo/2call/N

所以,是的,目前你必须跳过箍来表达 Prolog 中的语句,这些语句可能是 HiLog 中的单行语句(虽然我没有例子,但对此没有太深入的了解)。这是 C 和 ... 呃 ... Prolog 之间的区别!

类似于将 Prolog 扩展/修改为各种 X-log 的许多其他想法,但并非所有这些想法都已实现(我曾经尝试在这里制作一个概览图像),“HiLog 语法”(或类似的东西)可能可以在突破其利基的未来专业 X-log 中找到。

于 2020-11-14T07:25:20.427 回答
1

由于我在评论中回答了我自己的问题,所以我会在这里发布:

有些事情你可以在 HiLog 中完成,而在 Prolog 中无法完成call,例如:

像这样的查询:

?- X(dog, 55, Y).

断言如:

foo(X, Y) :- Z(X), Z(Y(X)).

正如前面提到的 HiLog 论文和 HiLog 维基百科页面中所述,Prolog 可以模拟 HiLog。但是,这需要将整个程序和所有查询转换为单个谓词。

于 2020-11-14T17:45:08.670 回答