trismegiste/wam-prolog

Warren抽象机用于Prolog

2.0.2 2024-05-31 08:38 UTC

This package is not auto-updated.

Last update: 2024-09-20 10:14:33 UTC


README

Build Status

Warren的抽象机

原始Java版本由Stefan Büttcher编写。
PHP移植和PhpUnit测试由Florent Genette完成。

版本1.4

是什么?

Warren抽象机(WAM)是一个虚拟机(类似于Java的JVM),用于Prolog。这个库旨在在PHP 5.4上运行。Prolog是一种逻辑语言,它通过推理引擎解决问题。

David Warren在"WAM - 教程重建"中写道

WAM是一种由内存架构和针对Prolog优化的指令集组成的抽象机。它可以在广泛的硬件上高效实现,并作为可移植Prolog编译器的目标。它现在已成为实现Prolog的标准基础。

维基百科说

Prolog的根源在于一阶逻辑,一种形式逻辑。与许多其他编程语言不同,Prolog是声明性的:程序逻辑用关系来表示,关系用事实和规则表示。计算是通过在这些关系上运行查询来启动的。

正如你所见,Prolog几乎没有任何指令、循环、条件语句或goto。你所要做的就是宣布绝对真理。这时,Spock先生说:“非常有趣。”

停止闲聊,我推荐你查看维基百科和doc目录中优秀的Hassan Aït-Kaci著作。

它有用吗?

就像任何其他领域特定语言一样,Prolog的适用范围非常有限,但有时它可以简化某些问题,比如

  • 你需要一个规则引擎
  • 你想避免使用繁琐的if-else-switch语句来实现一些商业智能
  • 你需要大量每周都变化的职责链
  • 你面对一个具有非确定路径的逻辑问题

我可以提供示例吗?

查看文件basket.pro:它是一组基于购物车内容的礼品和折扣营销规则。为了功能测试,我还添加了许多程序,如列表操作(见'append',非常有趣)、家谱、八皇后问题和汉诺塔问题。

为什么要把一个四十年前的语言移植到PHP中?

(从Java的十年前版本?)

首先,这是一个口味问题。即使有三百年的历史,JS Bach仍然是宇宙中最好的音乐家。其次,我并不是说Prolog可以解决任何问题,不。我认为有一种语言可以用来解决特定的编程问题。正如你所知:“一种语言是不够的”。参见http://memeagora.blogspot.fr/2006/12/polyglot-programming.html

我也认为,就像任何其他语言一样,作为程序员,我们有责任保持这种知识的活力,而今天,最好的方式就是将这个WAM移植到PHP。这不是怀旧,这只是对计算机编程先驱如冯·诺伊曼或图灵的回忆。

关于这次移植的一些注意事项

由于PHP的“软打字”和那个该死的“===”,我遇到了很多麻烦,即使如此,我仍然更喜欢Java和强类型,但在PHP中处理字符串和数组真是很棒。由于设计时没有考虑到PHP,所以可能还有很多优化要做。好处是我对PHP内部机制的了解有所提高。

关于性能的一些笔记

是的,与SWI-Prolog相比,这个WAM很慢。如果你需要大量的递归或大量数据集,我认为这个软件不适合你。

正如我写的,这是针对那些命令式编程范式无关紧要的特定问题。这不仅仅是一个范式:想想声明式编程!如果你喜欢它并想更进一步,看看Clojure语言。

运行测试

要运行所有测试。我已经将测试套件分为两组,以提取长测试。

phpunit

我想分叉,可以吗?

当然可以!但别忘了测试新功能或更改!

今天,这个库有XXX个断言,这花了我很多时间,但在重构这个库使其成为现代PHP库之前,这是必需的。

还有很多工作要做:一个CLI编译器,更好的(抽象)文件系统,更新名为'retract'的元逻辑条款,添加像'bagof'和'findall'这样的功能,但别忘了测试和文档,因为如果没有经过测试和注释,我将永远不会合并带有新功能的PR。

我发现了一个错误,我能做什么?

  • 使用GitHub分叉它!
  • 在IFoundABugTest类中编写一个新的测试来显示错误
  • 为有错误的测试创建一个Pull Request
  • 我合并了新的测试
  • 有人(你、我、任何人)修复了它,并为修复创建了Pull Request
  • 最终,我将重构IFoundABugTest类,将测试移动到正确的位置

我喜欢TDD进行调试。有时它很烦人,但总是为了最好的,特别是在网络上。有了TravisCI的帮助,跟踪错误就像小菜一碟。

也出现在

  • Symfony2库的额外GUI功能: WamBundle
  • 一个用于将平假名转换为片假名的CLI工具,用于日文名字: Hiragana

许可证

cc-by-sa

本作品提供Creative Commons Attribution Share Alike 3.0许可证。这意味着你必须保留我的名字,并且必须以本许可证提供任何衍生作品。只要遵循这些规则,你可以用这个赚钱。换句话说

licence(wam_bundle, cc_by_sa_3).
derivate_work_from(your_work, wam_bundle).
licence(X, L) :- derivate_work_from(X, Y), licence(Y, L).
price(wam_bundle, 0).
price(your_work, _).

贡献者

特别感谢

  • Igor Wiedler带来了将这个库与其symfony依赖解耦的想法