Skip to content

Commit 51fc20c

Browse files
authored
Merge pull request #11 from Lean-zh/rex/update-tutorial
Update tutorial
2 parents 1249811 + 9677566 commit 51fc20c

File tree

2 files changed

+27
-44
lines changed

2 files changed

+27
-44
lines changed

docs/tutorial/repl.md

+24-40
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,27 @@
22

33
## 项目概要
44

5-
REPL (Read-Eval-Print Loop) 是一个交互式编程环境,它允许用户输入命令,执行并看到结果。Lean 4 REPL 基于 JSON 通信的交互式环境,它支持三种工作模式
5+
REPL (Read-Eval-Print Loop) 是一个交互式编程环境,允许用户输入命令,执行并查看结果。Lean 4 REPL 基于 JSON 通信,支持三种工作模式
66

77
### 命令模式 (Command Mode)
88

9-
在命令模式下,你可以发送完整的 Lean 命令(如声明、定义等)到 REPL。命令以 JSON 格式发送,可以选择性地指定环境
9+
在命令模式下,可以发送完整的 Lean 命令(如声明、定义等)到 REPL,比如
1010

1111
```json
1212
{ "cmd": "def f := 2" }
1313
```
1414

1515
### 文件模式 (File Mode)
1616

17-
文件模式是命令模式的一个简单封装,允许你直接读取和执行整个 Lean 文件的内容。例如:
17+
文件模式是命令模式的简单封装,允许直接读取和执行整个 Lean 文件的内容。例如:
1818

1919
```json
2020
{ "path": "test/file.lean", "allTactics": true }
2121
```
2222

2323
### 策略模式 (Tactic Mode)
2424

25-
策略模式允许你使用 Lean 的证明策略(tactics)来交互式地构建证明。这个模式通常从一个包含 `sorry` 的命令开始,然后逐步完成证明。
25+
策略模式允许使用 Lean 的证明策略(tactics)来交互式地构建证明。这个模式通常从一个包含 `sorry` 的命令开始,然后逐步完成证明。
2626

2727
## 安装与基本使用
2828

@@ -40,21 +40,25 @@ lake update -R && lake build
4040

4141
### 基本使用
4242

43-
REPL 通过标准输入输出流进行通信,并使用 JSON 格式:
43+
进入仓库,通过 `lake exe repl` 启动交互式终端,输入 JSON 块,获取相应的输出。
44+
45+
此外,也可以通过标准输入输出流进行通信,比如:
4446

4547
```bash
4648
echo '{ "cmd": "def f := 2" }' | lake exe repl
4749
```
4850

4951
## REPL 命令模式
5052

51-
下边,我们分别介绍 REPL 的这三种模式,以及 Pickle 特性。先从最基础的 **命令模式** 开始。
53+
下边,我们详细介绍 REPL 的三种模式,以及 Pickle 特性。先从最基础的 **命令模式** 开始。
5254

5355
### 状态跟踪
5456

55-
REPL 的命令模式通过 `env` 字段跟踪环境状态,每次执行 `cmd` 命令后会返回一个新的环境编号。这种机制允许我们:
56-
1. 在已有环境的基础上执行新命令
57-
2. 通过指定特定的 `env` 值回溯到之前的状态
57+
REPL 的命令模式通过 `env` 字段跟踪环境状态,每次执行 `cmd` 命令后会返回一个新的环境编号。这种机制有很多好处:
58+
59+
1. **状态追踪**:允许在一个交互终端中启用多个环境,比如 `import` 不同的模块,每个命令执行后都会生成新的环境编号
60+
2. **环境选择**:允许通过指定 `env` 值回溯到之前的状态,在该环境的基础上执行新命令
61+
3. **环境隔离**:不同环境的变量相互独立
5862

5963
### 示例解析
6064

@@ -77,28 +81,21 @@ REPL 的命令模式通过 `env` 字段跟踪环境状态,每次执行 `cmd`
7781
4. 基于 env 1 执行相同操作,并创建新环境 env 3
7882
5. 基于 env 2 重新定义 `f3`,报错:`'f3' has already been declared`,并创建新环境 env 4
7983

80-
### 特性概括
81-
82-
1. **状态追踪**:每个命令执行后都会生成新的环境编号
83-
2. **环境选择**:可以通过 `env` 字段选择在哪个环境基础上执行新命令
84-
3. **错误处理**:重复定义等错误会被捕获并返回错误信息
85-
4. **环境隔离**:不同环境之间的定义是独立的
8684

8785
## REPL 策略模式
8886

8987
策略模式(Tactic Mode)是 REPL 的核心功能,用于交互式证明构建。
9088

91-
### 工作流程
89+
策略模式有以下特性:
9290

