trismegiste / wam-prolog
Warren抽象机用于Prolog
Requires
- php: >=7.4
Requires (Dev)
- phpunit/phpunit: ^9.6
This package is not auto-updated.
Last update: 2024-09-20 10:14:33 UTC
README
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的帮助,跟踪错误就像小菜一碟。
也出现在
许可证
本作品提供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, _).
贡献者
- 领导:Trismegiste
特别感谢
- Igor Wiedler带来了将这个库与其symfony依赖解耦的想法