【PL理论深化】(13) 变量与环境:文法结构 | 真假表达式:isZero E | let 表达式叠放 | 定义的规则 | 条件语句的使用

news2025/1/20 16:32:03

💬 写在前面:从现在开始,让我们正式设计和实现编程语言。首先,让我们扩展在之前定义的整数表达式语言,以便可以使用变量和条件表达式。

目录

0x00 文法结构

0x01 真假表达式:isZero E

0x02 let 表达式叠放

0x03 定义的规则

0x04 条件语句的使用


0x00 文法结构

扩展后的语言的文法结构如下,在整数表达式语言中增加了四种文法:

在程序中,可以在任意可以出现表达式的位置使用变量 x (随机变量)

let x = E_1 in E_2 是一个声明变量 x 的表达式。

它先将 E_1 的值赋给 x,然后计算 E_2 的值。在此期间,变量 x 的有效范围是 E_2

if E_1 then E_2 else E_3  是一个条件表达式,其计算方式如下。

.

此后,我们约定符号 \top 表示 true,符号 \bot 表示 false。

首先计算表达式 E_1,其结果必须是 \perp 或 \top

  • 如果 E_1 的值是 \top,则计算 E_2
  • 如果 E_1 的值是 \bot,则计算 E_1

0x01 真假表达式:isZero E

为了使用条件表达式,需要创建产生 真/假 的表达式,因此我们添加了语法:

\textrm{iszero}\,\, E

它计算表达式 E 的值,如果值为 0,则计算为 \top,否则为 \bot

由于它类似于 OCaml 的语法,可以很容易感受到可以编写哪些程序,举几个例子:

下面是一个程序,首先变量 x:= 1,然后计算 x+2 的值,结果是 3

let x = 1 in x + 2

0x02 let 表达式叠放

在 let 表达式的 E_2 位置上可以放置另一个 let 表达式

let x = 1
in let y = 2
  in x + y

表达式 x+y 中,x 和 y 分别代表 1 和 2,因此程序的计算结果是 3。

.

也可以在 let 表达式的 E_1 位置上放置另一个 let 表达式,如下所示。

let x = let y = 2
        in y + 1
in x + 3

表达式 let y = 2 in y + 1 的值为 3,将其命名为 x 后,计算表达式 x+3 的结果为 6。

在计算表达式 x+3 时,请注意变量 y 不可用。

变量 y 的作用范围仅限于表达式 y+1,因此在其他地方无法使用。

因此,下面的程序在语法上没有问题,但在执行时会出现问题。

let x = let y = 2
        in y + 1
in x + y

0x03 定义的规则

可以多次使用相同的名称进行定义,如下所示。

let x = 1
in let y = 2
    in let x = 3
        in x + y

在最后一行计算 x+y 时,x 表示最后定义的值 3,因此 x+y 的值是 5。

重新定义具有相同名称的变量并不会改变先前变量的值。

使用 let 定义变量并不是修改现有变量的值,而是创建一个新名称,在其作用域内具有意义。

例如下面的程序:

let x = 1
in let y = let x = 2
           in x + x
    in x + y

上述程序计算的结果是 5。第一行定义变量 x:= 1,第二行定义的 x:= 2

因此第三行的 x+x 的值是 4,因此变量 y 的值为 4。

在最后一行的表达式 x+y 中,变量 x 指的是第一行定义的 x,因此 x+y 的值为 5。

0x04 条件语句的使用

条件语句的使用如下所示。这是一个计算整数 1 的程序。

let x = 1
in let y = 2
    in if iszero (x - 1) then y - 1 else y + 1

.

现在,由于程序不仅可以计算整数,还可以计算真 / 假值,因此存在一些由于类型不匹配而无法执行的程序,即存在 类型错误 (type error) 的程序。例如,看下面的程序。

let x = 1
in let y = iszero x
    in x + y

加法是针对两个整数定义的操作,但由于 y\in \left \langle bool \right \rangle,因此在计算 x+y 时会发生类型错误。

由于我们的语言目前没有静态类型系统,所以无法在执行前发现这类类型错误。

如果在运行过程中发生类型错误,程序将会因此而非正常终止。

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2022.9.14
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

- R. Neapolitan, Foundations of Algorithms (5th ed.), Jones & Bartlett, 2015.

- T. Cormen《算法导论》(第三版),麻省理工学院出版社,2009年。

- T. Roughgarden, Algorithms Illuminated, Part 1~3, Soundlikeyourself Publishing, 2018.

- J. Kleinberg&E. Tardos, Algorithm Design, Addison Wesley, 2005.

