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

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

目录

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 = 2in x + y

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

.

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

let x = let y = 2in 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 = 2in y + 1
in x + y

0x03 定义的规则

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

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

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

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

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

例如下面的程序:

let x = 1
in let y = let x = 2in x + xin 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 = 2in if iszero (x - 1) then y - 1 else y + 1

.

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

let x = 1
in let y = iszero xin 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.mzph.cn/web/37251.shtml

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

相关文章

Elasticsearch 第四期:搜索和过滤

序 2024年4月,小组计算建设标签平台,使用ES等工具建了一个demo,由于领导变动关系,项目基本夭折。其实这两年也陆陆续续接触和使用过ES,两年前也看过ES的官网,当时刚毕业半年多,由于历史局限性导…

Java有没有goto语句

一、技术细节 Java作为一种广泛使用的编程语言,其设计哲学强调清晰、简洁和易于维护。在技术细节层面,Java确实支持goto语句作为关键字,但在实际编程中,goto语句并不被推荐使用。Java中的goto是保留字,主要用于两个场…

chrome-base源码分析(1)macros模块

Chrome-base源码分析(2)之Macros模块 Author:Once Day Date:2024年6月29日 漫漫长路,才刚刚开始… 全系列文章请查看专栏: 源码分析_Once-Day的博客-CSDN博客 参考文档: macros - Chromium Code SearchChrome base 库详解:工…

安全架构概述_2.安全架构的定义和范围

安全架构是架构面向安全性方向上的一种细分,比如细分领域含有运维架构、数据库架构等。如果安全性体现在产品上,那么,通常的产品安全架构、安全技术体系架构和审计架构可组成三道防线。 (1)产品安全架构:构…

ArtTS系统能力-通知的学习(3.1)

上篇回顾: ArtTS语言基础类库-容器类库内容的学习(2.10.2) 本篇内容: ArtTS系统能力-通知的学习(3.1) 一、 知识储备 1. 基础类型通知 按内容分成四类: 类型描述NOTIFICATION_CONTENT_BASIC_TEXT普通文…

2024 Parallels Desktop for Mac 功能介绍

Parallels Desktop的简介 Parallels Desktop是一款由Parallels公司开发的桌面虚拟化软件,它允许用户在Mac上运行Windows和其他操作系统。通过强大的技术支持,用户无需重新启动电脑即可在Mac上运行Windows应用程序,实现了真正的无缝切换。 二…

普元EOS学习笔记-创建精简应用

前言 本文依旧基于EOS8.3进行描述。 在上一篇文章《EOS8.3精简版安装》中,我们了解到普元预编译好的EOS的精简版压缩包,安装后,只能进行低开,而无法高开。 EOS精简版的高开方式是使用EOS开发工具提供的IDE,创建一个…

东软睿驰总裁兼CTO杜强受邀出席 CICV 2024智能网联汽车技术首脑(CTO)闭门峰会

近日,第十一届国际智能网联汽车技术年会(CICV 2024)在北京举办,会议期间组织智能网联汽车技术首脑(CTO)闭门峰会,邀请40余位技术领袖围绕智能网联汽车产业生态建设以及智能网联汽车数据、算力和…

SQL语句查询Cache数据库中数据时对时间怎样转换

使用东华医为HIS系统的用户都知道,Cache数据库中对于日期的存储为几万的数字,比如,今天就是相对于1841年1月1日的第多少万天,以这种形式进行表示;对于时间,也是以数字形式存储,比如,…

Python的numpy简单使用

1.可以调用引入numpy里面的函数,如add可以把俩数相加,也可以创建一个数组arr,arr.shape是数组arr的属性,如果后有跟()就是里面的一个函数 type()函数可以知道里面是什么类型 变量.shape可以知道这个变量是…

BLEU和SPICE:机器翻译与图像描述的自动评估方法详解

BLEU和SPICE:机器翻译与图像描述的自动评估方法详解 在机器翻译和图像描述领域,评估模型性能是一个重要且复杂的问题。为了有效地评估机器生成的文本质量,我们需要一种自动、快速且可靠的方法。BLEU(Bilingual Evaluation Unders…

基于决策树的旋转机械故障诊断(Python)

前置文章: 将一维机械振动信号构造为训练集和测试集(Python) https://mp.weixin.qq.com/s/DTKjBo6_WAQ7bUPZEdB1TA 旋转机械振动信号特征提取(Python) https://mp.weixin.qq.com/s/VwvzTzE-pacxqb9rs8hEVw import…

菲尔兹奖得主测试GPT-4o,经典过河难题未能破解!最强Claude 3.5回答离谱!

目录 01 大言模型能否解决「狼-山羊-卷心菜」经典过河难题? 02 加大难度:100只鸡、1000只鸡如何? 01 大言模型能否解决「狼-山羊-卷心菜」经典过河难题? 最近,菲尔兹奖得主Timothy Gowers分享了他测试GPT-4o的经历&a…

游戏推荐: 植物大战僵尸杂交版

下载地址网上一搜就有. 安装就能玩. 2是显血. 4显示植物血, 5是加速. 都是左手主键盘的按钮, 再按是取消. 比较刺激: ps: 设置里面还能打开自动收集阳光和金币.

视频融合共享平台LntonCVS统一视频接入平台智慧安防应用方案

安防视频监控平台LntonCVS是一款拥有强大拓展性和灵活部署能力的综合管理平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,同时兼容各厂家的私有协议和SDK,如海康Ehome、海大宇等。LntonCVS不仅具备传统安防视频监控功能&…

深入解析Tomcat:Java Web服务器(上)

深入解析Tomcat:Java Web服务器(上) Apache Tomcat是一个开源的Java Web服务器和Servlet容器,用于运行Java Servlets和JavaServer Pages (JSP)。Tomcat在Java Web应用开发中扮演着重要角色。本文将详细介绍Tomcat的基本概念、安装…

遥远星辰中的觉醒:超大质量黑洞的苏醒

遥远星辰中的觉醒:超大质量黑洞的苏醒 在浩渺无垠的宇宙中,星辰的闪烁仿佛是时间的涟漪,穿越亿万年的距离,抵达我们的眼眸。而在这片星辰大海的深处,一个惊人的现象正在悄然上演——距离地球3.6亿光年之遥的星系中&am…

【C++】空指针访问成员函数

空指针访问成员函数 C中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针 如果用到this指针,需要加以判断保证代码的健壮性 class Animal { public:void fun1() {//正常的成员函数}void fun2() {if (this NULL) {return;//如果没有这个…

Django 一对一关系

作用: 两个数据库表建立外键关系当外键表的数据被删除时,主表的数据也会一并删除。 1,添加表模型 Test/app8/views.pyfrom django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email …

【代码随想录训练营】【Day 65】【图论-2】| 卡码 99

【代码随想录训练营】【Day 65】【图论-2】| 卡码 99 需强化知识点 深度搜索和广度搜索 题目 99. 岛屿数量 思想:遍历到为1的节点,再搜索标记,每遇到新的陆地节点,增加计数 深度搜索广度搜索:此处用 [] 作为待遍…