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中现在可用的更通用?
来自wiki
尽管HiLog在语法上严格扩展了一阶逻辑,但HiLog可以嵌入到该逻辑中。
任何HiLog术语都可以翻译成Prolog术语(HiLog:高阶逻辑编程的基础-陈伟东,迈克尔·基弗,大卫·S·沃伦-1993(。因此,从某种意义上说,是的,它并不比Prolog更通用。
让我引用论文中的一些结论
首先,在HiLog中编程使更多的逻辑程序具有逻辑性。我们都告诫Prolog程序员要让他们的程序尽可能纯粹,并避免Prolog的非逻辑结构带来的危害。在Prolog中,谓词和函数符号的混合,特别是在谓词call/1中,是非逻辑的,而在HiLog中,它是完全逻辑的,是一等公民。所以在HiLog中,程序员无需避免使用call/l,因此在其编写纯逻辑程序的任务。
其次,尽管有人可能会说HiLog只是Prolog的语法变体,但在进行元编程时,语法很重要。由于在元编程中,语法决定了要操作的数据结构,因此更简单的语法意味着元程序可以更简单。
有点模糊:
HiLog不在Prolog中(Prolog保持Prolog(,但在Flora中使用,Flora基本上是一个基于逻辑的面向对象数据库。它有自己的语法,并在XSB Prolog上运行。
如果我理解正确的话,HiLog的想法是为";高阶";谓词,通过允许变量位于谓词名称位置。这就是两个maplist
示例之间的区别。
这看起来就像是2阶逻辑(由于无法确定谓词F
是否与谓词G
相关,因此变得不可计算/不可跟踪,因为你可能被迫比较它们的范围,以及它们成功的所有点(,但由于句法相等的限制,它被平坦化为1阶(可计算((如果名称相同的谓词foo/2
,则F
和G
相同(此时可以部署call/N
来生成Prolog代码。
所以,是的,目前你必须跳过重重关卡才能在Prolog中表达可能是HiLog中的一句话的语句(不过我没有例子,对此我没有太深入的了解(。这是C和…之间的区别。。。嗯Prolog!
类似于将Prolog扩展/修改为各种X日志的许多其他想法,并不是所有这些都实现了(我曾经试图在这里制作一个概览图像(;HiLog语法";(或类似的东西(可能会在未来突破其利基市场的专门X日志中找到。
由于我在评论中回答了自己的问题,我将把它发布在这里:
你可以在HiLog中做一些事情,而在Prolog中使用call
是做不到的,例如:
查询如:
?- X(dog, 55, Y).
断言如:
foo(X, Y) :- Z(X), Z(Y(X)).
正如前面提到的HiLog论文和HiLog维基百科页面所述,Prolog可以模仿HiLog。但是,这需要将整个程序和所有查询转换为单个谓词。