【PL理论】(1) 语法与语义:归纳的定义 | 推理规则 | 推导树 | 数学归纳法证明 (MI)

  

💭 写在前面:在学习编程的过程中,我们经常会听到 "语法" 和 "语义" 这两个词,这对于理解和编写高质量的代码至关重要。在本博客中,我们将深入探讨这两个概念,从而帮助读者更好地理解编程语言的本质和运作方式。

目录

0x00 归纳的定义(Inductive Definition)

0x01 推理规则(Inference Rule)

0x02 推导树(Derivation Tree)

0x03 数学归纳法证明(Mathematical Induction)


0x00 归纳的定义(Inductive Definition)

让我们定义 \mathbb{S},\, \mathbb{S}\in \mathbb{Z},它是一些整数的集合,\mathbb S 是满足以下两个条件的最小集 (smallest set) :

  • 0\in \mathbb{S}
  • n \in \mathbb{S}\Rightarrow n + 3 \in \mathbb{S}  (若 n ∈ 𝑺, 则 n + 3 ∈ 𝑺)

 直觉上,我们知道 \mathbb{S}=\left \{ 0,3,6,9... \right \},那么如果我们没有 "最小集" 这个条件呢?

那么可能有许多集合满足这两个条件,例如 \left \{ 0,1,2,3,4,5,6,... \right \} 也满足 \mathbb{S}

现在,如果我们没有 0\in\mathbb{S} 这个条件呢?那么 \mathbb{S} 就变成了空集。

 因此注重 基线条件 (basecase) 是至关重要的。

0x01 推理规则(Inference Rule)

PL (Programming Languages) 可以理解为是概括“程序设计语言自理论体系到其实现系统”的一个总称。

在 PL 中,归纳定义通常使用推理规则来呈现,推理规则的一般形式如下:

意味着 "如果 A_1\, \, A_2\, \, A_3\, \, ...\, \, A_n 都为真,则 B 为真:

  • A_1...A_n 是前提 (premise)
  • B 是结论 (conclusion)

先前的归纳定义示例可以重写为推理规则的形式:

 请注意,对于基本情况 0\in \mathbb{S},没有前提 (without premise) 。

\mathbb{S} 被定义为可以从这些推理规则推导出的元素的集合:

  • 例如对于 𝑥 = 0, 3, 6, 9 …,我们可以推导出 𝑥 ∈ 𝑆
  • 例如对于 𝑥 = 1, 2, 4, 5 …,我们无法推导出 𝑥 ∈ 𝑆

根据规则,理所当然地强制了 \mathbb{S} 是在规则下的最小集。

0x02 推导树(Derivation Tree)

在先前的例子中,对于 x\in \mathbb S,我们可以构造一个推导树,显示规则的应用。

  • 例如,我们可以如下推导(证明)9\in \mathbb S 。
  • 由于规则简单,它看起来并不像树形结构。

💭 更多例子:

① 自然数 \mathbb N

② 整数列表 L

  • [ ] 表示空列表,\mathbb Z 表示整数集合
  • x::y 表示将元素 x 添加到列表 y 的前面(连接)
  • 1::2::3::[\, ] 等价于 Python 风格中的 [1,2,3]

0x03 数学归纳法证明(Mathematical Induction)

 数学归纳法 (Mathematical Induction),简称 MI,是一种证明数学命题的常用方法,特别适用于证明关于自然数的性质。它基于两个关键步骤:

  1. 基础步骤(Base Case):首先证明当自变量取得最小值时,命题成立。通常这是通过直接验证特定的情况来完成的。

  2. 归纳步骤(Inductive Step):接着假设当自变量取得某个值时,命题成立,然后证明当自变量取得下一个值时,命题仍然成立。这个步骤通常包括以下两个部分:

    • 假设命题对于一个特定的值成立(归纳假设)。
    • 证明基于这个假设,命题对于下一个值也成立。

通过结合基础步骤和归纳步骤,可以推导出命题对于所有符合条件的自变量都成立。