- R. Sedgewick&K. Wayne,《算法》(第四版),Addison-Wesley,2011

- S. Dasgupta,《算法》,McGraw-Hill教育出版社,2006。

- S. Baase&A. Van Gelder, Computer Algorithms: 设计与分析简介》,Addison Wesley,2000。

- E. Horowitz,《C语言中的数据结构基础》,计算机科学出版社,1993

- S. Skiena, The Algorithm Design Manual (2nd ed.), Springer, 2008.

- A. Aho, J. Hopcroft, and J. Ullman, Design and Analysis of Algorithms, Addison-Wesley, 1974.

- M. Weiss, Data Structure and Algorithm Analysis in C (2nd ed.), Pearson, 1997.

- A. Levitin, Introduction to the Design and Analysis of Algorithms, Addison Wesley, 2003. - A. Aho, J. Hopcroft, and J. Ullman, Data Structures and Algorithms, Addison-Wesley, 1983.

- E. Horowitz, S. Sahni and S. Rajasekaran, Computer Algorithms/C++, Computer Science Press, 1997.

- R. Sedgewick, Algorithms in C: 第1-4部分(第三版),Addison-Wesley,1998

- R. Sedgewick,《C语言中的算法》。第5部分(第3版),Addison-Wesley,2002

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1880702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1-5题查询 - 高频 SQL 50 题基础版

