类型系统与程序语言——无类型系统
无类型系统
本节为其他章节作引。
无类型算数表达式
一门语言需要语法、语义、语用来构成。现在以无类型算数表达式这个非常简单的语言开始探讨,我们将明确它的语法和语义来充分了解这门语言。
语法
无类型算数表达式语言的语法中只包含
我们将这门语言中的成分称为 term,一个语言的所有内容就是所有 term 的集合,在这门语言中 term 的集合是具有如下性质的最小的
或者使用推理规则定义如下:
也可以使用集合的方法定义,先定义集合
再证明:
熟悉命题逻辑的应该能看出这类似于对全体合式公式的集合的自底向上的定义,只需证明
先证明前者:
接下来使用归纳法证明最小,先定义
其他定义
由于
比如,证明
虽然
语义
语义是 terms 如何求值(evaluate)的定义,定义语义有三个基本途径:
-
操作语义(Operational Semantics)
通过定义 terms 如何工作的一系列操作的语义。比如最常见的替换操作和单步求值操作,这两个操作实际上是对 term 的简化。实际上还有可能有更多操作语义。
其实就是程序的执行流程。
-
指称语义(Denotational Semantics)
将一些 term 与数学实体关联起来的语义,可以明确程序行为。
-
公理语义(Axiomatic Semantics)
在一套逻辑系统下,研究某种特定的性质是否成立的语义。
求值
图片显示了无类型表达式中的两种成分:Boolean 和自然数的运算。左侧为语法,展示了语言的所有成员,包括 term 和 value,term 和 value 的区别就是 value 是不可再求值的,term 包含 value;右侧为语义,其实也就是一系列推演规则,展示如何在各种前提(或无需前提)下做到
比如下面的运算就将复杂的 term 多步求值为了一个 value —— false。
同时定理【单步求值的确定性】:
由于可能出现如
无类型 Lambda 表达式
Lambda 演算是一种形式化系统,在该系统中所有计算都被归约为函数的定义(definition)和应用(application)上的各种操作。如果说无类型算数表达式是过程式语言,那么无类型 Lambda 表达式就是函数式语言了。
语法
上述语法表示,该语言中的最小组成单元 term 包括三种类型,左边为这三种类型的形式,右边为这三种形式的名称。
采用集合的定义为,
Lambda 演算的作用域和操作语义
Lambda 演算中最重要的就是关于函数的描述,即
用 Python 语言做类比可以理解为 lambda x: t
和 lambda x, y: t
,在函数中,
像很多语言一样,这个演算中的函数也有变量的作用域,依作用于不同分为约束变量和自由变量,比如
自由变量的集合也可以被定义为:
对函数的应用只是简单地将函数体中的 term 中的参数进行替换,表示为
更严谨的定义为
Lambda 演算编程
布尔运算
可以使用 Lambda 表达式作一些有趣的编程,首先我们定义编程中最基础的一种运算——boolean。
由于在 Lambda 演算中,一切皆函数,所以
可以看到,这一运算仅仅是选择两个参数中的一个,这一行为本身没有什么用处,需要与其配套的布尔运算
尝试将
序偶
Lambda 演算不仅可以定义运算,还可以定义结构,下面介绍一种最基础的数据结构——序偶。
虽然序偶这一结构非常简单,但是实际上可以用不断的序偶来定义元组和数组。一个例子就是 C++ 中的元组就是由序偶的模版组合成的。
自然数
由皮亚诺公里,将数定义为对某函数的重复后继运算,可以得到自然数的 Lambda 演算
现在有了数,还需要定义数之间的运算,依次定义后继,加法,乘法,前驱,减法
不要忘记数就是对某个函数的重复应用,所以后继是某个函数再一次应用,加法是后继的重复应用,乘法是加法的重复应用。
接下来定义前驱,这一操作需要用到序偶,先将其思想用 Python 表示为
def pred(n: int) -> int: pair = (0, 0) for _ in range(n): pair = (pair[1], pair[1] + 1) return pair[0]
除法在这里就不列出具体实现了,只列出其思想:也需要一个序偶,一个数记录减法次数,另一个数记录被减数,多次减法后取减法次数即可。
拓展
递归
若一个函数具有如下形式,其中
其 Lambda 演算形式为
要注意
最后的结果表明:
链表
一个链表
链表相关运算
本文作者:violeshnv
本文链接:https://www.cnblogs.com/violeshnv/p/16831709.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步