下面我们来看如何使用 MI 证明。

证明:对于归纳定义的集合 \mathbb S,我们如何证明命题 P(x) 对于所有 x\in \mathbb S 都成立?

  • 基本情形 (Base case) x:直接证明 𝑷(𝒙) 成立
  • 归纳情形 (Inductive case) x:在假设所有构成 𝒙 的子组件 𝒙𝒊 都满足 𝑷(𝒙𝒊) 的前提下,证明 𝑷(𝒙) 成立

例如:对于 P(x)=x 是 3 的倍数,在先前的例子中证明 P(x)对于 \mathbb S 成立。

  • 基本情形 (Base case) :0 是 3 的倍数
  • 归纳情形 (Inductive case):如果 n 是 3 的倍数,我们可以令 n=3k
    • 然后,n + 3 = 3k + 3 = 3(k + 1) 也是 3 的倍数。

上面的归纳的一般形式被称为 结构归纳 (structural induction) 。

当归纳定义的集合是 \mathbb N(自然数集合)时,这通常被称为 数学归纳 (mathematical induction) 。可以将其视为结构归纳的一种特定形式。

  • P(1) 成立。
  • 如果 P(N) 成立,则 P(n+1) 也成立。

这种归纳是你必须熟悉的一种形式。


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

📜 参考资料 

C++reference[EB/OL]. []. http://www.cplusplus.com/reference/.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

趣味算法,猴子算法。python如何实现猴子算法

给一只猴子一台打印机,虽然这只猴子根本不识字,但会乱按,经过一段时间后,在它乱按出来的单词里总能找到一些至少看起来是有意义的部分,比如一两个简短的单词,由此可以推出:只要给它足够长的时间…

vite+vue3动态模块化导入并使用pinia

一、安装引入pinia 1.安装 pnpm install pinia # 或者使用 yarn yarn add pinia # 或者使用 npm npm install pinia 2.在main.js里引入 import { createApp } from vue import App from ./App.vue import { createPinia } from pinia createApp(App).use(createPinia()).mo…

辽渤湾海现已加入2024第七届燕窝天然滋补品博览会

参展企业介绍 大连辽渤湾海产品有限公司,是一家主营海参、鲍鱼、海胆等大连海产品的加工和销售的综合型水产企业,拥有国内精良的整条加工流水线,拥有上千平米的现代化加工办公场地的现代化企业。现已发展成为大连海参产品的主导型深加工基地。…

如何清理释放群晖客户端缓存?

任正菲说:企业最大的浪费,是经验的浪费! 而一个一个的经验,又都来自企业的每一个工作者。 因此当我们在工作过程中遇到一些问题时,我们就应该下意识的把解决问题的经验沉淀下来,从而可以与大家进行分享。…

软件设计师19--文件管理

软件设计师19--文件管理 考点1:文件相关概念例题: 考点2:树形目录结构(绝对路径与相对路径)例题: 考点3:位示图例题: 考点4:索引文件索引文件结构例题: 考点1…

武汉星起航:跨境电商行业的领军者,互帮互助共创佳绩

武汉星起航电子商务有限公司,作为跨境电商行业的领军者,以其出色的业绩和卓越的团队实力,在业内赢得了广泛的赞誉。公司自运营团队在亚马逊平台上成功开设了多家店铺,凭借着深耕跨境电商行业多年所积累的经验,取得了令…

[自研开源] 数据集成之分批传输 v0.7

开源地址:gitee | github 详细介绍:MyData 基于 Web API 的数据集成平台 部署文档:用 Docker 部署 MyData 使用手册:MyData 使用手册 试用体验:https://demo.mydata.work 交流Q群:430089673 介绍 本篇基于…

面试笔记——Java集合篇

Java集合框架体系 重点:单列集合——ArrayList、LinkedList;双列集合——HashMap、ConcurrentHashMap。 List相关 数组(Array) 是一种用连续的内存空间存储相同数据类型数据的线性数据结构。 数组获取其他元素: 为什…

