形式化数学——Lean求值表达式
作为学习 Lean 的程序员,最重要的是理解求值的工作原理。求值是求得表达式的值的过程,就 像算术那样。例如,15 - 6 的值为 9,2 × (3 + 1) 的值为 8。要得到后一个表达式的值,首先将 3 + 1 替换为 4,得到 2 × 4,它本身又可以归约为 8。有时,数学表达式包含变量:在知道 x 的 值之前,无法计算 x + 1 的值。在 Lean 中,程序首先是表达式,思考计算的主要方式是对表达 式求值。
大多数编程语言都是命令式的(Imperative),其中程序由一系列语句组成,这些语句会按顺 序执行以得到程序的结果。程序可以访问可变内存,因此变量引用的值可以随时间而改变。除 了可变状态外,程序还可能产生其他副作用,例如删除文件、建立传出的网络连接、抛出或捕 获异常以及从数据库读取数据等等。「副作用(Side Effect)」本质上是一个统称,用于描述 程序运行过程中可能发生的事情,这些事情不遵循数学表达式求值的模型。
然而,在 Lean 中,程序的工作方式与数学表达式相同。变量一旦被赋予一个值,就不能再被重 新赋值。求值表达式不会产生副作用。如果两个表达式的值相同,那么用一个表达式替换另一 个表达式并不会导致程序计算出不同的结果。这并不意味着不能使用 Lean 向控制台写入
Hello, world!,而是执行I/O并不是以求值表达式的方式使用Lean的核心部分。因此,本 章重点介绍如何使用 Lean 交互式地求值表达式,而下一章将介绍如何编写、编译并运行
Hello, world! 程序。要让 Lean 对一个表达式求值,请在编辑器中的表达式前面加上 #eval ,然后它会返回结果。
通常可以将光标或鼠标指针放在 #eval 上查看结果。例如,
#eval 1 + 2
会产生值 3 。Lean 遵循一般的算术运算符优先级和结合性规则。也就是说,
#eval 1 + 2 * 5
会产生值 11 而非 15 。
虽然普通的数学符号和大多数编程语言都使用括号(例如 f(x) )将函数应用到其参数上,但 Lean 只是将参数写在函数后边(例如 f x )。函数应用是最常⻅的操作之一,因此保持简洁 很重要。与其编写
#eval String.append("Hello, ", "Lean!")
其中函数的两个参数只是写在后面用空格隔开。
就像算术运算的顺序需要在表达式中使用括号(如 (1 + 2) * 5 )表示一样,当函数的参数需 要通过另一个函数调用来计算时,括号也是必需的。例如,在
#eval String.append "great " (String.append "oak " "tree")
中需要括号,否则第二个 String.append 将被解释为第一个函数的参数,而非一个接受 "oak " 和 "tree" 作为参数的函数。必须先得到内部 String.append 调用的值,然后才能将其追 加到 "great " 后面,从而产生最终的值 "great oak tree" 。
命令式语言通常有两种条件:根据布尔值确定要执行哪些指令的条件语句(Statement),以 及根据布尔值确定要计算两个表达式中哪一个的条件表达式(Expression)。例如,在 C 和 C++ 中,条件语句使用 if 和 else 编写,而条件表达式使用三元运算符 ? 和 : 编写。在 Python 中,条件语句以 if 开头,而条件表达式则将 if 放在中间。由于 Lean 是一种面向表 达式的函数式语言,因此没有条件语句,只有条件表达式。条件表达式使用 if 、 then 和
else 编写。例如,
String.append "it is " (if 1 > 2 then "yes" else "no")
会求值为
String.append "it is " (if false then "yes" else "no")
进而求值为
String.append "it is " "no"
最终求值为 "it is no" 。
为简洁起见,有时会用箭头表示一系列求值步骤:
String.append "it is " (if 1 > 2 then "yes" else "no")
===>
String.append "it is " (if false then "yes" else "no")
===>
String.append "it is " "no"
===>
"it is no"
可能会遇到的信息
让 Lean 对缺少参数的函数应用进行求值会产生错误信息。举例来说,
#eval String.append "it is "
会产生一个很长的错误信息:
expression
String.append "it is "
has type
String → String
but instance
Lean.MetaEval (String → String)
failed to be synthesized, this instance instructs Lean on how to display the
resulting value, recall that any type implementing the `Repr` class also
implements the `Lean.MetaEval` class
表达式
String.append "it is "
类型为
String → String
但实例
Lean.MetaEval (String → String)
合成失败,此实例指示 Lean 如何显示结果值,回想一下任何实现了
`Repr` 类的类型也实现了 `Lean.MetaEval` 类。
会出现此信息是因为在 Lean 中,仅接受了部分参数的函数会返回一个等待其余参数的新函数。 Lean 无法向用户显示函数,因此在被要求这样做时会返回错误。
练习
以下表达式的值是什么?请手动计算,然后输入 Lean 来检查你的答案。
42 + 19
String.append "A" (String.append "B" "C")
String.append (String.append "A" "B") "C"
if 3 == 3 then 5 else 7
if 3 == 4 then "equal" else "not equal"
本文参考
David Thrane Christiansen, 《Lean on functional programming》
Lean-zh 项目组,译
Lean 手册
相关文章:
形式化数学——Lean求值表达式
作为学习 Lean 的程序员,最重要的是理解求值的工作原理。求值是求得表达式的值的过程,就 像算术那样。例如,15 - 6 的值为 9,2 (3 1) 的值为 8。要得到后一个表达式的值,首先将 3 1 替换为 4,得到 2 4&…...
杰理-AC696音箱linein无法插入检测
杰理-AC696音箱linein无法插入检测 阻值选用1k,原公版原理图上68k,导致内部上拉电压一直不能掉下来,软件一直无法检测到。...
zst-2001 历年真题 程序设计语言
程序设计语言1 b 程序设计语言2 c 程序设计语言3 a 程序设计语言4 b中解释语言可以用高级语言编写 c优化 d反了 a 程序设计语言5 c 程序设计语言6 重复就是循环 b 程序设计语言7 a 程序设计语言8 c就是malloc,动态扩展数组,和类型没什…...
VirtualBox调整虚拟机内存和CPU
当我们配置的虚拟机内存或CPU不足以支撑开发需要时,需要及时调整内存和CPU大小。调整前如果虚拟机在运行,需要先关机。 下面的步骤是居于VirtualBox 6.1版本,不同版本的操作界面会有些许差异。 1.选中要调整的虚拟机,点击设置 2…...
SpringMVC框架详解与实践指南
文章目录 一、三层架构与MVC模型1. 三层架构2. MVC模型 二、SpringMVC入门案例1. 环境搭建2. 核心配置3. 编写Controller 三、执行流程与组件分析四、RequestMapping注解五、请求参数绑定1. 基本类型与对象绑定2. 嵌套对象与集合绑定 六、中文乱码解决方案(前端传到后端)1. Str…...
C语言 ——— 函数
目录 函数是什么 库函数 学习使用 strcpy 库函数 自定义函数 写一个函数能找出两个整数中的最大值 写一个函数交换两个整型变量的内容 牛刀小试 写一个函数判断一个整数是否是素数 写一个函数判断某一年是否是闰年 写一个函数,实现一个整型有序数组的二分…...
洛谷 P9007 [入门赛 #9] 最澄澈的空与海 (Hard Version)
这道题可不入门。 [Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 给定 n n n,求有多少组 ( x , y , z ) (x,y,z) (x,y,z) 满足: x − y z n ! x-\dfrac{y}{z}n! x−zyn! x − y z n ! n \dfrac{x-y…...
Java基础学完,继续深耕(0505)Linux 常用命令
昨天休息了一天,没有写csdn 昨天和今天把Linux大概学了一下。总结一下常用命令,总结的不全。 Linux目录结构 / 是所有目录的顶点 目录结构像一颗倒挂的树 注意:/itheima 是绝对路径,是指根目录 / 下的itheima目录 itheima…...
详解 FFMPEG 交叉编译 `FLAGS` 和 `INCLUDES` 的作用
FLAGS 和 INCLUDES这两行是 Android NDK 编译时的编译器选项,用于控制代码生成、优化、调试、安全性和头文件搜索路径。下面逐项详解: 1. FLAGS 详解(编译器选项) FLAGS 定义了传递给 C/C 编译器(如 clang 或 gcc&…...
DGI数据治理框架的最佳实践
以下是针对DGI数据治理框架的最佳实践推荐,结合其核心理念与实际应用场景,帮助组织高效落地数据治理,释放数据价值。 一、组织架构与角色分工 最佳实践1:建立清晰的数据治理委员会 • 实践要点: • 由高层领导&#…...
C++类与对象深度解析:从基础到应用
目录: 1. 类的基本概念与定义1.1 类的定义与访问限定符1.2 实例化与对象内存布局1.3 this指针 2.类的默认成员函数2.1 构造函数与析构函数详解构造函数析构函数 2.2 拷贝构造函数2.3 赋值运算符重载运算符重载 3. 初始化列表4.类型转换5. 静态成员6.友元和内部类6.1…...
JGQ611Ⅱ数据采集电除雾器实验装置
JGQ611Ⅱ数据采集电除雾器实验装置 一.实验目的 1.掌握电除雾器的结构特征与工作原理。 2.测定风压、风速、电压、电流板间距等因素对酸雾去除效率的影响。 3.测定电除雾器的工作效率。 二.技术指标 1.电场电压:0~20KV(可调)。 2.…...
如何判断cgroup的版本?
在 Linux 系统中,判断当前使用的 cgroup 版本(v1 还是 v2)可以通过以下几种方法: 方法一:查看挂载点(最直接) mount | grep cgroup输出分析 cgroups v1:存在多个以 cgroup 开头的…...
基于 Spark 和 Hadoop 的空气质量数据分析与预测系统
基于 Spark 和 Hadoop 的空气质量数据分析与预测系统 文章目录 基于 Spark 和 Hadoop 的空气质量数据分析与预测系统引言项目目标技术栈数据来源系统核心功能1. 用户认证与管理2. 数据总览3. 空气质量分析4. 词云图5. AQI 预测 项目结构预览关键代码分享1. Flask 主文件&#x…...
qt csv文件写操作
实例1: QStringList header; header << "1" << "2"; QStringList footer; footer << "Here is a footer"; QStringList strList; strList << "one" << "two" <&l…...
Java 反射
反射 反射的概述 获取class对象的三种方式 代码实现 package myreflect1;public class MyReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {//1.第一种方式//全类名:包名类名//最为常用Class clazz1 Class.forName("…...
Spring-使用Java的方式配置Spring
目录 前言 一、使用Java配置Spring 前言 使用纯Java的配置方式,在SpringBoot中随处可见,是必须要学习的 一、使用Java配置Spring 配置Spring有多种方式,我们现在要完全不使用Spring的xml配置了,全权交给Java来做! J…...
cudaMalloc函数说明
cudaMalloc函数说明 cudaError_t cudaMalloc(void** devPtr, size_t size);参数说明 devPtr (输出参数): 类型为 void**,即指向指针的指针。函数执行成功后,*devPtr 将被赋值为 GPU 内存的起始地址。例如:若分配一个 float 数组,需…...
路由协议(静态路由、RIP、OSPF、BGP)
目录 静态路由 RIP OSP BGP 总结 静态路由 定义:由网络管理员手动配置的路由。它不会自动更新,除非管理员手动修改。 特点: 简单:配置简单,适合小型网络。安全:不会与其他路由器交换路由信息&#x…...
基于 HTML5 的贪吃蛇小游戏实现
一、引言 在 Web 开发的世界中,利用 HTML、CSS 和 JavaScript 构建有趣的互动游戏是一项充满乐趣和挑战的任务。本文将详细介绍一个基于 HTML5 的贪吃蛇小游戏的实现过程,通过对代码的解析,带你了解如何打造一个经典的贪吃蛇游戏,…...
学习Linux的第二天
如何在Linux环境下做开发 Linux的一些基操 Tips:平常最表层的是命令行模式,最多见这个默认叫做命令行模式 Vi操作是什么意思呢 就是在提示符输入vi a.c 是可以创建一个a.c这个文件并进入这个输入模式 按i可以输入代码 要退出的时候按esc 再按:(冒号…...
rollout 是什么:机器学习(强化学习)领域
rollout 是什么:机器学习(强化学习)领域 指从特定初始状态开始,按照某个策略或模型进行一系列动作和状态转移,直到达到终止状态或预定时间步数 。比如: 迷宫任务:强化学习代理在迷宫中,从起始点出发,按某策略(如随机选方向走)进行移动,直到找到出口或达到最大移动…...
MATLAB人工大猩猩部队GTO优化CNN-LSTM多变量时间序列预测
本博客来源于CSDN机器鱼,未同意任何人转载。 更多内容,欢迎点击本专栏目录,查看更多内容。 目录 0 引言 1 数据准备 2 CNN-LSTM模型搭建 3 GTO超参数优化 3.1 GTO函数极值寻优 3.2 GTO优化CNN-LSTM超参数 3.3 主程序 4 结语 0 引言…...
android-ndk开发(3): 连接设备到开发机
android-ndk开发(3): 连接设备到开发机 2025/05/05 1. 术语解释 用来写代码的电脑, 我叫做开发机。 我打心底认为 Windows, Linux, macOS 都是 PC, 但是有些人不这么认为, 那就还是叫开发机。 android 手机能运行 app(众所周知…...
谷歌最新推出的Gemini 2.5 Flash人工智能模型因其安全性能相较前代产品出现下滑
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
Kubernetes排错(七)-节点排错
1、节点 Crash 与 Vmcore 分析 kdump 介绍 目前大多 Linux 发新版都会默认开启 kdump 服务,以方便在内核崩溃的时候, 可以通过 kdump 服务提供的 kexec 机制快速的启用保留在内存中的第二个内核来收集并转储内核崩溃的日志信息(vmcore 等文件), 这种机制需要服务…...
《架构安全原则》解锁架构安全新密码
The Open Group最新发布的《架构安全原则》标准中文版为企业架构、技术架构、解决方案架构以及安全架构领域的专业人员提供了一套系统化、可落地的安全设计准则。这一权威文件旨在帮助组织在数字化转型的复杂环境中构建既安全又敏捷的架构体系,其内容与TOGAF标准、N…...
生物化学笔记:神经生物学概论10 运动节律的控制 运动时脑内活动 运动系统疾病及其治疗(帕金森、亨廷顿)
运动节律的控制 运动时脑内活动 运动系统疾病及其治疗 口服多巴胺无法穿越“血脑屏障”,进不到脑子里去,其前体(原材料)能进入血脑屏障。一直吃药,机体会偷懒。另一方面,会影响脑子其他部分。 损毁也只能暂时解决,黑质…...
DDR在PCB布局布线时的注意事项及设计要点
一、布局注意事项 控制器与DDR颗粒的布局 靠近原则:控制器与DDR颗粒应尽量靠近,缩短时钟(CLK)、地址/控制线(CA)、数据线(DQ/DQS)的走线长度,减少信号延迟差异。 分组隔…...
Paramiko源码深入解析
Paramiko是一个基于Python的SSHv2协议实现库,支持远程命令执行、文件传输(SFTP)和安全隧道功能。以下是对其源码的深入解析,涵盖核心模块、关键流程及实现细节。 1. 核心模块与结构 Paramiko的源码结构围绕SSH协议的各个层次设计…...
音频感知动画新纪元:Sonic让你的作品更生动
前言 在现代肖像动画领域,如何精准地控制画面中的焦点,确保声音和画面完美契合,已成为了一个十分值得探索的话题。于是,Sonic 方法应运而生,这种创新的音频感知技术,旨在让肖像动画中的焦点能够与音频内容同步,从而提升整体的沉浸感和表现力。在ComfyUI 中实现这一功能…...
uniapp开发06-视频组件video的使用注意事项
uniapp开发-视频组件video的使用注意事项!实际项目开发中,经常会遇到视频播放的业务需求。下面简单讲解一下,uniapp官方提供的视频播放组件video的常见参数和实际效果。 1:先看代码: <!--视频组件的使用展示-->…...
英伟达语音识别模型论文速读:Fast Conformer
Fast Conformer:一种具有线性可扩展注意力的高效语音识别模型 一、引言 Conformer 模型因其结合了深度可分离卷积层和自注意力层的优势,在语音处理任务中取得了出色的性能表现。然而,Conformer 模型存在计算和内存消耗大的问题,…...
利用jQuery 实现多选标签下拉框,提升表单交互体验
在 Web 开发中,表单设计常常需要支持用户选择多个选项的场景。传统的多选框或下拉菜单在处理大量选项时,可能会影响界面美观和操作便捷性。这时,多选标签下拉框就成为了一种优雅的解决方案。本文将详细介绍如何通过 HTML、CSS 和 jQuery 实现…...
基于 HTML 和 CSS 实现的 3D 翻转卡片效果
一、引言 在网页设计中,为了增加用户的交互体验和视觉吸引力,常常会运用一些独特的效果。本文将详细介绍一个基于 HTML 和 CSS 实现的 3D 翻转卡片效果,通过对代码的剖析,让你了解如何创建一个具有立体感的卡片,在鼠标…...
【阿里云大模型高级工程师ACP学习笔记】2.9 大模型应用生产实践 (下篇)
特别说明:由于这一章节是2025年3月官方重点更新的部分,新增内容非常多,因此我不得不整理成上、下两篇,方便大家参考。 学习目标 备考阿里云大模型高级工程师ACP认证的这部分内容,旨在深入理解大模型应用在安全合规方面的要求,掌握模型部署相关要点,提升实际操作和应对复…...
MVC、MVP、MVVM三大架构区别
1、MVC架构 M(Model):主要处理数据的存储、获取、解析。 V(View):即Fragement、Activity、View等XML文件 C(Controller):主要功能为控制View层数据的显示,…...
期末代码Python
以下是 学生信息管理系统 的简化版代码示例(控制台版本,使用文件存储数据),包含核心功能: 1. 定义学生类 class Student: def __init__(self, sid, name, score): self.sid sid # 学号 self.name name # 姓名 self.s…...
ecat总线6000段定义
1ecat总线 不适合新手学习,我复习用的。 can和ecat是一家的,就跟C和C的关系。 参考CIA402定义 2 PDOr⬇️ 主站发送到终端伺服。 有4组,0x1600 3 PDOt⬆️ 伺服驱动器发送到主站。 我记得有4组,但这款伺服只有2组。 4 速度模…...
数据管理能力成熟度评估模型(DCMM)全面解析:标准深度剖析与实践创新
文章目录 一、DCMM模型的战略价值与理论基础1.1 DCMM的本质与战略定位1.2 DCMM的理论基础与创新点 二、DCMM模型的系统解构与逻辑分析2.1 八大能力域的有机关联与系统架构2.2 五级成熟度模型的内在逻辑与演进规律 三、DCMM八大能力域的深度解析与实践创新3.1 数据战略ÿ…...
Python精进系列:random.uniform 函数的用法详解
目录 🔍 一、引言📌 二、函数定义与参数说明✅ 函数定义⚙️ 参数说明 🧪 三、使用示例1️⃣ 生成单个随机数2️⃣ 生成多个随机数3️⃣ 生成二维坐标 🎯 四、应用场景🧪 模拟实验📊 数据采样🎮…...
观察者模式(Observer Pattern)
🧠 观察者模式(Observer Pattern) 观察者模式是一种行为型设计模式。它定义了一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。通常用于事件驱动的编程场景中。 &am…...
【论文阅读】Joint Deep Modeling of Users and Items Using Reviews for Recommendation
Joint Deep Modeling of Users and Items Using Reviews for Recommendation 题目翻译:利用评论对用户和项目进行联合深度建模进行推荐 原文地址:点这里 关键词: DeepCoNN、推荐系统、卷积神经网络、评论建模、协同建模、评分预测、联合建模…...
webpack 的工作流程
Webpack 的工作流程可以分为以下几个核心步骤,我将结合代码示例详细说明每个阶段的工作原理: 1. 初始化配置 Webpack 首先会读取配置文件(默认 webpack.config.js),合并命令行参数和默认配置。 // webpack.config.js…...
Linux 常用指令详解
Linux 操作系统中有大量强大的命令行工具,下面我将分类介绍一些最常用的指令及其用法。 ## 文件与目录操作 ### 1. ls - 列出目录内容 ls [选项] [目录名] 常用选项: - -l:长格式显示(详细信息) - -a:显…...
DXFViewer进行中 : ->封装OpenGL -> 解析DXF直线
DXFViewer进行中,目标造一个dxf看图工具。. 目标1:封装OpenGL,实现正交相机及平移缩放功能 Application.h #pragma once #include <string> #include <glad/glad.h> #include <GLFW/glfw3.h> #include "../Core/TimeStamp.h" #includ…...
多序列比对软件MAFFT介绍
MAFFT(Multiple Alignment using Fast Fourier Transform)是一款广泛使用且高效的多序列比对软件,由日本京都大学的Katoh Kazutaka等人开发,最早发布于2002年,并持续迭代优化至今。 它支持从几十条到上万条核酸或蛋白质序列的快速比对,同时在准确率和计算效率之间提供灵…...
基于 HTML5 Canvas 实现图片旋转与下载功能
一、引言 在 Web 开发中,经常会遇到需要对图片进行处理并提供下载功能的需求。本文将深入剖析一段基于 HTML5 Canvas 的代码,该代码实现了图片的旋转(90 度和 180 度)以及旋转后图片的下载功能。通过对代码的解读,我们…...
学习路线(机器人系统)
机器人软件/系统学习路线(从初级到专家) 初级阶段(6-12个月)基础数学编程基础机器人基础概念推荐资源 中级阶段(1-2年)机器人运动学机器人动力学控制系统感知系统推荐资源 高级阶段(2-3年&#…...
基于EFISH-SCB-RK3576工控机/SAIL-RK3576核心板的网络安全防火墙技术方案(国产化替代J1900的全栈技术解析)
基于EFISH-SCB-RK3576/SAIL-RK3576的网络安全防火墙技术方案 (国产化替代J1900的全栈技术解析) 一、硬件架构设计 流量处理核心模块 多核异构架构: 四核Cortex-A72(2.3GHz):处理深度…...