目录 1. 相关知识点2. 例题2.1.可回收且低脂的产品2.2.寻找用户推荐人2.3.大的国家2.4. 文章浏览 I2.5. 无效的推文 1. 相关知识点 sql判断,不包含null,判断不出来distinct是通过查询的结果来去除重复记录ASC升序计算字符长度 CHAR_LENGTH() 或 LENGTH(…

LeetCode-Leetcode 1120:子树的最大平均值

LeetCode-Leetcode 1120:子树的最大平均值 题目描述:解题思路一:递归解题思路二:0解题思路三:0 题目描述: 给你一棵二叉树的根节点 root,找出这棵树的 每一棵 子树的 平均值 中的 最大 值。 子…

文章浮现之单细胞VDJ的柱状图

应各位老师的需求复现一篇文章的中的某个图 具体复现图5的整个思路图,这里没有原始数据,所以我使用虚拟生产的metadata进行画图 不废话直接上代码,先上python的代码的结果图 import matplotlib.pyplot as plt import numpy as np# 数据&#…

RocketMQ常用基本操作

文章中的rabbitmq使用的是rocketmq-all-5.1.3-bin-release版本,需要安装包的可自行下载 RockerMQ启动停止命令 启动命令 nohup sh bin/mqnamesrv & nohup sh bin/mqbroker -n localhost:9876 --enable-proxy & 查看日志 tail -f ~/logs/rocketmqlogs/…

sqlmap注入详解

免责声明:本文仅做分享... 目录 1.介绍 2.特点 3.下载 4.帮助文档 5.常见命令 指定目标 请求 HTTP cookie头 HTTP User-Agent头 HTTP协议的证书认证 HTTP(S)代理 HTTP请求延迟 设定超时时间 设定重试超时 设定随机改变的参数值 利用正则过滤目标网址 避免过多的…

江大白 | 何凯明入职 MIT,首次带队提出Diffusion Loss,扩散模型思想提升生成速度和效果 !

本文来源公众号“江大白”,仅用于学术分享,侵权删,干货满满。 原文链接:何凯明入职 MIT,首次带队提出Diffusion Loss,扩散模型思想提升生成速度和效果 ! 导读 在图像生成领域中,作…

在数字化转型中,中小企业如何打造数字化产品和服务?

引言:随着社会的发展和消费者行为的变化,市场对数字化产品和服务的需求日益增长。中小企业需要紧跟这一趋势,通过开发数字化产品和服务来满足消费者的新需求。云计算、大数据、人工智能等先进技术的出现,为中小企业提供了更多的机…

志愿填报指南:为什么我强烈建议你报考计算机专业

首先恭喜2024届高考的同学们,你们已经通过了高考的考验,即将进入人生的新阶段——大学。 现在正是高考完填报志愿的时刻,Left听到身边朋友提到报考志愿的诸多问题: 志愿填报怎么填?我要报考什么专业?这个…

基于线调频小波变换的非平稳信号分析方法(MATLAB)

信号处理领域学者为了改进小波变换在各时频区间能量聚集性不高的缺点,有学者在小波分析基础上引入调频算子构成了线性调频小波变换,线调频小波一方面继承了小波变换的理论完善性,另一方面用一个新的参数(线调频参数)刻…

ONLYOFFICE 桌面编辑器 8.1 现已发布:功能完善的 PDF 编辑器、幻灯片版式、改进从右至左显示、新的本地化选项等

继 ONLYOFFICE 文档 8.1 发布后,适用于 Linux、Windows 和 macOS 的 ONLYOFFICE 桌面应用程序最新版本也已推出。它具有在线套件的最主要功能,例如功能齐全的 PDF 编辑器、演示文稿中的幻灯片版式、改进的 RTL 支持、新的本地化选项等。 点击进入ONLYOF…

vue中【事件修饰符号】详解

在Vue中,事件修饰符是一种特殊的后缀,用于修改事件触发时的默认行为。以下是Vue中常见的事件修饰符的详细解释: .stop 调用event.stopPropagation(),阻止事件冒泡。当你在嵌套元素中都有相同的事件监听器(如click事件…

100张linux C/C++工程师面试高质量图

文章目录 杂项BIOSlinux开机启动流程内核启动流程网络编程网络编程流程tcp状态机三次握手四次断开reactor模型proactor模型select原理poll原理epoll原理文件系统虚拟文件系统文件系统调用阻塞IO非阻塞IO异步IO同步阻塞同步非阻塞IO多路复用进程管理进程状态程序加载内存管理MMU…

【高中数学/基本不等式】已知:x,y皆为正实数,且2xy+x+6y=6 求:x+2y的最小值

【题目】 已知:x,y皆为正实数,且2xyx6y6 求:x2y的最小值 【解答】 解法一:因为2xyx6y6 可转换为(x3)(2y1)-36 得到(x3)(2y1)9 而x2yx3-32y1-1 (x3)(2y1)-4 >2*根号下[(x3)(2y1)]-4 2*3-4 2 解法二&#xff1a…

5.4符号三角形问题

#include<iostream> #include<stdio.h> using namespace std; int half; int ssum; int cnt0;//减号的个数 int n; int p[100][100]; int countt0; void BackTrack(int s) {if(cnt>half||s*(s-1)/2-cnt>half)return ;if(s>n){countt;return ;}for(int i0;…

【从零开始学架构 架构基础】五 架构设计的复杂度来源:低成本、安全、规模

架构设计的复杂度来源其实就是架构设计要解决的问题&#xff0c;主要有如下几个&#xff1a;高性能、高可用、可扩展、低成本、安全、规模。复杂度的关键&#xff0c;就是新旧技术之间不是完全的替代关系&#xff0c;有交叉&#xff0c;有各自的特点&#xff0c;所以才需要具体…

Android Studio环境搭建(4.03)和报错解决记录

1.本地SDK包导入 安装好IDE以及下好SDK包后&#xff0c;先不要管IDE的引导配置&#xff0c;直接新建一个新工程&#xff0c;进到开发界面。 SDK路径配置&#xff1a;File---->>Other Settings---->>Default Project Structure 拷贝你SDK解压的路径来这&#xff0c;…

Hugging Face发布重量级版本:Transformer 4.42

Hugging Face 宣布发布Transformer 4.42&#xff0c;该版本为流行的机器学习库带来了许多新功能和增强功能。此版本引入了几个高级模型&#xff0c;支持新工具和检索增强生成 &#xff08;RAG&#xff09;&#xff0c;提供 GGUF 微调&#xff0c;并整合了量化的 KV 缓存&#x…

2029年AI服务器出货量将突破450万台,AI推理服务器即将爆发式增长

在2020年&#xff0c;新冠疫情与远程办公模式的兴起推动了所有类型服务器的出货量达到峰值&#xff0c;随后几年里&#xff0c;除了AI服务器之外的所有类别都回归到了正常水平。 根据Omdia的研究数据&#xff0c;AI服务器的出货量在2020年急剧上升&#xff0c;并且至今未显示出…

每日一题——Python实现PAT乙级1073 多选题常见计分法(举一反三+思想解读+逐步优化)9千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试 再次尝试 有何不同 版本一&#xff08;原始版本&#xff09;&#xff1a;…

CVE-2019-12272 Openwrt可视页面LuCi命令注入漏洞复现(完结)

声明 本文所使用的一些源代码等内容已经上传至github&#xff0c;具体地址如下 Vulnerability_POC-EXP/OpenWrt/CVE-2019-12272 at main a2148001284/Vulnerability_POC-EXP GitHub 漏洞简介 参考内容&#xff1a; CVE-2019-12272 OpenWrt图形化管理界面LuCI命令注入分析 |…