为什么在vite中使用eslint报错‘__dirname‘ is not defined?

问题分析 发生这种情况是因为 ESLint 不知道 vite.config.js 中的代码在 Node.js 中使用,__dirname 未在浏览器中定义,也未在 ES 模块中定义。因此要告诉 ESLint 代码将作为 CommonJS 模块在 Node.js 中运行。 解决方案 请打开 ESLint 配置并在该 env …

关于 boost::asio::strand 初始化 socket、stream、resolver、deadline_timer 对象

在 boost::asio 之中默认情况下,大家使用 io_context 来为这些对象初始化传递的执行者,但我需要这里说明。 对于 boost::asio 构造类似 socket 对象必须构造传递 io_context 是个伪命题,boost::asio 对象并非只允许传递 boost::asio::io_cont…

pyrealsense2获取保存点云

一、第一种实现代码 Python import sys import cv2 import pyrealsense2 as rs import numpy as np import keyboard import open3d as o3d import osif __name__ "__main__":output_folder output_data/os.makedirs(output_folder, exist_okTrue)pipeline rs.p…

git cherry pick merge部分提交

cherry pick merge 指定某次提交 1. git history 选择要从哪个分支merge 2. 找到提交记录,选择cherry pick 3.这个时候就可以直接push了

【面试题】ES文档写入和读取流程详解

前言:在回答这个问题之前我们先要搞清楚一个问题那就是什么是文档,避免不知所云! 一、什么是文档? 在Elasticsearch中,文档(Document)是最基本的信息单元,用于表示和存储数据。文…

数据采集用,集成了主流工业通讯协议

IoTClient 是一个物联网设备通讯协议实现客户端,集成了主流工业通讯协议,包括主流PLC通信读取、ModBus协议、Bacnet协议等。该组件基于.NET Standard 2.0,适用于.NET的跨平台开发,可在Windows、Linux等系统上运行,甚至…

LinkedIn账号为什么被封?被封后如何解决?

近期会有一些小伙伴说自己遇到了帐号无法登录的情况,其实出现领英帐号被封号(被限制登录)主要会有两类情况,今天就给大家分享一下如果被封该如何解决,强烈建议收藏。 在电脑领英官网或者手机领英APP上,输入领英帐号密码点击登录后…

数据结构(五)单链表专题

在开始之前,我先来给大家讲一下顺序表与链表的区别: 它们在堆上存储的差异: 我们可以很容易的知道,循序表是连续的有序的,但链表是杂乱的,它们通过地址彼此联系起来。 1. 链表的概念及结构 概念&#xff1…

【光伏科普】光伏投融资计算的意义

光伏产业,作为清洁能源的重要组成部分,近年来在全球范围内得到了广泛的关注与发展。而在光伏项目的实施过程中,投融资计算显得尤为重要。本文旨在探讨光伏投融资计算的意义,以及它如何影响光伏产业的可持续发展。 首先&#xff0c…

无法找到filesystem头文件

无法找到filesystem头文件 一、前言 这段时间接老板命令,做目标识别模型的嵌入式部署。需要将模型运行环境编译后打包到瑞芯微开发板上运行,在此之前我对原C文件做过修改,为了能实现与厂商提供的数据接口对接。 我在用CMake打包过程中&…

jmeter接口测试及详细步骤以及项目实战教程

在接口测试项目实战中,JMeter是一款非常强大和流行的自动化测试工具,它可以测试各种类型的应用程序,并通过采样和报告来识别性能瓶颈和API的问题。本文将为你提供一个基于实际项目的JMeter接口测试项目实战教程,指导你如何使用JMe…

腾讯VS网易:一场不见终局的游戏未来之战

国内游戏霸主腾讯最近赚足了眼球。 总体上看,腾讯手握“游戏社交”两大王牌,最近发布的财报十分亮眼,其2023年总营收和净利润分别同比增长10%和36%,展现了互联网巨头的强劲活力。 然而巨头亦有焦虑,增值服务营收同比…