在形式语言理论和计算机科学中,Iota(ι,发音如希腊字母 iota)和Jot(י,发音如希伯来字母 yodh)是两种极简的形式系统与编程语言。
这两个名称分别取自希腊语字母Ι(iota)和希伯来语字母Yodh(י/yodh)——分别是各自字母表中最小、最简单的字母,这一命名恰如其分地体现了这些语言的极简主义设计哲学。
它们的设计目标是比λ演算以及SKI组合子演算等更为人熟知的图灵完备系统更加简洁、更加基础。
因此,它们也被归类为图灵焦油坑(Turing tarpit)——即那些「在设计上尽可能小却仍然保持图灵完备性」的深奥的编程语言。
这两个系统仅使用两个基本符号,涉及两种基本操作。均由语言学教授于 2001 年设计创造。
历史与设计动机
克里斯·巴克设计这些语言的初衷是探索组合子逻辑中最简可能的完备基础。在组合子逻辑中,SKI组合子演算已经证明了仅需 S、K 和 I 三个组合子即可表达所有λ表达式。
巴克进一步追问:是否存在比 S 和 K 更加基础、更加简洁的表达方式?
这一追问引导他创造了 Iota——一种仅用单一基本组合子(通用 iota 组合子,标记为 ι)就能推导出 S、K、I 三个基本组合子的形式系统。
Jot 则在此基础上进一步简化表达方式,将程序表示为二进制串(即 0 和 1 的任意序列),从而为算法信息论中的哥德尔编号提供了一种自然的编码方案。
理论基础
SKI 组合子演算的完备性
在组合子逻辑中,SKI组合子演算是一个经典的结果:任何 λ演算表达式都可以转化为仅使用以下三个组合子的形式:
- S = \lambda x.\lambda y.\lambda z. (x z) (y z)
- K = \lambda x.\lambda y. x
- I = \lambda x. x
这意味着 S、K、I 构成了一个完备集——它们足以表达所有可计算的函数。
通用 Iota 组合子
巴克的创新在于证明了仅需一个基本组合子即可推导出 S、K、I。他将这个通用组合子记为 ι(iota),其定义为:
展开 λ 表达式,这一定义等价于:
从 ι 推导 SKI
基于上述定义,可以推导出标准的 SKI 组合子:
{{NumBlk|:|\begin{aligned}
I &= (\iota\;\iota) \\
K &= \big(\iota\;(\iota\;(\iota\;\iota))\big) \\
S &= \big(\iota\;(\iota\;(\iota\;(\iota\;\iota)))\big)
\end{aligned}|}}
这表明 ι 本身就是一个完备集——仅凭这一个组合子就能表达所有可计算函数。
Iota 语言
Iota 是一种 LL(1) 形式语言,其语法使用前缀表示法来描述由通用 iota 组合子(ι)作为叶节点构成的二叉树,其中函数应用操作使用符号「0」表示。
语法定义
使用巴科斯范式(BNF)描述的 Iota 语法如下:
iota = "1" / "0" iota iota
其中:
- "1" 表示基础组合子 ι
- "0" 表示
示例
程序终止性
值得注意的是,巴克证明了所有长度小于 27 个符号的 Iota 程序必定终止。这一性质使得 Iota 在研究停机问题和算法信息论时具有特殊的理论价值。
此外,Jot 揭示了 Iota 与更广泛二进制表示之间的深层联系:当 [w] = \iota 时,[w0] = (\iota[w])。
Zot 语言
Zot 是 Iota 系列的第三位成员,引入输入/输出机制。不同于前两者,Zot 采用来描述计算过程中的控制流。
语法定义
zot = pot / ""
pot = iot / pot iot
iot = "0" / "1"
语义定义
在 Zot 中,每个基本符号产生一个:
计算从输入开始,通过一系列延续传递,最终产生输出。
Positive Zot
Positive Zot 是 Zot 的一个变体,仅使用符号 1,通过不同的延续组合来表达计算。这一限制使得它成为研究组合子逻辑中"正交性"概念的工具。
与其他系统的比较
Iota 和 Jot 的独特之处在于它们仅需两个符号即可达到图灵完备性,这在极简主义语言设计中是极为罕见的成就。
应用与影响
蔡廷常数研究
Iota 和 Jot 的极简特性使其成为研究蔡廷常数(Chaitin's constant)的理想工具。迈克尔·斯特伊(Michael Stay)在 2005 年的论文中证明了这些极简系统与算法信息论之间的深层联系。
深奥编程语言社区
作为图灵焦油坑的典型代表,Iota 和 Jot 在深奥的编程语言(Esoteric programming language,简称 esolang)社区中占有特殊地位。
它们证明了即使在极度受限的语法下,仍可实现完整的计算能力。
教育价值
这些语言被用于教授组合子逻辑和形式语义学的基本概念,因为它们的简洁性使得学生可以直观地理解从单个组合子构建完整计算系统的过程。
示例程序
Iota 中的死循环
以下是一个永不终止的 Iota 程序:
0101010101010101010101010101...(无限)
这是 形式的无限递归。
Jot 中的无限循环
在 Jot 中,以下结构产生无限循环:
1111111111111111...(无限个 1)
参见
- λ演算
- 组合子逻辑
- SKI组合子演算
*
- 图灵完备性
- ——另一个深奥的组合子语言
- 递归函数论
- 哥德尔数
- 算法信息论
- 蔡廷常数
参考文献
外部链接
- (纽约大学):https://web.archive.org/web/20181024173237/http://www.nyu.edu/projects/barker/Iota/
- 上的 [https://esolangs.org/wiki/Iota Iota 词条]
- 上的 [https://esolangs.org/wiki/Jot Jot 词条]
- 上的 [https://esolangs.org/wiki/Zot Zot 词条]
- 上的相关论文:Very Simple Chaitin Machines for Concrete AIT([https://arxiv.org/abs/cs/0508056 arXiv:cs/0508056] )
延伸阅读
- Barendregt, H.P. (1984). The Lambda Calculus: Its Syntax and Semantics. North-Holland. ISBN 978-1848900660
- Hindley, J.R.; Seldin, J.P. (2008). Lambda-Calculus and Combinators: An Introduction. Cambridge University Press. ISBN 978-0521898850
- Chaitin, Gregory (1975). "A Theory of Program Size Formally Identical to Information Theory". Journal of the ACM, 22: 329–340.
评论 (0)