2
2
3
3
## 项目概要
4
4
5
- REPL (Read-Eval-Print Loop) 是一个交互式编程环境,它允许用户输入命令,执行并看到结果 。Lean 4 REPL 基于 JSON 通信的交互式环境,它支持三种工作模式 。
5
+ REPL (Read-Eval-Print Loop) 是一个交互式编程环境,允许用户输入命令,执行并查看结果 。Lean 4 REPL 基于 JSON 通信,支持三种工作模式 。
6
6
7
7
### 命令模式 (Command Mode)
8
8
9
- 在命令模式下,你可以发送完整的 Lean 命令(如声明、定义等)到 REPL。命令以 JSON 格式发送,可以选择性地指定环境 :
9
+ 在命令模式下,可以发送完整的 Lean 命令(如声明、定义等)到 REPL,比如 :
10
10
11
11
``` json
12
12
{ "cmd" : " def f := 2" }
13
13
```
14
14
15
15
### 文件模式 (File Mode)
16
16
17
- 文件模式是命令模式的一个简单封装,允许你直接读取和执行整个 Lean 文件的内容。例如:
17
+ 文件模式是命令模式的简单封装,允许直接读取和执行整个 Lean 文件的内容。例如:
18
18
19
19
``` json
20
20
{ "path" : " test/file.lean" , "allTactics" : true }
21
21
```
22
22
23
23
### 策略模式 (Tactic Mode)
24
24
25
- 策略模式允许你使用 Lean 的证明策略(tactics)来交互式地构建证明。这个模式通常从一个包含 ` sorry ` 的命令开始,然后逐步完成证明。
25
+ 策略模式允许使用 Lean 的证明策略(tactics)来交互式地构建证明。这个模式通常从一个包含 ` sorry ` 的命令开始,然后逐步完成证明。
26
26
27
27
## 安装与基本使用
28
28
@@ -40,21 +40,25 @@ lake update -R && lake build
40
40
41
41
### 基本使用
42
42
43
- REPL 通过标准输入输出流进行通信,并使用 JSON 格式:
43
+ 进入仓库,通过 ` lake exe repl ` 启动交互式终端,输入 JSON 块,获取相应的输出。
44
+
45
+ 此外,也可以通过标准输入输出流进行通信,比如:
44
46
45
47
``` bash
46
48
echo ' { "cmd": "def f := 2" }' | lake exe repl
47
49
```
48
50
49
51
## REPL 命令模式
50
52
51
- 下边,我们分别介绍 REPL 的这三种模式 ,以及 Pickle 特性。先从最基础的 ** 命令模式** 开始。
53
+ 下边,我们详细介绍 REPL 的三种模式 ,以及 Pickle 特性。先从最基础的 ** 命令模式** 开始。
52
54
53
55
### 状态跟踪
54
56
55
- REPL 的命令模式通过 ` env ` 字段跟踪环境状态,每次执行 ` cmd ` 命令后会返回一个新的环境编号。这种机制允许我们:
56
- 1 . 在已有环境的基础上执行新命令
57
- 2 . 通过指定特定的 ` env ` 值回溯到之前的状态
57
+ REPL 的命令模式通过 ` env ` 字段跟踪环境状态,每次执行 ` cmd ` 命令后会返回一个新的环境编号。这种机制有很多好处:
58
+
59
+ 1 . ** 状态追踪** :允许在一个交互终端中启用多个环境,比如 ` import ` 不同的模块,每个命令执行后都会生成新的环境编号
60
+ 2 . ** 环境选择** :允许通过指定 ` env ` 值回溯到之前的状态,在该环境的基础上执行新命令
61
+ 3 . ** 环境隔离** :不同环境的变量相互独立
58
62
59
63
### 示例解析
60
64
@@ -77,28 +81,21 @@ REPL 的命令模式通过 `env` 字段跟踪环境状态,每次执行 `cmd`
77
81
4 . 基于 env 1 执行相同操作,并创建新环境 env 3
78
82
5 . 基于 env 2 重新定义 ` f3 ` ,报错:` 'f3' has already been declared ` ,并创建新环境 env 4
79
83
80
- ### 特性概括
81
-
82
- 1 . ** 状态追踪** :每个命令执行后都会生成新的环境编号
83
- 2 . ** 环境选择** :可以通过 ` env ` 字段选择在哪个环境基础上执行新命令
84
- 3 . ** 错误处理** :重复定义等错误会被捕获并返回错误信息
85
- 4 . ** 环境隔离** :不同环境之间的定义是独立的
86
84
87
85
## REPL 策略模式
88
86
89
87
策略模式(Tactic Mode)是 REPL 的核心功能,用于交互式证明构建。
90
88
91
- ### 工作流程
89
+ 策略模式有以下特性:
92
90
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 ` 等,且允许分步构建复杂证明
98
95
99
96
### 示例解析
100
97
101
- 为展示方便,我们将输出结果拼接到对应的输入行后边 :
98
+ 为展示方便,我们将输出结果拼接到对应输入行后边 :
102
99
103
100
``` python
104
101
# 步骤1:创建定理
@@ -158,13 +155,6 @@ REPL 的命令模式通过 `env` 字段跟踪环境状态,每次执行 `cmd`
158
155
" goals" : [" x : Int\n h : x = 1\n ⊢ x = 1" ]}
159
156
```
160
157
161
- ### 特性概括
162
-
163
- 1 . ** 状态追踪** :每个 ` sorry ` 按顺序生成 ` proofState ` ,策略作用得到新的证明状态
164
-
165
- 2 . ** 多目标处理** :支持 pick 指定目标来进行下一步证明
166
-
167
- 3 . ** 灵活性** :支持各种证明策略,包括 ` have, calc ` 等,且允许分步构建复杂证明
168
158
169
159
## REPL 文件模式
170
160
@@ -208,20 +198,15 @@ echo '{"cmd" : "def f : Nat := 37\\ndef g := 2\\ntheorem h : f + g = 39 := by ex
208
198
209
199
Pickle 特性允许我们将环境状态(env)或证明状态(proofState)保存到文件中,并在需要时重新加载。
210
200
211
- ### 使用场景
212
-
213
- 在 REPL 中,** 每次输入命令都是作为独立的会话处理的** 。这意味着:
214
-
215
- 1 . 如果我们想在之前的工作基础上继续,需要重新执行所有命令
216
- 2 . 对于复杂的证明过程,重复执行可能会很耗时
217
- 3 . 在多机协作时,可能需要共享证明状态
201
+ ** 使用场景** :REPL 是以 Json 数据形式交互的,如果我们想还原当前的证明状态或环境,需要重新执行所有命令。对于复杂的证明过程,重复执行会很耗时。此外,在多机协作时,我们也需要共享证明状态。
218
202
219
203
### Pickle 的基本操作
220
204
221
- Pickle 支持两个基本操作 :
205
+ Pickle 的基本操作 :
222
206
223
- 1 . ** 保存状态 ** (pickleTo)
207
+ 1 . ** 保存环境/状态 ** (pickleTo)
224
208
2 . ** 加载状态** (unpickleProofStateFrom)
209
+ 3 . ** 加载环境** (unpickleEnvFrom)
225
210
226
211
### 示例分析
227
212
@@ -247,7 +232,7 @@ Pickle 支持两个基本操作:
247
232
248
233
## 配置 Mathlib 依赖
249
234
250
- REPL 本身不依赖 Mathlib,但在实际使用中可能需要处理依赖 Mathlib 的项目 。以 Lean 4.14.0 版本为例,有两种配置方式 :
235
+ REPL 本身不依赖 Mathlib,但我们可能需要处理包含 Mathlib 依赖的项目 。以 Lean 4.14.0 版本为例,有两种解决方式 :
251
236
252
237
** 方式一:直接添加 Mathlib 依赖**
253
238
@@ -280,7 +265,6 @@ echo '{ "cmd": "import Mathlib" }' | lake exe repl
280
265
echo ' { "cmd": "import Mathlib" }' | lake env /path/to/repl/.lake/build/bin/repl
281
266
```
282
267
283
-
284
268
## 更多示例
285
269
286
270
最后,附上 REPL 测试代码提供的示例,为展示方便,我们将输出结果拼接到对应的输入行后边。
0 commit comments