loophp / church-encoding
PHP中的Church编码
Requires
- php: >= 7.4
- loophp/combinator: ^2.0
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-21 12:53:57 UTC
README
Church编码
在数学中,Church编码是Lambda演算中表示数据和运算符的一种方法。Church数是使用Lambda表示法表示自然数的一种表示法。这种方法是以Alonzo Church的名字命名的,他是第一个以这种方式在Lambda演算中编码数据的人。
Church编码不是作为原始数据类型的实际实现。它的用途是为了说明不需要其他原始数据类型来表示任何计算。完整性是表示性的...更多关于维基百科。
历史
这个库是为了个人教育目的而制作的,并公开发布,它受到了Marcelo Camargo的工作的启发。代码可以通过Composer(通过Packagist)获得,以防万一,但我怀疑这除了学习目的之外对任何人都没有用。
使用方法
composer require loophp/church-encoding
文档
Church数
假设我们有一种不支持数字或布尔值的编程语言:一个Lambda是它提供的唯一值。一个有趣的问题是,我们是否可以创建一个系统,使我们能够计数、加法、乘法和做所有其他与数字相关的事情。
Church数使用Lambda来创建数字的表示。
这个想法与自然数的函数表示密切相关,即有一个自然数代表零
和一个函数succ
,它返回给定自然数的后继。选择零
和succ
是任意的,重要的是有一个零
并且有一个可以提供后继的函数。Church数是这个的扩展。
所有Church数都是具有两个参数的函数:λf . λx . something
第一个参数f
是应使用的后继函数。第二个参数x
是代表零的值。
因此,零的Church数为:C0=λf . λx . x
每次应用它时,它都返回代表零的值。一的后继Church数为:C1=λf . λx . f x
。
后续的Church数只是额外应用了后继函数
需要注意的是,在这个最小的Lambda演算中,我们实际上并不能用这些Church数做很多。我们可以计数、加法和乘法,但要理解结果,我们必须计算后继函数的应用次数。
Church布尔值
我们可以对布尔值提出与数字相同的问题。我们可以只使用函数来表示它们吗?是的,我们可以,并且与Church数非常相似。一个Church布尔值是一个具有两个参数的函数,第一个表示如果函数是true
,它应该返回什么,第二个表示如果函数是false
,它应该返回什么
true = λx . λy . x
false = λx . λy . y
就像Church数字一样,我们也可以对Church布尔值进行算术运算。
定义and
、or
和not
的函数很容易。
and
=λM . λN . M (N true false) false
or
=λM . λN . M true (N true false)
not
=λM . M false true
参考资料
- 《类型与编程语言》(TAPL)
- 《计算机程序的结构与解释》(SICP)
- 罗伯特“Corky”卡特赖特讲座(Robert ”Corky” Cartwright)
- 加布里埃尔·勒贝克:第
1
部分Part 1 和第2
部分Part 2 - 包loophp/combinator
- 维基百科上的Lambda演算
- 维基百科上的Church编码
代码质量、测试和基准测试
每次向库中引入更改时,Github都会运行测试。
该库使用PHPSpec编写了测试。您可以在spec
目录中查看它们。运行composer phpspec
以触发测试。
在每次提交之前,使用GrumPHP执行一些检查,手动运行composer grumphp
以进行检查。
使用Infection(一个PHP突变测试框架)测试测试的质量,运行composer infection
以尝试它。
静态分析器也在控制代码。已启用PHPStan和PSalm的最大级别。
贡献
请随意通过发送Github pull请求来贡献。我反应很快 :-)
如果您不能为代码做出贡献,您也可以在Github或Paypal上赞助我。
变更日志
请参阅CHANGELOG.md,其中基于git提交的变更日志。
有关更详细的变更日志,请参阅发布变更日志。