如何用纯功能语言实现序言解释器?


25

对于使用纯功能语言实现Prolog解释器的方法,是否有使用伪代码的明确参考?到目前为止,我发现的内容似乎仅涉及命令式语言,仅仅是Prolog本身实现的演示,或者没有提供用于解释的具体算法。我会很感激的。


4
Patrice Boizumault的Prolog(计算机科学中的Princeton系列)的实现具有Lisp的实现。
Will Ness 2012年

请参阅此答案以获取相对较新的方法。
false

Answers:


24

由于Prolog = 语法统一 + 向后链接 + REPL

这三个部分都可以在人工智能中找到乔治·鲁格(George F. Luger)解决复杂问题的结构和策略。在本书的第四版中,所有这三个部分都在第15.8节“ LISP中的逻辑编程”中的LISP中实现。他还在其他书中加入了相同的代码,但在这里我并没有全部注意。他的书的代码可以在这里找到。

这三部分的另一个来源可以在人工智能编程范例中找到 Peter Norvig 在Common Lisp中案例研究。请参见第11章,逻辑编程和第12章,编译逻辑程序。他的书的代码可以在这里找到。

另一个来源是Hal Abelson,Jerry Sussman和Julie Sussman编写的计算机程序结构和解释。请参见第4.4节“逻辑编程”。这本书的站点在这里,这本书的代码在这里

如果知道从哪里看,找到在许多应用程序中实现了反向链接的统一算法并不罕见。它在函数编译器的类型推断中特别普遍。使用关键字统一或发生有助于发现功能。同样,大多数实现都使用unif作为统一函数的名称。

对于Prolog的版本,减去REPL,在OCaml中完成,请参见“实用逻辑和自动推理手册”的代码和资源 -prolog.ml

可以在此处找到书籍代码到F#的翻译。可以在此处找到本书代码到Haskell的翻译。

在查找代码方面,最容易找到统一算法,然后在应用程序中嵌入带有反向链接的实现。用REPL用功能语言找到Prolog的全功能实现是最困难的。在大多数情况下,代码的格式都不适合在PROLOG中直接使用;它是为增强性能而大量定制的,因此您可以找到代码,但挑剔所需的零件并不值得。我的建议是阅读Luger的书,并以您选择的语言重新构建,即使这意味着安装和学习LISP并进行翻译。

编辑

由于这是StackOverflow的重复问题,并且OP是新的,并且在注释中说:

为了提供更多的上下文,我尝试实现类型推断,但是我的语言的类型系统中的复杂功能(从属类型,提炼类型,线性键入等不那么常见的几种)使我觉得这会可以根据驱动Prolog的算法得出我的类型推断,从而获得非常通用的算法。我会注意到我完全是自学的,所以我的知识在很多领域都缺乏。

我将在此处对此进行扩展,但是意识到OP应该提出一个新问题。

有关一些介绍性内容,请参见实现类型推断

我所知道的最好的书是Benjamin C. Pierce的类型和编程语言。这本书的网站在这里。链接到OCaml代码的资源在这里。最近开始但几乎完整的翻译成F#在这里

相关类型:pg。462细化类型:第pg。207线性逻辑和类型系统:109


1
Guy Coder,您先生是一位绅士和学者!您的协助是最有用的,非常感谢您花时间回答这个问题。= d - Jimster的合作者和研究厌世的朋友
Shenzao

再次感谢您,我已经获得了这些书(之前,而不是快速访问书店)。
Jimster,2012年

@Jimster Norvig的代码很清晰,适合IIRC页面。尽管它是纯净的,但不要记住。
尼斯


有趣的是:unify_P3.py,它是作业2的
盖伊编码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.