93-
策略模式通过以下步骤展开:
94-
95-
1. 使用 `sorry` 创建证明占位符
96-
2. REPL 返回 `proofState` 标识证明状态
97-
3. 通过策略命令逐步完成证明
91+
1. **状态创建**:使用 `sorry` 创建证明占位符,
92+
2. **状态追踪**:通过 `proofState` 标识状态索引,每个 `sorry` 按顺序生成 `proofState`,策略作用也会产生新的证明状态
93+
3. **多目标处理**:支持 pick 指定目标来进行下一步证明
94+
4. **灵活性**:支持各种证明策略,包括 `have, calc` 等,且允许分步构建复杂证明
9895

9996
### 示例解析
10097

101-
为展示方便,我们将输出结果拼接到对应的输入行后边
98+
为展示方便,我们将输出结果拼接到对应输入行后边
10299

103100
```python
104101
# 步骤1:创建定理
@@ -158,13 +155,6 @@ REPL 的命令模式通过 `env` 字段跟踪环境状态,每次执行 `cmd`
158155
"goals": ["x : Int\nh : x = 1\n⊢ x = 1"]}
159156
```
160157

161-
### 特性概括
162-
163-
1. **状态追踪**:每个 `sorry` 按顺序生成 `proofState`,策略作用得到新的证明状态
164-
165-
2. **多目标处理**:支持 pick 指定目标来进行下一步证明
166-
167-
3. **灵活性**:支持各种证明策略,包括 `have, calc` 等,且允许分步构建复杂证明
168158

169159
## REPL 文件模式
170160

@@ -208,20 +198,15 @@ echo '{"cmd" : "def f : Nat := 37\\ndef g := 2\\ntheorem h : f + g = 39 := by ex
208198

209199
Pickle 特性允许我们将环境状态(env)或证明状态(proofState)保存到文件中,并在需要时重新加载。
210200

211-
### 使用场景
212-
213-
在 REPL 中,**每次输入命令都是作为独立的会话处理的**。这意味着:
214-
215-
1. 如果我们想在之前的工作基础上继续,需要重新执行所有命令
216-
2. 对于复杂的证明过程,重复执行可能会很耗时
217-
3. 在多机协作时,可能需要共享证明状态
201+
**使用场景**:REPL 是以 Json 数据形式交互的,如果我们想还原当前的证明状态或环境,需要重新执行所有命令。对于复杂的证明过程,重复执行会很耗时。此外,在多机协作时,我们也需要共享证明状态。
218202

219203
### Pickle 的基本操作
220204

221-
Pickle 支持两个基本操作
205+
Pickle 的基本操作
222206

223-
1. **保存状态**(pickleTo)
207+
1. **保存环境/状态**(pickleTo)
224208
2. **加载状态**(unpickleProofStateFrom)
209+
3. **加载环境**(unpickleEnvFrom)
225210

226211
### 示例分析
227212

@@ -247,7 +232,7 @@ Pickle 支持两个基本操作:
247232

248233
## 配置 Mathlib 依赖
249234

250-
REPL 本身不依赖 Mathlib,但在实际使用中可能需要处理依赖 Mathlib 的项目。以 Lean 4.14.0 版本为例,有两种配置方式
235+
REPL 本身不依赖 Mathlib,但我们可能需要处理包含 Mathlib 依赖的项目。以 Lean 4.14.0 版本为例,有两种解决方式
251236

252237
**方式一:直接添加 Mathlib 依赖**
253238

@@ -280,7 +265,6 @@ echo '{ "cmd": "import Mathlib" }' | lake exe repl
280265
echo '{ "cmd": "import Mathlib" }' | lake env /path/to/repl/.lake/build/bin/repl
281266
```
282267

283-
284268
## 更多示例
285269

286270
最后,附上 REPL 测试代码提供的示例,为展示方便,我们将输出结果拼接到对应的输入行后边。

mkdocs.yml

+3-4
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ nav:
7070
- 主页:
7171
- Lean-zh: index.md
7272
- 安装指南: install.md
73+
- 版本管理与包管理: tutorial/elan-lake.md
74+
- Lake 包管理: references/lake-doc.md
7375
- 交互工具:
7476
- LeanDojo 教程: tutorial/lean-dojo.md
7577
- REPL 教程: tutorial/repl.md
@@ -78,7 +80,4 @@ nav:
7880
- 项目教程:
7981
- Lean4web 在线编译器: tutorial/lean4web.md
8082
- jixia 数据分析: tutorial/jixia.md
81-
- Lean4Game 教程: tutorial/lean4game.md
82-
- 其他:
83-
- 版本管理与包管理: tutorial/elan-lake.md
84-
- Lake 包管理: references/lake-doc.md
83+
- Lean4Game 教程: tutorial/lean4game.md

0 commit comments

Comments
 (0)