From 0dd1a45f70b6e137b30166f8b26da1f3cf1eb36b Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 30 Jan 2025 04:48:55 +0000
Subject: [PATCH] Deployed 03a1f58 to dev with MkDocs 1.6.1 and mike 2.1.3
---
dev/search/search_index.json | 2 +-
dev/tutorial/elan-lake/index.html | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/dev/search/search_index.json b/dev/search/search_index.json
index fd0efef..2026874 100644
--- a/dev/search/search_index.json
+++ b/dev/search/search_index.json
@@ -1 +1 @@
-{"config":{"lang":["zh"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Lean \u4e2d\u6587\u6587\u6863","text":""},{"location":"#lean_1","title":"Lean \u662f\u4ec0\u4e48","text":"
Lean \u662f\u5fae\u8f6f\u7814\u7a76\u9662\u5728 2013 \u5e74\u63a8\u51fa\u7684\u8ba1\u7b97\u673a\u5b9a\u7406\u8bc1\u660e\u5668\u3002Lean4 \u4e8e 2021 \u5e74\u53d1\u5e03\uff0c\u4e3a Lean \u5b9a\u7406\u8bc1\u660e\u5668\u7684\u91cd\u65b0\u5b9e\u73b0\uff0c\u80fd\u591f\u751f\u6210 C \u4ee3\u7801\u540e\u8fdb\u884c\u7f16\u8bd1\uff0c\u4ee5\u4fbf\u5f00\u53d1\u9ad8\u6548\u7684\u7279\u5b9a\u9886\u57df\u81ea\u52a8\u5316\u3002
Lean \u4f5c\u4e3a\u4e00\u95e8\u72ec\u7279\u7684\u8bed\u8a00\uff0c\u517c\u5177 \u6570\u5b66\u548c\u7f16\u7a0b \u4e24\u65b9\u9762\u7684\u7279\u6027\u3002
\u4f5c\u4e3a\u4ea4\u4e92\u5f0f\u5b9a\u7406\u8bc1\u660e\u5668\uff0cLean \u63d0\u4f9b\u4e86\u4e25\u683c\u7684\u903b\u8f91\u6846\u67b6\uff0c\u6570\u5b66\u5bb6\u53ef\u4ee5\u5c06\u6570\u5b66\u5b9a\u7406\u8f6c\u6362\u6210\u4ee3\u7801\uff0c\u5e76\u4e25\u683c\u9a8c\u8bc1\u8fd9\u4e9b\u5b9a\u7406\u7684\u6b63\u786e\u6027\u3002 \u4f5c\u4e3a\u901a\u7528\u51fd\u6570\u5f0f\u7f16\u7a0b\u8bed\u8a00\uff0c\u5b83\u5177\u6709 \u4f9d\u8d56\u7c7b\u578b \u7684 \u4e25\u683c \u7684 \u7eaf\u51fd\u6570\u5f0f \u8bed\u8a00\u6027\u8d28\u3002 \u8fd9\u4e9b\u7279\u6027\u8ba9 Lean \u5728\u6570\u5b66\u548c\u8ba1\u7b97\u673a\u79d1\u5b66\u7814\u7a76\u4e2d\u975e\u5e38\u6709\u7528\uff0c\u5b83\u53ef\u4ee5\u5e2e\u52a9\u7814\u7a76\u4eba\u5458\u53d1\u73b0\u5e76\u7ea0\u6b63\u6982\u5ff5\u4e0a\u7684\u9519\u8bef\uff0c\u540c\u65f6\u52a0\u6df1\u4ed6\u4eec\u5bf9\u7814\u7a76\u5bf9\u8c61\u7684\u7406\u89e3\u3002Lean \u7684\u6807\u51c6\u5e93 mathlib \u88ab\u79f0\u4e3a\u672a\u6765\u7684\u6570\u5b66\u56fe\u4e66\u9986\u3002
"},{"location":"#lean-zh","title":"\u5173\u4e8e Lean-zh","text":"Lean-zh \u662f\u4e00\u4e2a\u81ea\u53d1\u7ec4\u6210\u7684\u56e2\u4f53\uff0c\u65e8\u5728\u63a8\u52a8 Lean \u5728\u4e2d\u6587\u5b66\u672f\u548c\u7f16\u7a0b\u793e\u533a\u7684\u666e\u53ca\u548c\u5e94\u7528\u3002
Lean-zh \u63d0\u4f9b\u4e86\u4e00\u4e2a\u5b66\u4e60\u4e0e\u5b9e\u8df5\u7684\u5e73\u53f0\uff0c\u5982\u679c\u4f60\u5bf9 Lean \u611f\u5174\u8da3\uff0c\u65e0\u8bba\u662f\u53c2\u4e0e\u7f16\u5199 Lean \u6559\u7a0b\u3001\u7ffb\u8bd1\u5b98\u65b9\u6587\u6863\u3001\u5f00\u53d1 Lean \u9879\u76ee\uff0c\u8fd8\u662f\u4ee5\u5176\u4ed6\u65b9\u5f0f\u8d21\u732e\u529b\u91cf\uff0c\u6b22\u8fce\u4f60\u7684\u52a0\u5165\uff01
"},{"location":"#_1","title":"\u5feb\u901f\u4e0a\u624b","text":"\u5b66\u4e60 Lean \u7684\u6559\u7a0b\u548c\u9014\u5f84\u5f88\u591a\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u4e2a\u4eba\u7684\u77e5\u8bc6\u80cc\u666f\u548c\u504f\u597d\u3002\u8fd9\u4e9b\u6559\u7a0b\u6709\u504f\u6570\u5b66\u7684\u4e5f\u6709\u504f\u7f16\u7a0b\u7684\u3002
\u6570\u5b66\u65b9\u9762\uff1a
\u81ea\u7136\u6570\u6e38\u620f NNG4\uff1a\u5728\u7ebf\u4ea4\u4e92\u5f0f Lean \u6559\u7a0b\uff0c\u91cd\u70b9\u5728\u8bc1\u660e\u81ea\u7136\u6570\u57fa\u672c\u8fd0\u7b97\u7684\u5c5e\u6027\u3002\u6b64\u5916\uff0cLean Game Server \u6258\u7ba1\u5404\u79cd\u5b66\u4e60\u6e38\u620f\uff0c\u5305\u62ec\u96c6\u5408\u8bba\u3001\u903b\u8f91\u548c Robo\uff08\u4e00\u4e2a\u5173\u4e8e\u672c\u79d1\u6570\u5b66\u7684\u6545\u4e8b\uff09\u7b49\u3002 \u5feb\u901f\u4e0a\u624b\u7684 Lean \u521d\u63a2\u6559\u7a0b\uff1a\u6db5\u76d6\u4f7f\u7528 Lean \u8bc1\u660e\u7684\u4e00\u4e9b\u57fa\u672c\u6982\u5ff5\uff0c\u4e5f\u5305\u62ec\u521d\u7ea7\u5206\u6790\u3001\u521d\u7b49\u6570\u8bba\u548c\u6570\u7406\u903b\u8f91\u7684\u72ec\u7acb\u4e3b\u9898\u3002 \u7f16\u7a0b\u65b9\u9762\uff1a\u53ef\u4ee5\u6d4f\u89c8\u7f51\u7ad9\u9876\u90e8\u7684\u5176\u4ed6\u6807\u7b7e\uff0c\u5305\u62ec\u4e0e Lean \u4ea4\u4e92\u7684\u5e38\u7528\u7f16\u7a0b\u5de5\u5177\u548c Lean \u9879\u76ee\u6559\u7a0b\u7b49\uff0c\u6559\u7a0b\u5e72\u8d27\u6b63\u5728\u8def\u4e0a\u3002\u3002\u3002
"},{"location":"#lean-zh_1","title":"Lean-zh \u8bd1\u5236","text":"\u76ee\u524d Lean-zh \u5df2\u7ffb\u8bd1\u7684\u8d44\u6e90\uff1a
Lean4 \u51fd\u6570\u5f0f\u7f16\u7a0b\uff08Functional Programming in Lean\uff09 Lean4 \u5b9a\u7406\u8bc1\u660e\uff08Theorem Proving in Lean\uff09 Lean4 \u5143\u7f16\u7a0b\uff08Metaprogramming in Lean\uff09 \u8fdb\u884c\u4e2d
Lean \u5f62\u5f0f\u5316\u6570\u5b66(Mathematics in Lean) Lean \u4ea4\u4e92\u5de5\u5177\u7684\u4f7f\u7528\u6559\u7a0b Lean \u9879\u76ee\u7684\u5b9e\u8df5\u6559\u7a0b \u8ba1\u5212\u8fdb\u884c
GlimpseToGame \u5b9a\u7406\u8bc1\u660e\u6e38\u620f\u5236\u4f5c\u53ca\u7ffb\u8bd1 Tactic \u624b\u518c\u53ca\u5982\u4f55\u7f16\u5199 tactic LeanCopliot\uff0cLLMStep \u7b49\u5b9e\u7528\u5de5\u5177\u6559\u7a0b\u53ca\u5b9e\u73b0\u673a\u5236 ... "},{"location":"#_2","title":"\u8054\u7cfb\u6211\u4eec","text":"\u5982\u679c\u6709\u4efb\u4f55\u95ee\u9898\u3001\u5efa\u8bae\u6216\u60f3\u53c2\u4e0e\u5230\u793e\u533a\u4e2d\u6765\uff0c\u6b22\u8fce\u52a0\u5165 QQ \u7fa4 897971266 \u6216 Telegram \u8ba8\u8bba\u7ec4 \u6765\u4e00\u8d77\u4ea4\u6d41\u3002
"},{"location":"#_3","title":"\u5176\u4ed6\u8d44\u6e90","text":"\u6570\u5b66\u5bfc\u5411\uff1a
\u7ecf\u5178\u6559\u6750 Mathematics in Lean \u8282\u594f\u66f4\u7f13\u7684 The Mechanics of Proof \u4ece\u7c7b\u578b\u8bba\u57fa\u7840\u51fa\u53d1\u7684 Theorem Proving in Lean \u8ba1\u7b97\u673a\u5bfc\u5411\uff1a
\u4fa7\u91cd\u5c06 Lean \u4f5c\u4e3a\u7f16\u7a0b\u8bed\u8a00\u7684 Functional Programming in Lean \u4fa7\u91cd\u5143\u7f16\u7a0b\u7b56\u7565\u7f16\u5199\u7684 Metaprogramming in Lean \u66f4\u5173\u6ce8 LEAN \u672c\u8eab\u800c\u4e0d\u4ec5\u662f\u4f7f\u7528\u7684 Reference manual \u8ba1\u7b97\u673a\u79d1\u5b66\u89d2\u5ea6\u7684 The Hitchhiker's Guide to Logical Verification \u5176\u4ed6\u63a8\u8350\uff1a
\u8f6f\u4ef6\u57fa\u7840\uff1aSoftware Foundations \u7f16\u7a0b\u8bed\u8a00\u57fa\u7840\uff1aAgda \u63cf\u8ff0 "},{"location":"install/","title":"LEAN 4 \u5b89\u88c5\u6559\u7a0b","text":"Lean \u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u5b9a\u7406\u8bc1\u660e\u52a9\u624b\u548c\u51fd\u6570\u5f0f\u7f16\u7a0b\u8bed\u8a00\uff0c\u7531\u5fae\u8f6f\u7814\u7a76\u9662\u5f00\u53d1\u3002\u5b83\u65e2\u53ef\u4ee5\u7528\u4e8e\u5f62\u5f0f\u5316\u6570\u5b66\u8bc1\u660e\uff0c\u4e5f\u53ef\u4ee5\u7528\u4e8e\u901a\u7528\u7a0b\u5e8f\u8bbe\u8ba1\u3002
"},{"location":"install/#lean-4_1","title":"Lean 4 \u5de5\u5177\u94fe","text":"Lean 4 \u7684\u5b8c\u6574\u5f00\u53d1\u73af\u5883\u7531\u4ee5\u4e0b\u6838\u5fc3\u7ec4\u4ef6\u6784\u6210\uff1a
elan\uff1aLean \u7684\u7248\u672c\u7ba1\u7406\u5de5\u5177\uff0c\u7528\u4e8e\u5b89\u88c5\u3001\u7ba1\u7406\u548c\u5207\u6362\u4e0d\u540c\u7248\u672c\u7684 Lean\uff0c\u7c7b\u4f3c\u4e8e Rust \u7684 rustup
\u6216 Node.js \u7684 nvm
\u3002 lake\uff08Lean Make\uff09\uff1aLean \u7684\u5305\u7ba1\u7406\u5668\u548c\u6784\u5efa\u5668\uff0c\u5df2\u96c6\u6210\u5230 Lean 4 \u6838\u5fc3\u4ed3\u5e93\u4e2d\u3002\u7528\u4e8e\u521b\u5efa Lean \u9879\u76ee\uff0c\u6784\u5efa Lean \u5305,\u7f16\u8bd1 Lean \u53ef\u6267\u884c\u6587\u4ef6\u7b49\u3002 lean\uff1a\u8bed\u8a00\u672c\u8eab\u7684\u6838\u5fc3\u7ec4\u4ef6\uff0c\u8d1f\u8d23\u5b9e\u9645\u7684\u4ee3\u7801\u7f16\u8bd1\u548c\u8bed\u8a00\u670d\u52a1\u5668\u534f\u8bae\uff08LSP\uff09\u652f\u6301\uff0c\u7528\u6237\u4e0d\u9700\u8981\u76f4\u63a5\u4e0e lean
\u4ea4\u4e92\u3002 \u6b64\u5916\uff0c\u8fd8\u6709 Lean \u7684\u6807\u51c6\u6570\u5b66\u5e93 Mathlib\uff0c\u5305\u542b\u5927\u91cf\u6570\u5b66\u5b9a\u4e49\u548c\u5b9a\u7406\uff0c\u4ee5\u53ca\u5b9e\u7528\u7684\u8bc1\u660e\u5de5\u5177\u548c\u7b56\u7565\u3002
\u4e3a\u4e86\u4f7f\u7528 Lean\uff0c\u9700\u8981\u5148\u5b89\u88c5 VS Code \u548c Git\uff0c\u7136\u540e\u5b89\u88c5 elan\u3002\u518d\u901a\u8fc7 elan \u5b89\u88c5\u5404\u4e2a Lean4 \u7248\u672c\u4ee5\u53ca lake \u5305\u7ba1\u7406\u5668\uff0c\u63a5\u4e0b\u6765\u5c31\u53ef\u4ee5\u4f7f\u7528 lake \u521b\u5efa\u81ea\u5df1\u7684 Lean \u9879\u76ee\u3002\u5de5\u5177\u94fe\u7684\u7528\u6cd5\u793a\u4f8b\u53c2\u89c1 Lean \u5de5\u5177\u94fe \u4e00\u8282\u6216 lake \u6587\u6863\u3002
\u5982\u679c\u5e0c\u671b\u5feb\u901f\u4e86\u89e3\u548c\u4f7f\u7528 Lean\uff0c\u9664\u4e86\u5728\u672c\u5730\u5b89\u88c5\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee live.lean-lang.org \u6216 live.leanprover.cn \u5728\u7ebf\u4f53\u9a8c\u3002
"},{"location":"install/#linux-elan","title":"Linux \u5b89\u88c5 elan","text":"\u5982\u679c\u6ca1\u6709\u7f51\u7edc\u95ee\u9898\uff0c\u7528\u4e00\u884c\u547d\u4ee4\u5b89\u88c5\uff1a
wget -q https://raw.githubusercontent.com/leanprover-community/mathlib4/master/scripts/install_debian.sh && bash install_debian.sh ; rm -f install_debian.sh && source ~/.profile\n
\u811a\u672c\u5185\u5bb9\u5305\u62ec\uff1a\u68c0\u67e5\u5e76\u5b89\u88c5 VsCode\uff0cLean \u63d2\u4ef6\uff0c\u5e76\u5b89\u88c5 elan\u3002
\u5982\u679c\u8bbf\u95ee GitHub \u5b58\u5728\u95ee\u9898\uff0c\u53ef\u4ee5\u5728\u5b89\u88c5 vscode \u540e\uff0c\u624b\u52a8\u5b89\u88c5 elan\u3002
\u5177\u4f53\u5730\uff0c\u5728 GitHub release \u9875\u9762\u6216\u8005 \u4e0a\u4ea4\u955c\u50cf\u6e90 \uff0c\u6839\u636e\u7cfb\u7edf\u7248\u672c\u4e0b\u8f7d elan\u3002
\u6bd4\u5982\u4e0b\u8f7d linux-x86_64
\u7cfb\u7edf\u7684 elan \u5de5\u5177\uff1a
# \u5982\u679c\u7f51\u7edc\u4e0d\u884c\u5c31\u672c\u5730\u4e0b\u8f7d\u518d\u4e0a\u4f20\ncurl -L https://github.com/leanprover/elan/releases/download/v3.1.1/elan-x86_64-unknown-linux-gnu.tar.gz -o elan.tar.gz\ntar xf elan.tar.gz\n
\u89e3\u538b\u5f97\u5230 elan-init
\u6587\u4ef6\uff0c\u8d4b\u4e88\u53ef\u6267\u884c\u6743\u9650\u5e76\u6267\u884c\u5b89\u88c5\uff1a
chmod +x elan-init\n./elan-init -y --default-toolchain none\n
\u9ed8\u8ba4\u5b89\u88c5\u6700\u65b0\u7248\u672c\u7684 Lean\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u53c2\u6570\u6307\u5b9a\u7248\u672c\uff0c\u6216\u7565\u8fc7\u5177\u4f53 Lean \u7248\u672c\u7684\u5b89\u88c5\u3002
\u5b8c\u6210\u540e\uff0c\u5728 .bashrc
\u6216 .zshrc
\u4e2d\u4fee\u6539\u73af\u5883\u53d8\u91cf\uff1a
export PATH=\"$HOME/.elan/bin:$PATH\"\n
\u91cd\u542f\u7ec8\u7aef\uff0c\u68c0\u67e5 elan
\u7248\u672c\u548c\u9ed8\u8ba4\u5b89\u88c5\u7684 Lean \u7248\u672c\uff1a
\u276f elan -V\nelan 3.1.1 (71ddc6633 2024-02-22)\n\u276f elan show\nstable (default)\nLean (version 4.7.0, x86_64-unknown-linux-gnu, commit 6fce8f7d5cd1, Release)\n
"},{"location":"install/#windows-elan","title":"Windows \u5b89\u88c5 elan","text":"\u5148\u5728\u8fd9\u91cc\u4e0b\u8f7d\u5b89\u88c5 VS Code \u548c Git\u3002
\u5b89\u88c5 VS Code \u540e\uff0c\u9700\u8981\u5b89\u88c5 lean4 \u6269\u5c55\uff08extension\uff09\u3002\u5982\u679c\u7f51\u7edc\u73af\u5883\u987a\u7545\uff0c\u53ef\u4ee5\u5728 lean4 \u6269\u5c55\u7684\u6b22\u8fce\u9875\u9009\u62e9 Get Start \u6765\u5b8c\u6210\u5b89\u88c5\uff0c\u6216\u8005\u521b\u5efa\u7a7a\u7684 Lean \u6587\u4ef6\u65f6\u6269\u5c55\u4f1a\u5f39\u51fa\u63d0\u793a\u63d0\u9192\u4f60\u5b89\u88c5 elan \u548c Lean 4\u3002 \u9664\u4e86\u8fd9\u79cd\u65b9\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u5728 cmd \u6216 powershell \u4e2d\u8fd0\u884c\u547d\u4ee4
curl -O --location https://raw.githubusercontent.com/leanprover/elan/master/elan-init.ps1\npowershell -ExecutionPolicy Bypass -f elan-init.ps1\ndel elan-init.ps1\n
\u5982\u679c\u9047\u5230\u4e86 \"SSL connect error\", \"Timeout was reached\",\"Failed to connect to github.com port 443\"...
\u7b49\u9519\u8bef\uff0c\u5c31\u662f\u8bf4\u660e\u4f60\u7684\u7f51\u7edc\u73af\u5883\u4e0d\u7406\u60f3\u3002\u5982\u679c\u8fd9\u6837\u53ef\u4ee5\u901a\u8fc7\u4e0a\u4ea4\u955c\u50cf\u6e90\u4e0b\u8f7d\u5b89\u88c5\u3002\u4e0b\u9762\u6f14\u793a\u5728\u7f51\u7edc\u73af\u5883\u4e0d\u7406\u60f3\u7684\u6761\u4ef6\u4e0b\u7684\u5b89\u88c5\u3002
\u6253\u5f00 cmd \u6216 Powershell\uff0c\u8fd0\u884c
curl -O --location https://s3.jcloud.sjtu.edu.cn/899a892efef34b1b944a19981040f55b-oss01/elan/elan/releases/download/v4.0.0-rc1/elan-x86_64-pc-windows-msvc.zip\nunzip -o elan-x86_64-pc-windows-msvc.zip\n.\\elan-init.exe\n
\u4f1a\u5728\u7ec8\u7aef\u4e2d\u5f00\u59cb\u5b89\u88c5\u7a0b\u5e8f\u3002\u5355\u51fb\u56de\u8f66\u5728\u9ed8\u8ba4\u4f4d\u7f6e ~\\.elan
\u5b89\u88c5\u3002 \u5b89\u88c5\u5b8c\u6210\u540e\u53ef\u4ee5\u5220\u9664\u521a\u521a\u4e0b\u8f7d\u7684\u4e34\u65f6\u6587\u4ef6\uff1a
del elan-init.exe\ndel elan-x86_64-pc-windows-msvc.zip\n
\u6dfb\u52a0 elan \u7684\u5b89\u88c5\u5730\u5740\u5230 PATH \u73af\u5883\u53d8\u91cf\uff08\u5982\u679c\u662f\u9ed8\u8ba4\u5b89\u88c5\uff0c\u90a3\u4e48\u662f %USERPROFILE%\\.elan\\bin
\uff09\u3002
\u91cd\u542f\u7ec8\u7aef\u8f93\u5165 elan --version
\uff0c\u5982\u679c\u80fd\u6b63\u5e38\u8f93\u51fa\u7248\u672c\u53f7\uff0c\u90a3\u4e48\u4f60\u5df2\u7ecf\u88c5\u597d\u4e86 elan \u548c Lean 4 stable \u7248\u672c\u3002
"},{"location":"install/#mac-elan","title":"Mac \u5b89\u88c5 elan","text":"\u548c ubuntu \u7cfb\u7edf\u7c7b\u4f3c\uff0c\u7528\u811a\u672c\u4e00\u952e\u5b89\u88c5\uff1a
/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/leanprover-community/mathlib4/master/scripts/install_macos.sh)\" && source ~/.profile\n
\u6216\u8005\u5728 GitHub release \u9875\u9762 \u6216 \u4e0a\u4ea4\u955c\u50cf\u6e90 \u624b\u52a8\u4e0b\u8f7d\u8fd0\u884c\u5b89\u88c5\u7a0b\u5e8f\u3002
\u6b64\u5916\uff0c\u4e0d\u9f13\u52b1\u4f7f\u7528 homebrew \u5b89\u88c5 elan-init \u5305\uff0c\u8fd9\u53ef\u80fd\u4f1a\u843d\u540e\u4e8e\u5b98\u65b9\u7248\u672c\u7684\u66f4\u65b0\u3002
"},{"location":"contribute/project/","title":"\u9879\u76ee\u6559\u7a0b","text":"TODO
"},{"location":"contribute/translation/","title":"\u6587\u6863\u7ffb\u8bd1","text":"TODO
"},{"location":"projects/blueprints/","title":"Lean Bleu Print","text":"\u9879\u76ee\u5730\u5740\uff1ahttps://github.com/PatrickMassot/leanblueprint
"},{"location":"projects/jixia/","title":"jixia \u6570\u636e\u5206\u6790 | TODO","text":"jixia \u662f\u4e00\u4e2a\u4e3a Lean 4 \u8bbe\u8ba1\u7684\u65b0\u9759\u6001\u5206\u6790\u5de5\u5177\uff0c\u5176\u65e8\u5728\u652f\u6301\u6784\u5efa\u5177\u6709 Lean \u611f\u77e5\u80fd\u529b\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff08IDE\uff09\uff0c\u5e76\u4e3a\u673a\u5668\u5b66\u4e60\u63d0\u53d6\u6709\u7528\u7684\u6570\u636e\u3002\u8be5\u9879\u76ee\u662f\u5317\u4eac\u5927\u5b66\u6570\u5b66\u79d1\u5b66\u5b66\u9662\uff08BICMR\uff09\u4eba\u5de5\u667a\u80fd\u4e0e\u6570\u5b66\u7a0b\u5e8f\u9879\u76ee\u7684\u4e00\u90e8\u5206\u3002\"jixia\" \u8fd9\u4e2a\u540d\u5b57\u6765\u6e90\u4e8e\u5386\u53f2\u4e0a\u7684\u201c\u7a37\u4e0b\u5b66\u5bab\u201d\uff0c\u4f4d\u4e8e\u73b0\u5728\u7684\u5c71\u4e1c\u6dc4\u535a\u3002
\u5de5\u5177\u7279\u70b9\uff1a
\u975e\u4fb5\u5165\u6027\uff1a\u65e0\u9700\u5bf9\u76ee\u6807\u6587\u4ef6\u8fdb\u884c\u4efb\u4f55\u4fee\u6539\uff0c\u8fd9\u6709\u5229\u4e8e\u63d0\u9ad8\u7f13\u5b58\u5229\u7528\u7387\uff0c\u7279\u522b\u662f\u5728 mathlib4 \u4e0a\u3002 \u5355\u6587\u4ef6\u5206\u6790\u3002 \u6e90\u7801\u7ea7\u4fe1\u606f\uff1a\u5305\u542b\u6bcf\u4e2a\u5b9a\u4e49\u51fd\u6570\u7684\u6e90\u7801\u8303\u56f4\u3001\u53c2\u6570\u548c\u8fd4\u56de\u7c7b\u578b\u7b49\u4fe1\u606f\u3002 \u6613\u4e8e\u6269\u5c55\uff1ajixia \u7684\u57fa\u4e8e\u63d2\u4ef6\u7684\u8bbe\u8ba1\u4f7f\u5f97\u6613\u4e8e\u6269\u5c55\uff0c\u540c\u65f6\u4fdd\u6301\u4e86\u4e0a\u8ff0\u6240\u6709\u4f18\u70b9\u3002 "},{"location":"projects/jixia/#_1","title":"\u4f7f\u7528\u65b9\u5f0f","text":"\u4e0b\u8f7d\u4ed3\u5e93\u5e76\u6784\u5efa\uff1a
git clone https://github.com/frenzymath/jixia\ncd jixia\nlake update && lake build\n
\u67e5\u770b\u5e2e\u52a9\uff1a
\u276f lake exe jixia --help \njixia\nA static analysis tool for Lean 4.\n\nUSAGE:\n jixia [FLAGS] <file>\n\nFLAGS:\n -h, --help Prints this message.\n -m, --import : String Import info\n -d, --declaration : String Declaration info\n -s, --symbol : String Symbol info\n -e, --elaboration : String Elaboration info\n -l, --line : String Line info\n -a, --ast : String AST\n -i, --initializer Execute initializers\n\nARGS:\n file : String File to process\n
jixia \u652f\u6301\u591a\u4e2a\u53c2\u6570\uff0c\u5305\u62ec\uff1a - Import
\uff1a\u5bfc\u5165\u6a21\u5757\u5217\u8868\u3002 - Declaration
\uff1a\u6bcf\u4e2a\u58f0\u660e\uff08def
\u3001theorem
\u3001inductive
\u7b49\uff09\u7684\u6e90\u7801\u7ea7\u4fe1\u606f\u3002 - Symbol
\uff1a\u7cbe\u7ec6\u5316\u540e\u7684\u7b26\u53f7\u4fe1\u606f\uff08\u6216 Lean 4 \u672f\u8bed\u4e2d\u7684 \u5e38\u6570\uff09\uff0c\u5305\u62ec\u5b83\u4eec\u7684\u7c7b\u578b\u548c\u5f15\u7528\u56fe\u3002 - Elaboration
\uff1a\u5173\u4e8e\u7cbe\u7ec6\u5316\u8fc7\u7a0b\u7684\u4fe1\u606f\uff0c\u5305\u62ec\u7b56\u7565\u4fe1\u606f\u3002 - Line
\uff1a\u6bcf\u884c\u5f00\u59cb\u65f6\u7684\u8bc1\u660e\u72b6\u6001\uff0c\u5982\u5728 VSCode \u7684 infoview \u4e2d\u663e\u793a\u3002 - AST
\uff1a\u89e3\u6790\u547d\u4ee4\u7684\u5b8c\u6574\u8f6c\u50a8\u3002
"},{"location":"projects/jixia/#_2","title":"\u4f7f\u7528\u793a\u4f8b","text":"\u65b0\u5efa Lean \u6587\u4ef6\uff0c\u6bd4\u5982 test.lean
import Init\n\nexample : \u2200 (p q: Prop), p \u2228 q \u2192 q \u2228 p := by\n intro p q h\n -- Here are some comments\n cases h\n . apply Or.inr\n assumption\n . apply Or.inl\n assumption\n
\u8fd0\u884c\u547d\u4ee4\uff1a
lake exe jixia -d test.decl.json -s test.sym.json -e test.elab.json -l test.lines.json test.lean\n
"},{"location":"projects/jixia/#_3","title":"\u53c2\u6570\u4ecb\u7ecd","text":"TODO\u3002
"},{"location":"projects/lean4game/","title":"Lean4Game \u6559\u7a0b","text":""},{"location":"projects/lean4game/#_1","title":"\u5f15\u8a00","text":"\u672c\u7bc7\u4ecb\u7ecd\u5982\u4f55\u7528 Lean4Game \u6dfb\u52a0 Lean4 \u6e38\u620f\u3002\u8fd9\u7c7b\u4e92\u52a8\u6e38\u620f\u4e0d\u4ec5\u5229\u4e8e Lean \u672c\u8eab\u7684\u5b66\u4e60\uff0c\u8fd8\u80fd\u4fc3\u8fdb\u5bf9\u5b66\u79d1\u77e5\u8bc6\u7684\u7406\u89e3\uff0c\u8ba9\u5173\u8054\u7684\u5b66\u79d1\u7fa4\u4f53\u5bf9 Lean \u6709\u66f4\u76f4\u89c2\u7684\u8ba4\u8bc6\u3002
\u5f53\u524d\u90e8\u7f72\u4e86 NNG4 \u6e38\u620f\uff1anng4.leanprover.cn \uff0c\u53ef\u5728\u7ebf\u4f53\u9a8c\uff0c\u540e\u7eed\u8ba1\u5212\u5199\u4e00\u4e2a\u674e\u4ee3\u6570\u5165\u95e8\u7684\uff08mark \u5f00\u5751\uff09\u3002
"},{"location":"projects/lean4game/#_2","title":"\u76f8\u5173\u9879\u76ee\u4e0e\u8d44\u6e90","text":"\u6559\u7a0b\u6d89\u53ca\u7684\u9879\u76ee\u548c\u8d44\u6e90\u94fe\u63a5\uff1a
lean4game\uff1aLEAN \u793e\u533a\u9a71\u52a8\u7684\u9879\u76ee\uff0c\u7528\u4e8e\u5f00\u53d1 Lean4 \u6e38\u620f\uff08GitHub \u4ed3\u5e93\uff09\u3002 GameSkeleton\uff1aLean4 \u6e38\u620f\u7684\u6a21\u677f\u4ee3\u7801\uff08GitHub \u4ed3\u5e93\uff09\u3002 NNG4\uff1a\u81ea\u7136\u6570\u6e38\u620f\uff0c\u4ece\u76ae\u4e9a\u8bfa\u516c\u7406\u5f00\u59cb\uff0c\u6784\u5efa\u81ea\u7136\u6570\u7684\u57fa\u672c\u8fd0\u7b97\u548c\u6027\u8d28\uff08GitHub \u4ed3\u5e93\uff09\u3002 \u793e\u533a\u5b98\u7f51\u76ee\u524d\u63d0\u4f9b\u4e86\u81ea\u7136\u6570\u548c\u96c6\u5408\u8bba\u7b49\u6e38\u620f\uff0c\u4e5f\u6b22\u8fce\u6839\u636e\u81ea\u5df1\u7684\u5b66\u79d1\u77e5\u8bc6\uff0c\u8d21\u732e\u66f4\u591a\u7684\u6e38\u620f~
"},{"location":"projects/lean4game/#_3","title":"\u53d1\u5e03\u6e38\u620f","text":"\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u7b80\u5355\u7684\u793a\u4f8b\u4ecb\u7ecd\u6e38\u620f\u7684\u53d1\u5e03\u8fc7\u7a0b\u3002
"},{"location":"projects/lean4game/#_4","title":"\u4e0b\u8f7d\u6e38\u620f\u6a21\u677f","text":"\u9996\u5148\uff0c\u4e0b\u8f7d GameSkeleton \u6a21\u677f\u4ed3\u5e93\uff0c\u8fd9\u4e2a\u662f\u7f51\u9875\u4e0a\u6700\u7ec8\u5c55\u793a\u7684\u5185\u5bb9\uff1a
git clone https://github.com/hhu-adam/GameSkeleton.git\n
\u6587\u4ef6\u7ed3\u6784\u5982\u4e0b\uff1a
\u251c\u2500\u2500 Game\n\u2502 \u251c\u2500\u2500 Levels\n\u2502 \u2502 \u251c\u2500\u2500 DemoWorld\n\u2502 \u2502 \u2502 \u2514\u2500\u2500 L01_HelloWorld.lean\n\u2502 \u2502 \u2514\u2500\u2500 DemoWorld.lean\n\u2502 \u2514\u2500\u2500 Metadata.lean\n\u251c\u2500\u2500 Game.lean\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 lake-manifest.json\n\u251c\u2500\u2500 lakefile.lean\n\u2514\u2500\u2500 lean-toolchain\n
\u8fd9\u662f\u4e00\u4e2a\u6807\u51c6\u7684 Lean \u5305\u7ed3\u6784\uff0c\u5176\u4e2d lean-toolchain
\u3001lakefile.lean
\u548c lake-manifest.json
\u662f Lean \u5305\u7684\u57fa\u672c\u6587\u4ef6\u3002Game
\u6587\u4ef6\u5939\u5305\u542b\u6e38\u620f\u5185\u5bb9\uff0c\u800c Game.lean
\u662f\u6e38\u620f\u7684\u5165\u53e3\u6587\u4ef6\u3002
\u66f4\u65b0\u4f9d\u8d56\u5e76\u6784\u5efa\u9879\u76ee\uff1a
lake update -R\nlake build\n
\u7c7b\u4f3c\u5730\uff0c\u4e5f\u53ef\u4ee5\u4e0b\u8f7d\u5176\u4ed6\u6e38\u620f\u6a21\u677f\uff0c\u4f8b\u5982 NNG4\uff1a
# cd .. # \u56de\u5230\u540c\u4e00\u7ea7\u76ee\u5f55\ngit clone https://github.com/leanprover-community/NNG4.git\ncd NNG4\nlake update -R\nlake build\n
"},{"location":"projects/lean4game/#lean4game","title":"\u4e0b\u8f7d Lean4Game","text":"Lean4Game \u662f\u6e38\u620f\u7684\u524d\u540e\u7aef\u6846\u67b6\uff0c\u7528\u4e8e\u521b\u5efa\u6e38\u620f\u7684\u4e3b\u9875\u9762\u3002
\u9996\u5148\uff0c\u5b89\u88c5 Node.js \u548c npm
# \u5b89\u88c5 nvm\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash\n# \u5b89\u88c5 nodejs\nnvm install node\nnvm use node\n
\u4e0b\u8f7d Lean4Game\uff0c\u5e76\u5c06\u5176\u653e\u5728\u6e38\u620f\u7684**\u540c\u7ea7\u76ee\u5f55**\uff1a
# \u4e0b\u8f7d Lean4Game\ngit clone https://github.com/leanprover-community/lean4game.git\ncd lean4game\n# \u5b89\u88c5\u4f9d\u8d56\nnpm install --force\n
\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\uff08\u53ef\u9009\uff09\uff1a
export PORT=8080\nexport CLIENT_PORT=3000\nexport VITE_CLIENT_DEFAULT_LANGUAGE=zh\n
\u5176\u4e2d PORT
\u4e3a\u8fd0\u884c Lean \u4ee3\u7801\u7684\u540e\u7aef\u7aef\u53e3\uff0c\u9ed8\u8ba4\u662f 8080
\uff1bCLIENT_PORT
\u4e3a\u524d\u7aef\u8bbf\u95ee\u7aef\u53e3\uff0c\u9ed8\u8ba4\u662f 3000
\uff1bVITE_CLIENT_DEFAULT_LANGUAGE
\u4e3a\u754c\u9762\u8bed\u8a00\uff0c\u9ed8\u8ba4\u4e3a en
\u3002
\u6267\u884c npm start
\u542f\u52a8\u6e38\u620f\uff0c\u5982\u679c\u770b\u5230\u4ee5\u4e0b\u9875\u9762\uff0c\u5c31\u8868\u793a\u8bbf\u95ee\u6210\u529f\uff1a
\u6b64\u5916\uff0c\u53ef\u4ee5\u5728\u53f3\u4e0a\u89d2\u7684\u504f\u597d\u8bbe\u7f6e\u5207\u6362\u8bed\u8a00\uff1a
"},{"location":"projects/lean4game/#nginx","title":"Nginx \u914d\u7f6e","text":"\u5982\u679c\u4e00\u5207\u987a\u5229\uff0c\u8bbf\u95ee http://localhost:3000/#/g/local/GameSkeleton
\u4f1a\u770b\u5230 \u201cHello World\u201d \u7684\u754c\u9762\uff1a
\u5047\u8bbe\u670d\u52a1\u542f\u52a8\u5728 3000 \u7aef\u53e3\uff0c\u53ef\u4ee5\u5c06\u57df\u540d game.leanprover.cn
\u914d\u7f6e\u4e3a\u6e38\u620f\u4e3b\u9875\u9762\uff0c\u53c2\u8003\u914d\u7f6e\u5982\u4e0b\uff1a
server {\n listen 443 ssl;\n ssl_certificate /etc/letsencrypt/live/game.leanprover.cn/fullchain.pem; \n ssl_certificate_key /etc/letsencrypt/live/game.leanprover.cn/privkey.pem; \n server_name game.leanprover.cn;\n location / {\n proxy_pass http://localhost:3000;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"Upgrade\";\n proxy_set_header Host $host;\n proxy_read_timeout 86400;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_ssl_server_name on;\n proxy_http_version 1.1;\n chunked_transfer_encoding off;\n proxy_buffering off;\n proxy_cache off;\n proxy_set_header X-Forwarded-Proto $scheme;\n client_max_body_size 0;\n }\n}\n
\u4e3a\u7b80\u5316\u8f93\u5165\uff0c\u53ef\u4ee5\u4e3a\u6e38\u620f\u5355\u72ec\u914d\u7f6e\u4e00\u4e2a\u5b50\u57df\u540d\u8fdb\u884c\u8df3\u8f6c\uff0c\u4f8b\u5982 nng4.leanprover.cn
\uff1a
server {\n listen 443 ssl; \n ssl_certificate /etc/letsencrypt/live/nng4.leanprover.cn/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/nng4.leanprover.cn/privkey.pem;\n server_name nng4.leanprover.cn;\n return 301 https://game.leanprover.cn/#/g/local/NNG4;\n}\n
\u8fd9\u6837\u53ea\u9700\u8bbf\u95ee nng4.leanprover.cn\uff0c\u800c\u4e0d\u9700\u8981\u8f93\u5165\u540e\u9762\u7684\u4e00\u957f\u4e32 URI\u3002
"},{"location":"projects/lean4game/#_5","title":"\u6e38\u620f\u4fee\u6539\u6307\u5357","text":"\u672c\u8282\u4ee5 NNG4 \u4e3a\u4f8b\uff0c\u4ecb\u7ecd\u6e38\u620f\u6587\u4ef6\u7ed3\u6784\u548c\u5982\u4f55\u6dfb\u52a0\u6e38\u620f\u5185\u5bb9\u3002
"},{"location":"projects/lean4game/#gamelean","title":"\u6e38\u620f\u5165\u53e3 Game.lean
","text":"\u6587\u4ef6 Game.lean
\u662f\u6574\u4e2a\u6e38\u620f\u7684\u4e3b\u5e72\uff0c\u8d1f\u8d23\u6574\u5408\u6240\u6709\u5185\u5bb9\u3002\u4ee5\u4e0b\u662f\u793a\u4f8b\u4ee3\u7801\uff1a
import GameServer.Commands\n\n-- \u5bfc\u5165\u6240\u6709\u4e16\u754c\nimport Game.Levels.Tutorial\n\nTitle \"My Game\"\n\nIntroduction \"\nHi, nice you're here! Click on a world to start.\n\"\n\nInfo \"\nThis game has been developed by me.\n\"\n\n-- Dependency World\u2081 \u2192 World\u2082 -- \u7531\u4e8e\u4f7f\u7528\u4e86 `\u2260`\nMakeGame\n
\u4ee3\u7801\u89e3\u6790\uff1a
import
\uff1a\u5bfc\u5165\u6e38\u620f\u670d\u52a1\u5668\u547d\u4ee4\u3002\u5176\u4e2d GameServer
\u662f\u4ece lean4game \u5f15\u5165\u7684\uff0c\u4e0d\u662f\u6765\u81ea\u5f53\u524d\u7684\u6a21\u677f\u4ed3\u5e93\u3002 Title \"My Game\"
\uff1a\u8bbe\u7f6e\u6e38\u620f\u7684\u6807\u9898\u3002 Introduction
\uff1a\u5728\u4e16\u754c\u9009\u62e9\u754c\u9762\u65c1\u663e\u793a\u7684\u4ecb\u7ecd\u6587\u672c\u3002 Info
\uff1a\u5728\u6e38\u620f\u83dc\u5355\u4e2d\u663e\u793a\u7684\u4fe1\u606f\uff0c\u4ecb\u7ecd\u6e38\u620f\u7684\u80cc\u666f\u548c\u5f00\u53d1\u8005\u4fe1\u606f\u7b49\u3002 Dependency
\uff1a\u4e00\u4e2a\u53ef\u9009\u547d\u4ee4\uff0c\u7528\u4e8e\u8bbe\u7f6e\u4e16\u754c\u4e4b\u95f4\u7684\u4f9d\u8d56\u5173\u7cfb\u3002\u4f8b\u5982\uff0c\u82e5\u4e00\u4e2a\u4e16\u754c\u4ecb\u7ecd\u4e86 \u2260
\u7b26\u53f7\uff0c\u800c\u5728\u53e6\u4e00\u4e2a\u4e16\u754c\u4e2d\u7528\u6237\u9700\u8981\u5df2\u77e5\u6b64\u7b26\u53f7\uff0c\u5219\u53ef\u4f7f\u7528\u6b64\u547d\u4ee4\u3002 MakeGame
\uff1a\u6784\u5efa\u6e38\u620f\u7684\u547d\u4ee4\u3002\u5982\u679c\u5b58\u5728\u9700\u8981\u4fee\u590d\u7684\u95ee\u9898\uff0c\u5c06\u4ee5\u8b66\u544a\u6216\u9519\u8bef\u7684\u5f62\u5f0f\u663e\u793a\uff08\u5728 VSCode \u4e2d\u4e3a\u6a59\u8272/\u7ea2\u8272\u6ce2\u6d6a\u7ebf\uff09\u3002 \u53ef\u5bf9\u7167\u4e0b\u56fe\uff1a
"},{"location":"projects/lean4game/#_6","title":"\u521b\u5efa\u5173\u5361","text":"\u4e0b\u9762\u662f\u4e00\u4e2a\u6700\u7b80\u5173\u5361\u6587\u4ef6\u793a\u4f8b\uff1a
import GameServer.Commands\n\nWorld \"MyWorld\"\nLevel 1\nTitle \"Hello World\"\n\nIntroduction \"\nA message shown at the beginning of the level. Use it to explain any new concepts.\n\"\n\n/-- The exercise statement in natural language using latex: $\\iff$. -/\nStatement (n : Nat) : 0 + n = n := by\n sorry\n\nConclusion \"\nThe message shown when the level is completed\n\"\n
\u64cd\u4f5c\u6b65\u9aa4\uff1a 1. \u521b\u5efa\u6587\u4ef6\u5939 Game/Levels/MyWorld
2. \u521b\u5efa\u6587\u4ef6 Game/Levels/MyWorld/L01_hello.lean
3. \u5c06\u4e0a\u8ff0\u4ee3\u7801\u590d\u5236\u5230\u4f60\u7684\u7b2c\u4e00\u4e2a\u5173\u5361\u6587\u4ef6\u4e2d\u3002
"},{"location":"projects/lean4game/#_7","title":"\u521b\u5efa\u4e16\u754c","text":"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u4e16\u754c\u3002\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a MyWorld.lean
\u7684\u6587\u4ef6\uff0c\u5e76\u5c06\u6240\u6709\u5173\u5361\u6587\u4ef6\u5bfc\u5165\u5230\u8be5\u4e16\u754c\u4e2d\uff1a
import Game.Levels.MyWorld.L01_hello\n\nWorld \"MyWorld\"\nTitle \"My First World\"\n\nIntroduction \"\nThis introduction text is shown when one first enters a world.\n\"\n
\u64cd\u4f5c\u6b65\u9aa4\uff1a 1. \u521b\u5efa\u6587\u4ef6 Game/Levels/MyWorld.lean
2. \u4f7f\u7528\u4e0a\u9762\u7684\u6a21\u677f\uff0c\u786e\u4fdd\u5bfc\u5165\u4e86\u8be5\u4e16\u754c\u7684\u6240\u6709\u5173\u5361\u3002 3. \u5728 Game.lean
\u4e2d\u5bfc\u5165\u8be5\u4e16\u754c\uff1aimport Game.Levels.MyWorld
\u81f3\u6b64\uff0c\u6211\u4eec\u5df2\u6210\u529f\u521b\u5efa\u4e00\u4e2a\u5305\u542b\u4e00\u4e2a\u5173\u5361\u7684\u4e16\u754c\u5e76\u5c06\u5176\u52a0\u5165\u5230\u6e38\u620f\u4e2d \ud83c\udf89\u3002
Game.lean
\u4e2d\u7684 MakeGame
\u547d\u4ee4\u4f1a\u6307\u51fa\u9700\u8981\u4fee\u590d\u7684\u4efb\u4f55\u95ee\u9898\u3002\u4f8b\u5982\uff0c\u5982\u679c\u663e\u793a\uff1a
\u8fd9\u610f\u5473\u7740\u4e16\u754c MyWorld
\u4f7f\u7528\u4e86 sorry
\u7b56\u7565\uff0c\u4f46\u6b64\u7b56\u7565\u5c1a\u672a\u5728\u4efb\u4f55\u5730\u65b9\u88ab\u5f15\u5165\u3002
\u6bcf\u6b21\u6dfb\u52a0\u6216\u4fee\u6539\u6e38\u620f\u5185\u5bb9\u540e\uff0c\u90fd\u9700\u8981\u91cd\u65b0\u6784\u5efa\u66f4\u65b0\uff1a
# cd NNG4 # \u8fdb\u5165\u6e38\u620f\u76ee\u5f55\nlake build\n
"},{"location":"projects/lean4game/#_8","title":"\u9ad8\u7ea7\u4ea4\u4e92\u7279\u6027","text":"\u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u7c97\u7565\u4ecb\u7ecd\u6e38\u620f\u4e2d\u7684\u9ad8\u7ea7\u4ea4\u4e92\u529f\u80fd\u3002\u8fd9\u90e8\u5206\u529f\u80fd\u5341\u5206\u4e30\u5bcc\uff0c\u76ee\u524d\u53ea\u8fdb\u884c\u521d\u6b65\u8bf4\u660e\u3002\u540e\u7eed\u6dfb\u52a0\u5c0f\u6e38\u620f\u7684\u8fc7\u7a0b\uff0c\u518d\u8fdb\u4e00\u6b65\u62d3\u5c55\u548c\u8865\u5145\u3002
"},{"location":"projects/lean4game/#_9","title":"\u5b9a\u7406\u548c\u7b56\u7565\u7684\u7ba1\u7406","text":"\u73a9\u5bb6\u5728\u6e38\u620f\u4e2d\u62e5\u6709\u4e00\u4e2a\u9010\u6b65\u89e3\u9501\u7684\u5b9a\u7406\u548c\u7b56\u7565\u6e05\u5355\u3002\u5728\u5173\u5361\u8bbe\u8ba1\u4e2d\uff0c\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u5728 Statement
\u4e0b\u65b9\u89e3\u9501\u6216\u5f15\u5165\u65b0\u7684\u5b9a\u7406\u548c\u7b56\u7565\uff1a
NewTactic induction simp -- \u89e3\u9501 `induction` \u548c `simp`\nNewTheorem Nat.zero_mul\nNewDefinition Pow\n
\u91cd\u8981\u63d0\u793a\uff1a\u6240\u6709\u547d\u4ee4\u4e2d\u7684\u540d\u79f0\u90fd\u9700\u8981\u4f7f\u7528**\u5168\u9650\u5b9a\u540d**\u3002\u4f8b\u5982\uff0c\u5e94\u4f7f\u7528 NewTheorem Nat.zero_mul
\u800c\u975e NewTheorem zero_mul
\u3002
"},{"location":"projects/lean4game/#_10","title":"\u6587\u6863\u6761\u76ee","text":"\u5982\u679c\u53d1\u73b0\u5b9a\u7406\u6587\u6863\u7f3a\u5931\uff0c\u7cfb\u7edf\u4f1a\u663e\u793a\u8b66\u544a\u3002\u53ef\u4ee5\u901a\u8fc7\u6dfb\u52a0\u6587\u6863\u6761\u76ee\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898\uff1a
/--\nsome description\n-/\nTheoremDoc Nat.zero_mul as \"zero_mul\" in \"Mul\"\n\n/--\nsome description\n-/\nTacticDoc simp\n\n/--\nsome description\n-/\nDefinitionDoc Pow as \"^\"\n
\u521b\u5efa\u4e00\u4e2a\u6587\u4ef6 Game/Doc/MyTheorems.lean
\uff0c\u5728\u5176\u4e2d\u6dfb\u52a0\u6587\u6863\u5e76\u5c06\u5176\u5bfc\u5165\u9879\u76ee\u4e2d\u3002
\u5982\u679c\u672a\u63d0\u4f9b\u4efb\u4f55\u6587\u6863\u5185\u5bb9\uff0c\u6e38\u620f\u5c06\u5c1d\u8bd5\u5bfb\u627e\u5e76\u5c55\u793a\u8be5\u6761\u76ee\u7684\u6587\u6863\u5b57\u7b26\u4e32\u3002
"},{"location":"projects/lean4game/#_11","title":"\u6e05\u5355\u7ba1\u7406","text":"\u73a9\u5bb6\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u5728\u5173\u5361\u4e2d\u7981\u7528\u6216\u53ea\u542f\u7528\u7279\u5b9a\u7684\u5df2\u89e3\u9501\u6761\u76ee\uff1a
DisabledTactic, DisabledTheorem, OnlyTactic, OnlyTheorem\n
\u8fd9\u4e9b\u547d\u4ee4\u7684\u8bed\u6cd5\u4e0e\u524d\u8fb9\u76f8\u540c\u3002\u524d\u4e24\u4e2a\u547d\u4ee4\u7528\u4e8e\u7981\u7528\u8be5\u5173\u5361\u7684\u7279\u5b9a\u6761\u76ee\uff0c\u540e\u4e24\u4e2a\u547d\u4ee4\u7528\u4e8e\u53ea\u542f\u7528\u6307\u5b9a\u7684\u6761\u76ee\u3002
"},{"location":"projects/lean4game/#_12","title":"\u5b9a\u7406\u6807\u7b7e","text":"\u901a\u8fc7 TheoremTab \"Mul\"
\u547d\u4ee4\u4e3a\u5b9a\u7406\u5206\u7ec4\uff0c\u5e76\u6307\u5b9a\u5728\u5173\u5361\u4e2d\u9ed8\u8ba4\u6253\u5f00\u7684\u6807\u7b7e\u3002
"},{"location":"projects/lean4game/#_13","title":"\u9690\u85cf\u7b56\u7565","text":"\u4f7f\u7528 NewHiddenTactic
\u547d\u4ee4\u53ef\u4ee5\u6dfb\u52a0\u5141\u8bb8\u7b56\u7565\u800c\u4e0d\u5728\u73a9\u5bb6\u6e05\u5355\u4e2d\u663e\u793a\u3002\u4f8b\u5982\uff1a
NewTactic rw\nNewHiddenTactic rewrite nth_rewrite rwa\n
\u5728\u6b64\u4f8b\u4e2d\uff0c\u53ea\u6709 rw
\u4f1a\u5728\u6e05\u5355\u4e2d\u663e\u793a\u3002
"},{"location":"projects/lean4game/#_14","title":"\u5173\u5361\u8bbe\u8ba1","text":"\u901a\u8fc7\u4e00\u4e2a\u793a\u4f8b\u6765\u67e5\u770b\u5173\u5361\u7684\u4ee3\u7801\uff1a
/-- \u6211\u4eec\u5b9a\u4e49\u4e00\u4e2a\u4ece \u2115 \u5230 \u2115 \u7684\u51fd\u6570\u3002 -/\nStatement\n : \u2115 \u2192 \u2115 := by\n Hint \"\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u76ee\u6807\uff0c\n \u4f60\u9700\u8981\u6784\u60f3\u4e00\u4e2a\u4ece `\u2115`\n \u5230 `\u2115` \u7684\u51fd\u6570\u3002\u5f00\u59cb\u4f7f\u7528\n\n `intro n`\"\n intro n\n Hint \"\u6211\u4eec\u7684\u4efb\u52a1\u73b0\u5728\u662f\u6784\u9020\u4e00\u4e2a\u81ea\u7136\u6570\uff0c\u8fd9\u4e2a\u6570\u53ef\u4ee5\u4f9d\u8d56\u4e8e ${n}\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 `exact` \u5e76\u5199\u51fa\u6211\u4eec\u60f3\u8981\u5b9a\u4e49\u7684\u51fd\u6570\u7684\u516c\u5f0f\u3002\u4f8b\u5982\n \u6211\u4eec\u5728\u6587\u4ef6\u9876\u90e8\u5bfc\u5165\u4e86\u52a0\u6cd5\u548c\u4e58\u6cd5\uff0c\n \u6240\u4ee5\n\n `exact 3 * {n} + 2`\n\n \u5c06\u5b8c\u6210\u76ee\u6807\uff0c\u6700\u7ec8\u5b9a\u4e49\u51fd\u6570 $f({n})=3{n}+2$.\"\n exact 3 * n + 2\n
Statement
\u7528\u4e8e\u5b9a\u4e49\u7ec3\u4e60\uff0c\u5176\u7528\u6cd5\u7c7b\u4f3c\u4e8e example
\u6216 theorem
\uff0c\u4f46\u5fc5\u987b\u4f7f\u7528\u7b56\u7565\u8bc1\u660e\uff0c\u5373 := by
\u662f\u56fa\u5b9a\u7684\u8bed\u6cd5\u90e8\u5206\u3002
Statement
\u53ef\u4ee5\u63a5\u7ec3\u4e60\u7684\u547d\u540d\uff0c\u6bd4\u5982\uff1aStatement my_first_exercise (n : Nat) \u2026
\u3002\u547d\u540d\u540e\u5b83\u4f1a\u88ab\u6dfb\u52a0\u5230\u6e05\u5355\u4e2d\uff0c\u5e76\u5728\u540e\u7eed\u5173\u5361\u4e2d\u53ef\u7528\u3002
\u6b64\u5916\uff0cStatement
\u524d\u7684\u6ce8\u91ca\u5c06\u4f5c\u4e3a\u7ec3\u4e60\u7684\u63cf\u8ff0\u663e\u793a\u5728\u6e38\u620f\u4e2d\uff0c\u4e14\u652f\u6301 Latex\u3002
"},{"location":"projects/lean4game/#_15","title":"\u8bc1\u660e","text":"\u8bc1\u660e\u5fc5\u987b\u662f\u7b56\u7565\u8bc1\u660e\uff0c\u5373 := by
\u662f\u56fa\u5b9a\u7684\u8bed\u6cd5\u90e8\u5206\u3002
\u4ee5\u4e0b\u662f\u4e00\u4e9b\u6709\u52a9\u4e8e\u7ed3\u6784\u5316\u8bc1\u660e\u7684\u7b56\u7565\uff1a
Hint
\uff1a\u53ef\u4ee5\u4f7f\u7528 Hint \"text\"
\u5728\u6e38\u620f\u7684\u76ee\u6807\u72b6\u6001\u5339\u914d\u65f6\u663e\u793a\u6587\u672c\u3002\u66f4\u591a\u5173\u4e8e\u63d0\u793a\u7684\u9009\u9879\uff0c\u8bf7\u53c2\u89c1\u76f8\u5173\u6587\u6863\u3002 Branch
\uff1a\u53ef\u4ee5\u5728\u8bc1\u660e\u4e2d\u6dfb\u52a0 Branch
\uff0c\u6267\u884c\u66ff\u4ee3\u7b56\u7565\u5e8f\u5217\uff0c\u5e2e\u52a9\u5728\u4e0d\u540c\u4f4d\u7f6e\u8bbe\u7f6e Hint
\u3002Branch
\u4e0d\u4f1a\u5f71\u54cd\u4e3b\u8bc1\u660e\u4e14\u4e0d\u9700\u5b8c\u6210\u4efb\u4f55\u76ee\u6807\u3002 Template
/Hole
\uff1a\u7528\u4e8e\u63d0\u4f9b\u793a\u4f8b\u8bc1\u660e\u6a21\u677f\u3002Template
\u4e2d\u7684\u5185\u5bb9\u5c06\u88ab\u590d\u5236\u5230\u7f16\u8f91\u5668\u4e2d\uff0c\u6240\u6709 Hole
\u5c06\u88ab\u66ff\u6362\u4e3a sorry
\u3002\u6ce8\u610f\uff0c\u62e5\u6709 Template
\u5c06\u5f3a\u5236\u7528\u6237\u5728\u8be5\u5173\u5361\u4f7f\u7528\u7f16\u8f91\u5668\u6a21\u5f0f\u3002 "},{"location":"projects/lean4game/#_16","title":"\u63d0\u793a","text":"\u63d0\u793a\u662f\u6e38\u620f\u5f00\u53d1\u4e2d\u53ef\u80fd\u662f\u6700\u91cd\u8981\u7684\u90e8\u5206\u3002\u63d0\u793a\u5c06\u5728\u73a9\u5bb6\u7684\u5f53\u524d\u76ee\u6807\u4e0e\u793a\u4f8b\u8bc1\u660e\u4e2d\u7684\u76ee\u6807\u5339\u914d\u65f6\u663e\u793a\u3002\u53ef\u4ee5\u4f7f\u7528 Branch
\u5728\u6b7b\u80e1\u540c\u6216\u66ff\u4ee3\u8bc1\u660e\u8def\u5f84\u4e2d\u8bbe\u7f6e\u63d0\u793a\u3002
"},{"location":"projects/lean4game/#_17","title":"\u6dfb\u52a0\u56fe\u7247","text":"\u53ef\u4ee5\u5728\u6e38\u620f\u7684\u4efb\u4f55\u5c42\u7ea7\uff08\u6e38\u620f/\u4e16\u754c/\u5173\u5361\uff09\u6dfb\u52a0\u56fe\u7247\uff0c\u8fd9\u4e9b\u56fe\u50cf\u5c06\u663e\u793a\u5728\u6e38\u620f\u4e2d\u3002
\u6587\u4ef6\u9700\u653e\u7f6e\u5728 images/
\u4e2d\uff0c\u5e76\u901a\u8fc7\u5728\u521b\u5efa\u7684\u6587\u4ef6\u4e2d\u6dfb\u52a0\u5982 Image \"images/path/to/myWorldImage.png\"
\u7684\u547d\u4ee4\u6765\u5f15\u7528\u3002
"},{"location":"projects/lean4game/#_18","title":"\u6ce8\u610f\u4e8b\u9879","text":"\u8bbe\u8ba1\u65b0\u6e38\u620f\u65f6\u5e94\u8003\u8651\u7684\u5176\u4ed6\u4e8b\u9879\uff1a
\u5728\u5b57\u7b26\u4e32\u5185\u90e8\u9700\u8981\u8f6c\u4e49\u53cd\u659c\u6760\uff0c\u4f46\u5728\u6587\u6863\u6ce8\u91ca\u7684\u5b57\u7b26\u4e32\u5185\u90e8\u5219\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u4f60\u4f1a\u5199 Introduction \"some latex here: $\\\\iff$.\"
\u4f46 /-- some latex here: $\\iff$. -/ Statement ...
\u62e5\u6709\u8d85\u8fc7 16 \u4e2a\u5173\u5361\u7684\u4e16\u754c\u5c06\u4ee5\u87ba\u65cb\u5f62\u5411\u5916\u663e\u793a\uff0c\u6700\u597d\u4fdd\u6301\u5728\u8fd9\u4e2a\u8303\u56f4\u4ee5\u4e0b\u3002\u8d85\u8fc7 22 \u4e2a\u5173\u5361\u65f6\uff0c\u87ba\u65cb\u5f62\u5f00\u59cb\u53d8\u5f97\u96be\u4ee5\u63a7\u5236\u3002 "},{"location":"projects/lean4game/#_19","title":"\u6e38\u620f\u7ffb\u8bd1","text":"\u901a\u8fc7\u4f7f\u7528 lean-i18n \u548c i18next\uff0c\u53ef\u4ee5\u4e3a\u6e38\u620f\u6dfb\u52a0\u591a\u8bed\u8a00\u652f\u6301\u3002TODO Ref\uff1a https://github.com/leanprover-community/lean4game/blob/main/doc/translate.md
\u4ee5\u4e0a\uff0c\u4e00\u4e9b\u5185\u5bb9\u7ec6\u8282\u5f85\u8865\u5145\u5b8c\u5584\uff0c\u6b22\u8fce\u4ea4\u6d41~
"},{"location":"projects/lean4web/","title":"Lean4web \u5728\u7ebf\u7f16\u8f91\u5668","text":"Lean4web \u662f Lean 4 \u7684\u4e00\u4e2a\u7f51\u9875\u7248\u5de5\u5177\uff0c\u5141\u8bb8\u7528\u6237\u5728\u6d4f\u89c8\u5668\u4e2d\u7f16\u5199\u548c\u6267\u884c Lean \u4ee3\u7801\u3002
\u5b98\u65b9\u7684 Lean playground \u6258\u7ba1\u5728 live.lean-lang.org\uff0c\u4f46\u4ec5\u652f\u6301\u6700\u65b0\u5206\u652f\u548c\u6700\u65b0\u53d1\u884c\u7248\u3002\u7531\u4e8e Mathlib \u4e0d\u5411\u540e\u517c\u5bb9\uff0c\u65e7\u7248\u672c\u7684 Lean \u4ee3\u7801\u53ef\u80fd\u65e0\u6cd5\u5728\u6700\u65b0\u7684 Lean playground \u4e0a\u8fd0\u884c\u3002\u56e0\u6b64\u672c\u7bc7\u5c06\u4ecb\u7ecd\u5982\u4f55\u5728\u672c\u5730\u90e8\u7f72 Lean4web\uff0c\u4ee5\u53ca\u5982\u4f55\u6dfb\u52a0\u65e7\u7248\u73af\u5883\u3002
"},{"location":"projects/lean4web/#_1","title":"\u9879\u76ee\u94fe\u63a5\u89c4\u5219","text":"Lean4web \u4f7f\u7528 URL \u53c2\u6570\u6765\u63a7\u5236\u4e0d\u540c\u7684\u529f\u80fd\u548c\u52a0\u8f7d\u4e0d\u540c\u7684\u9879\u76ee\u3002\u4f8b\u5982\uff1a
code=
: \u7eaf\u6587\u672c\u4ee3\u7801 codez=
: \u4f7f\u7528 LZ-string \u538b\u7f29\u7684\u4ee3\u7801 url=
: \u4ece\u6307\u5b9a\u7684 URL \u52a0\u8f7d\u5185\u5bb9\uff0c\u4f18\u5148\u7ea7\u9ad8\u4e8e\u4e0a\u9762\u7684 code
\u548c codez
project=
: \u7528\u4e8e\u670d\u52a1\u5668\u8bc4\u4f30\u4ee3\u7801\u7684 Lean \u9879\u76ee\u540d\u79f0\uff0c\u8be5\u540d\u79f0\u5fc5\u987b\u662f\u670d\u52a1\u5668\u914d\u7f6e\u4e2d\u5b9a\u4e49\u7684\u9879\u76ee\u4e4b\u4e00 \u8fd9\u4e9b\u89c4\u5219\u5141\u8bb8\u901a\u8fc7 URL \u76f4\u63a5\u52a0\u8f7d Lean \u4ee3\u7801\uff0c\u65b9\u4fbf\u7528\u6237\u5206\u4eab\u548c\u4ea4\u6d41\u3002
"},{"location":"projects/lean4web/#_2","title":"\u9879\u76ee\u90e8\u7f72\u548c\u542f\u52a8\u65b9\u5f0f","text":"\u4ee5\u4e0b\u6b65\u9aa4\u90e8\u7f72\u5728 Ubuntu Server 22.10 \u4e0a\u65f6\u6d4b\u53ef\u884c\uff1a
\u5b89\u88c5 NPM:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash\nsource ~/.bashrc\nnvm install 20\n
\u514b\u9686 Lean4web \u4ed3\u5e93:
sudo apt-get install git\ngit clone --recurse-submodules https://github.com/leanprover-community/lean4web.git\n
\u5b89\u88c5 Bubblewrap \u4ee5\u589e\u5f3a\u5b89\u5168\u6027:
sudo apt-get install bubblewrap\n
\u56de\u5230\u4ed3\u5e93\u76ee\u5f55\uff0c\u5b89\u88c5\u4f9d\u8d56\u5e76\u7f16\u8bd1:
cd lean4web\nnpm install\nnpm run build\n
\u542f\u52a8\u670d\u52a1\u5668:
PORT=8080 npm run production\n
\u901a\u8fc7\u8fd9\u4e9b\u6b65\u9aa4\uff0cLean4web \u670d\u52a1\u5668\u5c06\u4f1a\u5728\u6307\u5b9a\u7684\u7aef\u53e3\u542f\u52a8\u670d\u52a1\u3002
"},{"location":"projects/lean4web/#mathlib","title":"\u6dfb\u52a0\u65e7\u7248\u5e26 mathlib \u7684\u65b9\u5f0f","text":"\u8981\u521b\u5efa\u5305\u542b\u7279\u5b9a\u7248\u672c mathlib \u7684 Lean \u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528 create_project.sh
\u811a\u672c\uff1a
cd lean4web\ncd Projects\nbash create_project.sh <version>\n
\u7528\u5177\u4f53\u7684\u7248\u672c\u53f7\u66ff\u6362 <version>
\u3002\u8fd9\u4f1a\u5728 Projects/
\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee\uff0c\u5e76\u914d\u7f6e\u76f8\u5e94\u7684 mathlib \u4f9d\u8d56\u548c\u5de5\u5177\u94fe\u7248\u672c\u3002
\u914d\u7f6e\u540e\uff0c\u5728 client/src/config/config.json
\u4e2d\u6dfb\u52a0\u7c7b\u4f3c\u5b57\u6bb5\uff1a
{ \"folder\": \"v4.13.0\",\n \"name\": \"Lean 4.13.0\",\n}\n
\u91cd\u65b0\u8fd0\u884c npm run build
\u548c npm run production
\u5373\u53ef\u3002
"},{"location":"projects/lean4web/#cdn","title":"CDN \u4f18\u5316","text":"\u7f51\u7ad9\u5b58\u5728\u8f83\u5927\u7684\u9759\u6001\u8d44\u6e90\uff0c\u9996\u6b21\u8bbf\u95ee\u901f\u5ea6\u53ef\u80fd\u8f83\u6162\uff0c\u6bd4\u5982\u5b57\u4f53\u6587\u4ef6\u548c JS \u6587\u4ef6\uff1a
\u540e\u7eed\u8003\u8651\u90e8\u7f72 CDN \u670d\u52a1\uff0c\u4f18\u5316\u52a0\u8f7d\u901f\u5ea6\u3002
"},{"location":"references/lake-doc/","title":"Lake \u5305\u7ba1\u7406","text":""},{"location":"references/lake-doc/#lake","title":"Lake \u5b98\u65b9\u6587\u6863","text":"Lake\uff08Lean Make\uff09\u662f Lean 4 \u65b0\u7684\u6784\u5efa\u7cfb\u7edf\u548c\u5305\u7ba1\u7406\u5668\u3002\u501f\u52a9 Lake\uff0c\u5305\u7684\u914d\u7f6e\u53ef\u4ee5\u5199\u5165\u4f4d\u4e8e\u5305\u6839\u76ee\u5f55\u4e0b\u7684\u4e13\u7528 lakefile.lean
\u6587\u4ef6\u4e2d\u3002
\u6bcf\u4e2a lakefile.lean
\u6587\u4ef6\u5305\u542b\u4e00\u4e2a package
\u58f0\u660e\uff08\u7c7b\u4f3c\u4e8e main
\u51fd\u6570\uff09\uff0c\u7528\u4e8e\u5b9a\u4e49\u5305\u7684\u57fa\u672c\u914d\u7f6e\u3002\u901a\u5e38\uff0c\u8fd8\u5305\u62ec\u4e0d\u540c\u76ee\u6807\u7684\u6784\u5efa\u914d\u7f6e\uff08\u4f8b\u5982 Lean \u5e93\u6587\u4ef6\u548c\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\uff09\uff0c\u4ee5\u53ca\u901a\u8fc7 lake script run
\u8fd0\u884c\u7684\u547d\u4ee4\u884c\u811a\u672c\u3002
\u6b64 README \u63d0\u4f9b\u4e86\u4e0e\u5f53\u524d\u63d0\u4ea4\u76f8\u5173\u7684 Lake \u4fe1\u606f\u3002\u5982\u679c\u60a8\u6b63\u5728\u67e5\u627e\u968f\u7279\u5b9a Lean \u7248\u672c\u53d1\u5e03\u7684 Lake \u6587\u6863\uff0c\u8bf7\u67e5\u770b\u8be5\u7248\u672c\u7684 README\u3002
"},{"location":"references/lake-doc/#lake_1","title":"\u83b7\u53d6 Lake","text":"Lake \u662f lean4 \u4ed3\u5e93\u7684\u4e00\u90e8\u5206\uff0c\u968f\u5176\u5b98\u65b9\u7248\u672c\u4e00\u540c\u53d1\u5e03\uff08\u4f8b\u5982\uff0c\u4f5c\u4e3a elan \u5de5\u5177\u94fe\u7684\u4e00\u90e8\u5206\uff09\u3002\u6240\u4ee5\uff0c\u5982\u679c\u4f60\u5df2\u7ecf\u5b89\u88c5\u4e86\u8fd1\u671f\u7248\u672c\u7684 Lean 4\uff0c\u4f60\u4e5f\u5e94\u8be5\u5df2\u7ecf\u62e5\u6709\u4e86 Lake\uff01\u5982\u679c\u4f60\u60f3\u81ea\u5df1\u4ece\u6e90\u7801\u6784\u5efa\u6700\u65b0\u7248\u672c\uff0c\u8bf7\u53c2\u9605\u6b64 README \u6700\u540e\u7684\u6784\u5efa\u6307\u5357\u3002
"},{"location":"references/lake-doc/#_1","title":"\u521b\u5efa\u5e76\u6784\u5efa\u4e00\u4e2a\u5305","text":"\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5305\uff0c\u53ef\u4ee5\u8fd0\u884c lake init
\u5728\u5f53\u524d\u76ee\u5f55\u4e2d\u8bbe\u7f6e\u5305\uff0c\u6216\u8fd0\u884c lake new
\u5728\u65b0\u76ee\u5f55\u4e2d\u521b\u5efa\u5305\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u521b\u5efa\u5305 hello
\uff1a
$ mkdir hello\n$ cd hello\n$ lake init hello\n
\u6216\u8005\u8fd9\u6837\uff1a
$ lake new hello\n$ cd hello\n
\u65e0\u8bba\u91c7\u7528\u54ea\u79cd\u65b9\u5f0f\uff0cLake \u90fd\u4f1a\u521b\u5efa\u5982\u4e0b\u6a21\u677f\u76ee\u5f55\u7ed3\u6784\u5e76\u4e3a\u5305\u521d\u59cb\u5316\u4e00\u4e2a Git \u4ed3\u5e93\u3002
.lake/ # Lake \u7684\u8f93\u51fa\u76ee\u5f55\nHello/ # \u5e93\u7684\u6e90\u6587\u4ef6\u76ee\u5f55; \u901a\u8fc7 `import Hello.*` \u5bfc\u5165\n Basic.lean # \u4e00\u4e2a\u793a\u4f8b\u5e93\u6a21\u5757\u6587\u4ef6\n ... # \u5728\u6b64\u5904\u6dfb\u52a0\u5176\u4ed6\u6587\u4ef6\nHello.lean # \u5e93\u7684\u6839\u6587\u4ef6; \u4ece Hello \u5bfc\u5165\u6807\u51c6\u6a21\u5757\nMain.lean # \u53ef\u6267\u884c\u6587\u4ef6\u7684\u4e3b\u6587\u4ef6 (\u542b `def main`)\nlakefile.lean # Lake \u7684\u5305\u914d\u7f6e\u6587\u4ef6\nlean-toolchain # \u5305\u6240\u4f7f\u7528\u7684 Lean \u7248\u672c\n.gitignore # \u6392\u9664\u7cfb\u7edf\u7279\u5b9a\u6587\u4ef6 (\u5982 `build`) \u4ece Git \u7248\u672c\u63a7\u5236\u4e2d\n
\u793a\u4f8b\u6a21\u5757\u6587\u4ef6\u5305\u542b\u4ee5\u4e0b \"Hello World\" \u7a0b\u5e8f\u3002
Hello/Basic.lean
def hello := \"world\"\n
Hello.lean
-- \u8fd9\u4e2a\u6a21\u5757\u662f `Hello` \u5e93\u7684\u6839\u6587\u4ef6\n-- \u5728\u8fd9\u91cc\u5bfc\u5165\u5e94\u4f5c\u4e3a\u5e93\u4e00\u90e8\u5206\u6784\u5efa\u7684\u6a21\u5757\u3002\nimport \u00abHello\u00bb.Basic\n
Main.lean
import \u00abHello\u00bb\n\ndef main : IO Unit :=\n IO.println s!\"Hello, {hello}!\"\n
Lake \u8fd8\u4f1a\u4e3a\u5305\u521b\u5efa\u4e00\u4e2a\u57fa\u7840\u7684 lakefile.lean
\u6587\u4ef6\u4ee5\u53ca\u4e00\u4e2a\u5305\u542b Lean \u5de5\u5177\u94fe\u540d\u79f0\u7684 lean-toolchain
\u6587\u4ef6\uff0c\u8fd9\u6837 elan \u5c31\u77e5\u9053\u8be5\u4e3a\u8fd9\u4e2a\u5305\u4f7f\u7528\u54ea\u4e2a Lean \u5de5\u5177\u94fe\u3002
lakefile.lean
import Lake\nopen Lake DSL\n\npackage \u00abhello\u00bb where\n -- \u5728\u6b64\u6dfb\u52a0\u5305\u914d\u7f6e\u9009\u9879\n\nlean_lib \u00abHello\u00bb where\n -- \u5728\u6b64\u6dfb\u52a0\u5e93\u914d\u7f6e\u9009\u9879\n\n@[default_target]\nlean_exe \u00abhello\u00bb where\n root := `Main\n
lake build
\u547d\u4ee4\u7528\u4e8e\u6784\u5efa\u5305\uff08\u53ca\u5176\u4f9d\u8d56\u9879\uff0c\u5982\u679c\u6709\u7684\u8bdd\uff09\u4e3a\u672c\u5730\u53ef\u6267\u884c\u6587\u4ef6\u3002\u7ed3\u679c\u5c06\u653e\u7f6e\u5728 .lake/build/bin
\u76ee\u5f55\u4e0b\u3002lake clean
\u547d\u4ee4\u4f1a\u5220\u9664 build
\u76ee\u5f55\u3002
$ lake build\n...\n$ ./.lake/build/bin/hello\nHello, world!\n
\u5728\u6b64\u4ed3\u5e93\u7684 examples
\u6587\u4ef6\u5939\u4e2d\u53ef\u4ee5\u627e\u5230\u4e0d\u540c\u5305\u914d\u7f6e\u7684\u793a\u4f8b\u3002\u4f60\u4e5f\u53ef\u4ee5\u4e3a lake init
\u6216 lake new
\u547d\u4ee4\u4f20\u5165\u6a21\u677f\u4ee5\u63a7\u5236 Lake \u521b\u5efa\u7684\u6587\u4ef6\u3002\u4f8b\u5982\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7 lake new hello .toml
\u547d\u4ee4\u751f\u6210\u4e00\u4e2a TOML \u7248\u672c\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u800c\u4e0d\u662f\u4f7f\u7528 Lean \u914d\u7f6e\u6587\u4ef6\u3002
lakefile.toml
name = \"hello\"\ndefaultTargets = [\"hello\"]\n\n[[lean_lib]]\nname = \"Hello\"\n\n[[lean_exe]]\nname = \"hello\"\nroot = \"Main\"\n
\u4f7f\u7528 lake help init
\u6216 lake help new
\u547d\u4ee4\u53ef\u4ee5\u67e5\u770b\u6709\u5173\u5176\u4ed6\u6a21\u677f\u9009\u9879\u7684\u66f4\u591a\u8be6\u7ec6\u4fe1\u606f\u3002
"},{"location":"references/lake-doc/#_2","title":"\u672f\u8bed\u8868","text":"\u5728\u8f6f\u4ef6\u5f00\u53d1\u8fc7\u7a0b\u4e2d\uff0cLake \u4f1a\u7528\u5230\u4e00\u7cfb\u5217\u7684\u672f\u8bed \u2014\u2014 \u5982\u5de5\u4f5c\u7a7a\u95f4\uff08workspace\uff09\u3001\u5305\uff08package\uff09\u3001\u5e93\uff08library\uff09\u3001\u53ef\u6267\u884c\u6587\u4ef6\uff08executable\uff09\u3001\u76ee\u6807\uff08target\uff09\u7b49\u7b49 \u2014\u2014 \u8fd8\u6709\u4e9b\u66f4\u96be\u7406\u89e3\u7684\u672f\u8bed\uff0c\u5982 facet\u3002\u4e0d\u8fc7\uff0c\u65e0\u8bba\u8fd9\u4e9b\u672f\u8bed\u662f\u5426\u5e38\u89c1\uff0c\u4e0d\u540c\u7684\u4eba\u5bf9\u5176\u90fd\u6709\u7740\u4e0d\u540c\u7684\u7406\u89e3\uff0c\u56e0\u6b64\u6709\u5fc5\u8981\u660e\u786e Lake \u5bf9\u8fd9\u4e9b\u672f\u8bed\u7684\u5b9a\u4e49\uff1a
\u5305\uff08package\uff09 \u662f Lake \u4ee3\u7801\u5206\u53d1\u7684\u57fa\u672c\u5355\u5143\u3002\u5305\u53ef\u4ee5\u6765\u6e90\u4e8e\u672c\u5730\u6587\u4ef6\u7cfb\u7edf\uff0c\u4e5f\u53ef\u4ee5\u4ece\u7f51\u7edc\u4e0b\u8f7d\uff08\u5982\u901a\u8fc7 Git\uff09\u3002\u5305\u7684 lakefile \u4e2d\u7684 package
\u58f0\u660e\u51b3\u5b9a\u4e86\u5305\u7684\u540d\u79f0\uff0c\u5e76\u5b9a\u4e49\u5176\u57fa\u672c\u5c5e\u6027\u3002 lakefile \u662f\u8bb0\u5f55\u6574\u4e2a\u5305\u914d\u7f6e\u7684 Lean \u6587\u4ef6\u3002\u5b83\u5b9a\u4e49\u4e86\u5982\u4f55\u67e5\u770b\u3001\u7f16\u8f91\u3001\u6784\u5efa\u548c\u8fd0\u884c\u5305\u4e2d\u7684\u4ee3\u7801\uff0c\u5e76\u6307\u5b9a\u4e86\u6240\u4f9d\u8d56\u7684\u5176\u5b83\u5305\u3002 \u5982\u679c\u5305 B \u4f9d\u8d56\u5305 A\uff0c\u5305 A \u5c31\u662f\u5305 B \u7684 \u4f9d\u8d56\uff08dependency\uff09\uff0c\u800c\u5305 B \u5c31\u662f\u5305 A \u7684 \u4e0b\u6e38\u4f9d\u8d56\uff08dependent\uff09\u3002\u5305 A \u662f\u5305 B \u7684 \u4e0a\u6e38\uff0c\u53cd\u4e4b\u5305 B \u662f\u5305 A \u7684 \u4e0b\u6e38\u3002\u53c2\u89c1\u6dfb\u52a0\u4f9d\u8d56 \u4ee5\u4e86\u89e3\u5982\u4f55\u6307\u5b9a\u4f9d\u8d56\u3002 \u5de5\u4f5c\u7a7a\u95f4\uff08workspace\uff09 \u662f Lake \u4e2d \u6700\u5927\u7684\u7ec4\u7ec7\u5355\u5143\u3002\u5b83\u5c06\u4e00\u4e2a\u88ab\u79f0\u4e3a root(\u6839) \u7684\u5305\u3001\u4f20\u9012\u7684\u4f9d\u8d56\u4ee5\u53ca Lake \u7684\u73af\u5883\u7ec4\u5408\u5728\u4e00\u8d77\u3002\u6bcf\u4e2a\u5305\u90fd\u53ef\u4ee5\u4f5c\u4e3a\u5de5\u4f5c\u533a\u7684\u6839\uff0c\u5e76\u4e14\u5de5\u4f5c\u533a\u5c06\u4ece\u8fd9\u4e2a\u6839\u6d3e\u751f\u5176\u914d\u7f6e\u3002 \u6a21\u5757\uff08module\uff09 \u662f Lake \u6784\u5efa\u7cfb\u7edf\u53ef\u89c1\u7684\u6700\u5c0f\u4ee3\u7801\u5355\u5143\u3002\u6a21\u5757\u901a\u5e38\u7531\u4e00\u4e2a Lean \u6e90\u6587\u4ef6\u548c\u4e00\u7ec4\u4e8c\u8fdb\u5236\u5e93\u6587\u4ef6\uff08\u5982 olean
\u548c ilean
\uff0c\u82e5\u5f00\u542f precompileModules
\u9009\u9879\uff0c\u8fd8\u5305\u62ec\u7cfb\u7edf\u5171\u4eab\u5e93\uff09\u7ec4\u6210\u3002\u6a21\u5757\u4e4b\u95f4\u53ef\u4ee5\u76f8\u4e92\u5bfc\u5165\u4ee5\u4f7f\u7528\u5f7c\u6b64\u7684\u4ee3\u7801\uff0cLake \u7684\u4e3b\u8981\u4f5c\u7528\u5c31\u662f\u4fc3\u8fdb\u8fd9\u4e00\u8fc7\u7a0b\u3002 Lean \u5e93\uff08Lean library\uff09 \u662f\u4e00\u7ec4\u5171\u4eab\u540c\u4e00\u914d\u7f6e\u7684\u6a21\u5757\u96c6\u5408\u3002\u5176\u914d\u7f6e\u5b9a\u4e49\u4e86\u4e00\u7ec4 \u6a21\u5757\u6839\uff08module roots\uff09\uff0c\u7528\u4e8e\u786e\u5b9a\u54ea\u4e9b\u6a21\u5757\u5c5e\u4e8e\u8be5\u5e93\uff0c\u4ee5\u53ca\u4e00\u7ec4 \u6a21\u5757\u5168\u5c40\u6a21\u5f0f\uff08module globs\uff09\uff0c\u7528\u4e8e\u5728\u5e93\u7684 lake build
\u8fc7\u7a0b\u4e2d\u9009\u62e9\u8981\u6784\u5efa\u7684\u6a21\u5757\u3002\u53c2\u89c1Lean \u5e93\u90e8\u5206\u4e86\u89e3\u66f4\u591a\u8be6\u60c5\u3002 Lean \u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\uff08Lean binary executable\uff09 \u662f\u4e00\u4e2a\u7531\u6839\u6a21\u5757\uff08\u5176\u4e2d\u5e94\u5305\u542b main
\u5b9a\u4e49\uff09\u6784\u5efa\u7684\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\uff08\u5373\u7528\u6237\u5728\u672a\u5b89\u88c5 Lean \u65f6\u5c31\u80fd\u5728\u7535\u8111\u4e0a\u8fd0\u884c\u7684\u7a0b\u5e8f\uff09\u3002\u53c2\u89c1\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u90e8\u5206\u4e86\u89e3\u66f4\u591a\u8be6\u60c5\u3002 \u5916\u90e8\u5e93\uff08external library\uff09 \u662f\u7531\u5916\u90e8\u4ee3\u7801\uff08\u5982 C \u8bed\u8a00\uff09\u6784\u5efa\u7684\u539f\u751f\uff08\u9759\u6001\uff09\u5e93\uff0cLean \u4ee3\u7801\u9700\u8981\u8fd9\u4e9b\u5e93\u6765\u5b9e\u73b0\u529f\u80fd\uff08\u4f8b\u5982\uff0c\u4f7f\u7528 @[extern]
\u8c03\u7528\u5916\u90e8\u4ee3\u7801\uff09\u3002extern_lib
\u76ee\u6807\u7528\u4e8e\u544a\u77e5 Lake \u6b64\u7c7b\u9700\u6c42\u5e76\u6307\u793a Lake \u5982\u4f55\u6784\u5efa\u5fc5\u8981\u7684\u5e93\u3002Lake \u968f\u540e\u4f1a\u5728\u9002\u5f53\u65f6\u81ea\u52a8\u94fe\u63a5\u5916\u90e8\u5e93\uff0c\u4ee5\u4fbf\u4f7f Lean \u4ee3\u7801\u80fd\u591f\u8bbf\u95ee\u6240\u9700\u7684\u5916\u90e8\u51fd\u6570\uff08\u6216\u66f4\u4e13\u4e1a\u5730\u8bf4\uff0c\u662f\u5916\u90e8\u7b26\u53f7\uff09\u3002\u53c2\u89c1\u5916\u90e8\u5e93\u90e8\u5206\u4e86\u89e3\u66f4\u591a\u8be6\u60c5\u3002 \u76ee\u6807\uff08target\uff09 \u662f Lake \u6784\u5efa\u7684\u57fa\u672c\u5355\u5143\u3002\u4e00\u4e2a\u5305\u53ef\u4ee5\u5b9a\u4e49\u4efb\u610f\u6570\u91cf\u7684\u76ee\u6807\u3002\u6bcf\u4e2a\u76ee\u6807\u90fd\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7528\u4e8e\u6307\u793a Lake \u53bb\u6784\u5efa\u8be5\u76ee\u6807\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 lake build <target>
\uff09\u5e76\u5728\u5185\u90e8\u8ddf\u8e2a\u76ee\u6807\u7684\u6784\u5efa\u72b6\u6001\u3002Lake \u5b9a\u4e49\u4e86\u4e00\u7ec4\u5185\u7f6e\u76ee\u6807\u7c7b\u578b \u2014\u2014 Lean \u5e93\u3001\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6 \u548c \u5916\u90e8\u5e93 \u2014\u2014 \u4f46\u7528\u6237\u4e5f\u53ef\u4ee5\u5b9a\u4e49\u81ea\u5df1\u7684\u81ea\u5b9a\u4e49\u76ee\u6807\u3002\u590d\u6742\u7c7b\u578b\uff08\u5982\u5305\u3001\u5e93\u3001\u6a21\u5757\uff09\u5177\u6709\u591a\u4e2a facet\uff0c\u6bcf\u4e2a facet \u90fd\u7b97\u4f5c\u72ec\u7acb\u7684\u53ef\u6784\u5efa\u76ee\u6807\u3002\u53c2\u89c1\u5b9a\u4e49\u6784\u5efa\u76ee\u6807\u90e8\u5206\u4e86\u89e3\u66f4\u591a\u8be6\u60c5\u3002 facet \u662f\u4ece\u5176\u5b83\u7ec4\u7ec7\u5355\u4f4d\u6784\u5efa\u51fa\u7684\u5355\u4e2a\u5143\u7d20\uff08\u5982\u5305\u3001\u6a21\u5757\u3001\u5e93\u7b49\uff09\u3002\u4f8b\u5982\uff0cLake \u4ece\u5355\u4e2a\u6a21\u5757\u751f\u6210 olean
\u3001ilean
\u3001c
\u548c o
\u6587\u4ef6\uff0c\u8fd9\u4e9b\u7ec4\u4ef6\u90fd\u88ab\u79f0\u4e3a\u8be5\u6a21\u5757\u7684\u4e00\u4e2a facet\u3002\u540c\u6837\u5730\uff0cLake \u53ef\u4ee5\u4ece\u4e00\u4e2a\u5e93\u4e2d\u7f16\u8bd1\u9759\u6001\u548c\u5171\u4eab\u4e24\u79cd\u4e8c\u8fdb\u5236\u6587\u4ef6\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5e93\u540c\u65f6\u5177\u6709 static
\u548c shared
\u4e24\u79cd facet\u3002Lake \u8fd8\u5141\u8bb8\u7528\u6237\u5b9a\u4e49\u81ea\u5df1\u7684\u81ea\u5b9a\u4e49 facet \u6765\u4ece\u6a21\u5757\u548c\u5305\u6784\u5efa\uff0c\u4f46\u8fd9\u4e00\u7279\u6027\u5f53\u524d\u4ecd\u5728\u8bd5\u9a8c\u9636\u6bb5\u4e14\u5c1a\u65e0\u76f8\u5173\u6587\u6863\u3002 trace \u662f\u7528\u6765\u68c0\u67e5\u76ee\u6807\u662f\u5426\u6700\u65b0\uff08\u5373\u662f\u5426\u9700\u8981\u91cd\u65b0\u6784\u5efa\uff09\u7684\u4e00\u4e9b\u6570\u636e\uff08\u901a\u5e38\u662f\u54c8\u5e0c\u503c\uff09\u3002\u5982\u679c\u5df2\u6784\u5efa\u76ee\u6807\u7684 trace \u4e0e\u6784\u5efa\u8fc7\u7a0b\u4e2d\u8ba1\u7b97\u7684 trace \u76f8\u5339\u914d\uff0c\u5219\u76ee\u6807\u88ab\u8ba4\u4e3a\u662f\u6700\u65b0\u7684\u3002\u76ee\u6807\u7684 trace \u6e90\u4e8e\u5176\u5404\u79cd**\u8f93\u5165**\uff08\u5982\u6e90\u6587\u4ef6\u3001Lean \u5de5\u5177\u94fe\u3001\u5bfc\u5165\u7b49\uff09\u3002 "},{"location":"references/lake-doc/#_3","title":"\u5305\u914d\u7f6e\u9009\u9879","text":"Lake \u63d0\u4f9b\u4e86\u591a\u79cd\u591a\u6837\u7684\u5305\u914d\u7f6e\u9009\u9879\u3002
"},{"location":"references/lake-doc/#_4","title":"\u5e03\u5c40","text":"\u8fd9\u4e9b\u9009\u9879\u63a7\u5236\u5305\u53ca\u5176\u6784\u5efa\u76ee\u5f55\u7684\u9876\u5c42\u76ee\u5f55\u5e03\u5c40\u3002\u5e93\u3001\u53ef\u6267\u884c\u6587\u4ef6\u548c\u5305\u5185\u7684\u76ee\u6807\u6307\u5b9a\u7684\u8fdb\u4e00\u6b65\u8def\u5f84\u76f8\u5bf9\u4e8e\u8fd9\u4e9b\u76ee\u5f55\u3002
packagesDir
: Lake \u4e0b\u8f7d\u8fdc\u7a0b\u4f9d\u8d56\u9879\u7684\u76ee\u5f55\u3002\u9ed8\u8ba4\u4e3a .lake/packages
\u3002 srcDir
: \u5305\u542b\u5305\u7684 Lean \u6e90\u6587\u4ef6\u7684\u76ee\u5f55\u3002\u9ed8\u8ba4\u4e3a\u5305\u76ee\u5f55\u3002 buildDir
: Lake \u8f93\u51fa\u5305\u6784\u5efa\u7ed3\u679c\u7684\u76ee\u5f55\u3002\u9ed8\u8ba4\u503c\u4e3a build
\u3002 leanLibDir
: Lake \u8f93\u51fa\u5305\u7684\u4e8c\u8fdb\u5236 Lean \u5e93\u6587\u4ef6\uff08\u5982 .olean
\u3001.ilean
\u6587\u4ef6\uff09\u7684\u6784\u5efa\u5b50\u76ee\u5f55\u3002\u9ed8\u8ba4\u4e3a lib
\u3002 nativeLibDir
: Lake \u8f93\u51fa\u5305\u7684\u672c\u5730\u5e93\u6587\u4ef6\uff08\u5982 .a
\u3001.so
\u3001.dll
\u6587\u4ef6\uff09\u7684\u6784\u5efa\u5b50\u76ee\u5f55\u3002\u9ed8\u8ba4\u4e3a lib
\u3002 binDir
: Lake \u8f93\u51fa\u5305\u7684\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u7684\u6784\u5efa\u5b50\u76ee\u5f55\u3002\u9ed8\u8ba4\u4e3a bin
\u3002 irDir
: Lake \u8f93\u51fa\u5305\u7684\u4e2d\u95f4\u7ed3\u679c\uff08\u5982 .c
\u3001.o
\u6587\u4ef6\uff09\u7684\u6784\u5efa\u5b50\u76ee\u5f55\u3002\u9ed8\u8ba4\u4e3a ir
\u3002 "},{"location":"references/lake-doc/#_5","title":"\u6784\u5efa\u4e0e\u8fd0\u884c","text":"\u8fd9\u4e9b\u9009\u9879\u914d\u7f6e\u5305\u4e2d\u4ee3\u7801\u7684\u6784\u5efa\u548c\u8fd0\u884c\u65b9\u5f0f\u3002\u5305\u5185\u7684\u5e93\u3001\u53ef\u6267\u884c\u6587\u4ef6\u548c\u5176\u4ed6\u76ee\u6807\u53ef\u4ee5\u8fdb\u4e00\u6b65\u6dfb\u52a0\u5230\u6b64\u914d\u7f6e\u7684\u90e8\u5206\u5185\u5bb9\u3002
platformIndependent
: \u786e\u5b9a Lake \u662f\u5426\u5e94\u5047\u8bbe Lean \u6a21\u5757\u5e73\u53f0\u65e0\u5173\u3002\u5373\uff0cLake \u662f\u5426\u5e94\u5728\u6a21\u5757\u7684 trace \u4e2d\u5305\u542b\u5e73\u53f0\u53ca\u5176\u4f9d\u8d56\u7684\u5143\u7d20\u3002\u6709\u5173\u66f4\u591a\u8be6\u60c5\uff0c\u8bf7\u53c2\u9605 Lake.LeanConfig.platformIndependent
\u7684\u6587\u6863\u5b57\u7b26\u4e32\u3002\u9ed8\u8ba4\u503c\u4e3a none
\u3002 precompileModules
: \u662f\u5426\u5c06\u6bcf\u4e2a\u6a21\u5757\u7f16\u8bd1\u4e3a\u672c\u5730\u5171\u4eab\u5e93\u6587\u4ef6\uff0c\u8be5\u6587\u4ef6\u5728\u6a21\u5757\u5bfc\u5165\u65f6\u52a0\u8f7d\u3002\u8fd9\u52a0\u5feb\u4e86\u5143\u7a0b\u5e8f\u7684\u8bc4\u4f30\uff0c\u5e76\u5141\u8bb8\u89e3\u91ca\u5668\u8fd0\u884c\u5e26\u6709 @[extern]
\u6807\u8bb0\u7684\u51fd\u6570\u3002\u9ed8\u8ba4\u503c\u4e3a false
\u3002 moreServerOptions
: \u4f20\u9012\u7ed9\u7531 lake serve
\u542f\u52a8\u7684 Lean \u8bed\u8a00\u670d\u52a1\u5668\uff08\u5373 lean --server
\uff09\u7684\u9644\u52a0\u9009\u9879\u6570\u7ec4\u3002 moreGlobalServerArgs
: \u4f20\u9012\u7ed9 lean --server
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\uff0c\u8fd9\u4e9b\u53c2\u6570\u9002\u7528\u4e8e\u6b64\u5305\u53ca\u540c\u4e00\u670d\u52a1\u5668\u4f1a\u8bdd\u4e2d\u7684\u5176\u4ed6\u4efb\u4f55\u5185\u5bb9\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 go-to-definition \u5728\u540c\u4e00\u4f1a\u8bdd\u4e2d\u6d4f\u89c8\u5176\u4ed6\u5305\u65f6\uff09\u3002 buildType
: \u5305\u4e2d\u76ee\u6807\u7684 BuildType
\uff08\u53c2\u89c1 CMAKE_BUILD_TYPE
\uff09\u3002\u53ef\u4ee5\u4e3a debug
\u3001relWithDebInfo
\u3001minSizeRel
\u6216 release
\u5176\u4e2d\u4e4b\u4e00\u3002\u9ed8\u8ba4\u503c\u4e3a release
\u3002 leanOptions
: \u4f20\u9012\u7ed9\u7531 lake serve
\u542f\u52a8\u7684 Lean \u8bed\u8a00\u670d\u52a1\u5668\uff08\u5373 lean --server
\uff09\u548c\u5728\u7f16\u8bd1 Lean \u6e90\u6587\u4ef6\u65f6\u4f20\u9012\u7ed9 lean
\u7684\u9644\u52a0\u9009\u9879\u3002 moreLeanArgs
: \u7f16\u8bd1 Lean \u6e90\u6587\u4ef6\u65f6\u4f20\u9012\u7ed9 lean
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\u3002 weakLeanArgs
: \u7f16\u8bd1 Lean \u6e90\u6587\u4ef6\u65f6\u4f20\u9012\u7ed9 lean
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\u3002\u4e0e moreLeanArgs
\u4e0d\u540c\u7684\u662f\uff0c\u8fd9\u4e9b\u53c2\u6570\u4e0d\u4f1a\u5f71\u54cd\u6784\u5efa\u7ed3\u679c\u7684 trace\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728\u4e0d\u89e6\u53d1\u91cd\u6784\u7684\u60c5\u51b5\u4e0b\u66f4\u6539\u3002\u5728 moreLeanArgs
\u4e4b\u524d\u4f20\u9012\u3002 moreLeancArgs
: \u7f16\u8bd1\u7531 lean
\u751f\u6210\u7684 C \u6e90\u6587\u4ef6\u65f6\u4f20\u9012\u7ed9 leanc
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\u3002Lake \u5df2\u7ecf\u6839\u636e buildType
\u4f20\u9012\u4e86\u4e00\u4e9b\u6807\u5fd7\uff0c\u4f46\u4f60\u53ef\u4ee5\u901a\u8fc7\u6dfb\u52a0 -O0
\u548c -UNDEBUG
\u4e4b\u7c7b\u7684\u53c2\u6570\u6765\u66f4\u6539\u5b83\u3002 weakLeancArgs
: \u7f16\u8bd1\u7531 lean
\u751f\u6210\u7684 C \u6e90\u6587\u4ef6\u65f6\u4f20\u9012\u7ed9 leanc
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\u3002\u4e0e moreLeancArgs
\u4e0d\u540c\u7684\u662f\uff0c\u8fd9\u4e9b\u53c2\u6570\u4e0d\u4f1a\u5f71\u54cd\u6784\u5efa\u7ed3\u679c\u7684 trace\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728\u4e0d\u89e6\u53d1\u91cd\u5efa\u7684\u60c5\u51b5\u4e0b\u66f4\u6539\u3002\u5728 moreLeancArgs
\u4e4b\u524d\u4f20\u9012\u3002 moreLinkArgs
: \u94fe\u63a5\u65f6\uff08\u4f8b\u5982\uff0c\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u6216\u5171\u4eab\u5e93\uff09\u4f20\u9012\u7ed9 leanc
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\u3002\u8fd9\u4e9b\u53c2\u6570\u5c06\u4f4d\u4e8e extern_lib
\u76ee\u6807\u7684\u8def\u5f84\u4e4b\u540e\u3002 weakLinkArgs
: \u94fe\u63a5\u65f6\uff08\u4f8b\u5982\uff0c\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u6216\u5171\u4eab\u5e93\uff09\u4f20\u9012\u7ed9 leanc
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\u3002\u4e0e moreLinkArgs
\u4e0d\u540c\u7684\u662f\uff0c\u8fd9\u4e9b\u53c2\u6570\u4e0d\u4f1a\u5f71\u54cd\u6784\u5efa\u7ed3\u679c\u7684 trace\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728\u4e0d\u89e6\u53d1\u91cd\u5efa\u7684\u60c5\u51b5\u4e0b\u66f4\u6539\u3002\u5728 moreLinkArgs
\u4e4b\u524d\u4f20\u9012\u3002 extraDepTargets
: \u5305\u5e94\u59cb\u7ec8\u6700\u5148\u6784\u5efa\u7684\u76ee\u6807\u540d\u79f0\u6570\u7ec4\u3002 "},{"location":"references/lake-doc/#_6","title":"\u6d4b\u8bd5\u4e0e\u68c0\u67e5","text":"CLI \u547d\u4ee4 lake test
\u548c lake lint
\u4f7f\u7528\u7531\u5de5\u4f5c\u7a7a\u95f4\u7684\u6839\u5305\u914d\u7f6e\u7684\u5b9a\u4e49\u6765\u6267\u884c\u6d4b\u8bd5\u548c\u68c0\u67e5\uff08\u8fd9\u79f0\u4e3a\u6d4b\u8bd5\u6216\u68c0\u67e5 driver\uff09\u3002\u5728 Lean \u914d\u7f6e\u6587\u4ef6\u4e2d\uff0c\u53ef\u4ee5\u901a\u8fc7\u5c06 @[test_driver]
\u6216 @[lint_driver]
\u5e94\u7528\u4e8e script
\u3001lean_exe
\u6216 lean_lib
\u6765\u6307\u5b9a\u8fd9\u4e9b\u5b9a\u4e49\u3002\u4e5f\u53ef\u4ee5\u901a\u8fc7\u5305\u4e2d\u7684\u4ee5\u4e0b\u9009\u9879\uff08\u4ee5 Lean \u6216 TOML \u683c\u5f0f\uff09\u8fdb\u884c\u914d\u7f6e\u3002
testDriver
: \u9a71\u52a8 lake test
\u7684\u811a\u672c\u3001\u53ef\u6267\u884c\u6587\u4ef6\u6216\u5e93\u7684\u540d\u79f0\u3002 testDriverArgs
: \u4f20\u9012\u7ed9\u5305\u7684\u6d4b\u8bd5\u9a71\u52a8\u7a0b\u5e8f\u7684\u53c2\u6570\u6570\u7ec4\u3002 lintDriver
: lake lint
\u4f7f\u7528\u7684\u811a\u672c\u6216\u53ef\u6267\u884c\u6587\u4ef6\u7684\u540d\u79f0\u3002\u5e93\u4e0d\u80fd\u7528\u4f5c\u68c0\u67e5\u9a71\u52a8\u7a0b\u5e8f\u3002 lintDriverArgs
: \u4f20\u9012\u7ed9\u5305\u7684\u68c0\u67e5\u9a71\u52a8\u7a0b\u5e8f\u7684\u53c2\u6570\u6570\u7ec4\u3002 \u4f60\u53ef\u4ee5\u4f7f\u7528\u8bed\u6cd5 <pkg>/<name>
\u5c06\u4f9d\u8d56\u9879\u4e2d\u7684\u5b9a\u4e49\u6307\u5b9a\u4e3a\u5305\u7684\u6d4b\u8bd5\u6216\u68c0\u67e5\u9a71\u52a8\u7a0b\u5e8f\u3002\u53ef\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u5c06\u88ab\u6784\u5efa\u7136\u540e\u8fd0\u884c\uff0c\u811a\u672c\u9a71\u52a8\u7a0b\u5e8f\u5c06\u4ec5\u8fd0\u884c\uff0c\u800c\u5e93\u9a71\u52a8\u7a0b\u5e8f\u5c06\u4ec5\u6784\u5efa\u3002\u811a\u672c\u6216\u53ef\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u4f1a\u8fd0\u884c\u5305\u914d\u7f6e\u7684\u4efb\u4f55\u53c2\u6570\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 testDriverArgs
\uff09\uff0c\u7136\u540e\u662f CLI \u4e2d\u6307\u5b9a\u7684\u4efb\u4f55\u53c2\u6570\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 lake lint -- <args>...
\uff09\u3002
"},{"location":"references/lake-doc/#_7","title":"\u4e91\u53d1\u5e03","text":"\u8fd9\u4e9b\u9009\u9879\u4e3a\u5305\u5b9a\u4e49\u4e91\u53d1\u5e03\u3002\u8be6\u7ec6\u4fe1\u606f\u53c2\u89c1GitHub \u53d1\u5e03\u6784\u5efa\u90e8\u5206\u3002
releaseRepo
: \u4e0a\u4f20\u548c\u4e0b\u8f7d\u6b64\u5305\u53d1\u5e03\u7248\u672c\u7684 GitHub \u4ed3\u5e93 URL\u3002\u5982\u679c\u4e3a none
\uff08\u9ed8\u8ba4\uff09\uff0c\u5219\u4e0b\u8f7d\u65f6\uff0cLake \u4f7f\u7528\u5305\u7684\u4e0b\u8f7d URL\uff08\u5982\u679c\u662f\u4f9d\u8d56\u9879\uff09\uff0c\u4e0a\u4f20\u65f6\u4f7f\u7528 gh
\u7684\u9ed8\u8ba4 URL\u3002 buildArchive
: GitHub \u4e91\u53d1\u5e03\u7684\u6784\u5efa\u5f52\u6863\u540d\u79f0\u3002\u9ed8\u8ba4\u4e3a {(pkg-)name}-{System.Platform.target}.tar.gz
\u3002 preferReleaseBuild
: \u5f53\u6b64\u5305\u7528\u4f5c\u4f9d\u8d56\u9879\u65f6\uff0c\u662f\u5426\u4f18\u5148\u4e0b\u8f7d\u9884\u6784\u5efa\u53d1\u5e03\uff08\u4ece GitHub\uff09\uff0c\u800c\u4e0d\u662f\u4ece\u6e90\u7801\u6784\u5efa\u6b64\u5305\u3002 "},{"location":"references/lake-doc/#_8","title":"\u8bbe\u5b9a\u6784\u5efa\u76ee\u6807","text":"\u4e00\u4e2a Lake \u5305\u53ef\u80fd\u6709\u8bb8\u591a\u7684\u6784\u5efa\u76ee\u6807\uff0c\u6bd4\u5982\u4e0d\u540c\u7684 Lean \u5e93\u548c\u8bf8\u591a\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u3002\u4e0d\u8bba\u6570\u91cf\u591a\u5c11\uff0c\u4f60\u603b\u53ef\u4ee5\u5728 @[default_target]
\u540e\u58f0\u660e\u5b83\u4eec\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u7528 lake build
\u8f7b\u677e\u6784\u5efa\u3002
"},{"location":"references/lake-doc/#lean","title":"Lean \u5e93","text":"Lean \u5e93\u76ee\u6807\u5b9a\u4e49\u4e86\u53ef\u4f9b import
\u7684 Lean \u6a21\u5757\u4ee5\u53ca\u5b83\u4eec\u7684\u6784\u5efa\u65b9\u5f0f\u3002
\u8bed\u6cd5
lean_lib \u00abtarget-name\u00bb where\n -- \u914d\u7f6e\u9009\u9879\u4ece\u8fd9\u91cc\u5f00\u59cb\n
[[lean_lib]]\nname = \"\u00abtarget-name\u00bb\"\n# \u66f4\u591a\u914d\u7f6e\u9009\u9879\u4ece\u8fd9\u91cc\u5f00\u59cb\n
\u914d\u7f6e\u9009\u9879
srcDir
: \u5305\u76ee\u5f55\u4e0b\u7684\u5b50\u76ee\u5f55\uff0c\u5305\u542b\u5e93\u7684\u6e90\u6587\u4ef6\u3002\u9ed8\u8ba4\u503c\u4e3a\u5305\u7684 srcDir
\u3002\uff08\u8fd9\u5c06\u4f5c\u4e3a -R
\u9009\u9879\u4f20\u9012\u7ed9 lean
\u3002\uff09 roots
: \u5e93\u7684\u6839\u6a21\u5757\u540d\u6570\u7ec4\u3002\u8fd9\u4e9b\u6839\u6a21\u5757\u7684\u5b50\u6a21\u5757\uff08\u4f8b\u5982\uff0cLib
\u7684 Lib.Foo
\uff09\u88ab\u89c6\u4e3a\u5e93\u7684\u4e00\u90e8\u5206\u3002\u9ed8\u8ba4\u503c\u4e3a\u76ee\u6807\u540d\u7684\u5355\u4e00\u6839\u3002 globs
: \u6784\u5efa\u5e93\u7684\u6a21\u5757 glob \u6570\u7ec4\u3002\u672f\u8bed glob
\u6765\u6e90\u4e8e Unix \u7684 \u6587\u4ef6 glob\uff08\u4f8b\u5982\uff0cfoo/*
\uff09\u3002\u5b50\u6a21\u5757 glob \u6784\u5efa\u6a21\u5757\u76ee\u5f55\u4e2d\u7684\u6bcf\u4e2a Lean \u6e90\u6587\u4ef6\uff08\u5373\uff0c Glob.submodules `Foo
\u57fa\u672c\u4e0a\u7b49\u540c\u4e8e\u7406\u8bba\u4e0a\u7684 import Foo.*
\uff09\u3002glob \u6587\u4ef6\u7684\u672c\u5730\u5bfc\u5165\uff08\u5373\u5de5\u4f5c\u533a\u7684\u5176\u4ed6\u6a21\u5757\uff09\u4e5f\u4f1a\u9012\u5f52\u6784\u5efa\u3002\u9ed8\u8ba4\u503c\u4e3a\u5e93\u4e2d\u6bcf\u4e2a roots
\u7684 Glob.one
\u3002 libName
: \u5e93\u7684\u5b57\u7b26\u4e32\u540d\u79f0\u3002\u7528\u4f5c\u5176\u9759\u6001\u548c\u52a8\u6001\u4e8c\u8fdb\u5236\u6587\u4ef6\u540d\u7684\u57fa\u7840\u3002\u9ed8\u8ba4\u503c\u4e3a\u76ee\u6807\u540d\u79f0\u3002 extraDepTargets
: \u5728\u5e93\u6a21\u5757\u4e4b\u524d\u6784\u5efa\u7684 \u76ee\u6807 \u540d\u79f0\u6570\u7ec4\u3002 defaultFacets
: \u5e93\u7684 facets \u6570\u7ec4\uff0c\u7528\u4e8e\u5728 lake build
\u4e2d\u6784\u5efa\u5e93\u3002\u4f8b\u5982\uff0c\u5c06\u5176\u8bbe\u7f6e\u4e3a #[LeanLib.sharedLib]
\u5c06\u6784\u5efa\u5171\u4eab\u5e93 facet\u3002 nativeFacets
: \u4e00\u4e2a\u51fd\u6570 (shouldExport : Bool) \u2192 Array
\uff0c\u786e\u5b9a\u6784\u5efa\u5e76\u7ec4\u5408\u5230\u5e93\u7684\u9759\u6001\u548c\u5171\u4eab\u5e93\u4e2d\u7684 \u6a21\u5757 facets\u3002\u5982\u679c shouldExport
\u4e3a\u771f\uff0c\u6a21\u5757 facets \u5e94\u5bfc\u51fa\u7528\u6237\u53ef\u80fd\u671f\u671b\u5728\u5e93\u4e2d\u67e5\u627e\u7684\u4efb\u4f55\u7b26\u53f7\u3002\u4f8b\u5982\uff0cLean \u89e3\u91ca\u5668\u5c06\u4f7f\u7528\u94fe\u63a5\u5e93\u4e2d\u7684\u5bfc\u51fa\u7b26\u53f7\u3002\u9ed8\u8ba4\u503c\u4e3a Module.oExportFacet
\u7684\u5355\u4f8b\uff08\u5982\u679c shouldExport
\uff09\u6216 Module.oFacet
\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u4ece Lean \u6e90\u6587\u4ef6\u7f16\u8bd1\u7684\u76ee\u6807\u6587\u4ef6\uff0c\u53ef\u80fd\u5305\u542b\u5bfc\u51fa\u7684 Lean \u7b26\u53f7\u3002 platformIndependent
\u3001precompileModules
\u3001buildType
\u3001leanOptions
\u3001<more|weak><Lean|Leanc|Link>Args
\u3001moreServerOptions
\uff1a\u589e\u5f3a\u5305\u7684\u76f8\u5e94\u914d\u7f6e\u9009\u9879\u3002\u5e93\u7684\u53c2\u6570\u7d27\u968f\u5176\u540e\uff0c\u5982\u679c\u5e93\u6216\u5305\u90fd\u9884\u7f16\u8bd1\uff0c\u5219\u6a21\u5757\u4f1a\u88ab\u9884\u7f16\u8bd1\uff0cplatformIndependent
\u5728 none
\u60c5\u51b5\u4e0b\u4f1a\u56de\u9000\u5230\u5305\uff0c\u5e76\u4e14\u6784\u5efa\u7c7b\u578b\u662f\u4e24\u8005\u4e2d\u7684\u6700\u4f4e\u503c\uff08debug
\u662f\u6700\u4f4e\u7684\uff0c\u800c release
\u662f\u6700\u9ad8\u7684\uff09\u3002 "},{"location":"references/lake-doc/#_9","title":"\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6","text":"\u4e00\u4e2a Lean \u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u76ee\u6807\u4ece\u5e26\u6709 main
\u51fd\u6570\u7684 Lean \u6a21\u5757\u6587\u4ef6\u6784\u5efa\u51fa\u53ef\u6267\u884c\u6587\u4ef6\u3002
\u8bed\u6cd5
lean_exe \u00abtarget-name\u00bb where\n -- \u914d\u7f6e\u9009\u9879\u4ece\u8fd9\u91cc\u5f00\u59cb\n
[[lean_exe]]\nname = \"\u00abtarget-name\u00bb\"\n# \u66f4\u591a\u914d\u7f6e\u9009\u9879\u4ece\u8fd9\u91cc\u5f00\u59cb\n
\u914d\u7f6e\u9009\u9879
srcDir
: \u5305\u76ee\u5f55\u4e0b\u7684\u5b50\u76ee\u5f55\uff0c\u5305\u542b\u53ef\u6267\u884c\u6587\u4ef6\u7684\u6e90\u6587\u4ef6\u3002\u9ed8\u8ba4\u503c\u4e3a\u5305\u7684 srcDir
\u3002\uff08\u8fd9\u5c06\u4f5c\u4e3a -R
\u9009\u9879\u4f20\u9012\u7ed9 lean
\u3002\uff09 root
: \u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u7684\u6839\u6a21\u5757\u540d\u3002\u5e94\u5305\u542b\u4e00\u4e2a main
\u5b9a\u4e49\uff0c\u5b83\u5c06\u4f5c\u4e3a\u7a0b\u5e8f\u7684\u5165\u53e3\u70b9\u3002\u901a\u8fc7\u9012\u5f52\u6784\u5efa\u5176\u672c\u5730\u5bfc\u5165\uff08\u5373\u5de5\u4f5c\u533a\u7684\u5176\u4ed6\u6a21\u5757\uff09\u6765\u6784\u5efa\u6839\u3002\u9ed8\u8ba4\u503c\u4e3a\u76ee\u6807\u540d\u79f0\u3002 exeName
: \u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u7684\u5b57\u7b26\u4e32\u540d\u79f0\u3002\u9ed8\u8ba4\u503c\u4e3a\u76ee\u6807\u540d\u79f0\uff0c\u4e14\u5176\u4e2d\u7684 .
\u66ff\u6362\u4e3a -
\u3002 extraDepTargets
: \u5728\u53ef\u6267\u884c\u6587\u4ef6\u6a21\u5757\u4e4b\u524d\u6784\u5efa\u7684 \u76ee\u6807 \u540d\u79f0\u6570\u7ec4\u3002 nativeFacets
: \u4e00\u4e2a\u51fd\u6570 (shouldExport : Bool) \u2192 Array
\uff0c\u786e\u5b9a\u5c06\u54ea\u4e9b \u6a21\u5757 facets \u6784\u5efa\u5e76\u94fe\u63a5\u5230\u53ef\u6267\u884c\u6587\u4ef6\u4e2d\u3002\u5982\u679c shouldExport
\u4e3a\u771f\uff0c\u6a21\u5757 facets \u5e94\u5bfc\u51fa\u7528\u6237\u53ef\u80fd\u671f\u671b\u5728\u5e93\u4e2d\u67e5\u627e\u7684\u4efb\u4f55\u7b26\u53f7\u3002\u4f8b\u5982\uff0cLean \u89e3\u91ca\u5668\u5c06\u4f7f\u7528\u94fe\u63a5\u5e93\u4e2d\u7684\u5bfc\u51fa\u7b26\u53f7\u3002\u9ed8\u8ba4\u503c\u4e3a Module.oExportFacet
\u7684\u5355\u4f8b\uff08\u5982\u679c shouldExport
\uff09\u6216 Module.oFacet
\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u4ece Lean \u6e90\u6587\u4ef6\u7f16\u8bd1\u7684\u76ee\u6807\u6587\u4ef6\uff0c\u53ef\u80fd\u5305\u542b\u5bfc\u51fa\u7684 Lean \u7b26\u53f7\u3002 supportInterpreter
: \u662f\u5426\u5c06\u53ef\u6267\u884c\u6587\u4ef6\u4e2d\u7684\u7b26\u53f7\u66b4\u9732\u7ed9 Lean \u89e3\u91ca\u5668\u3002\u8fd9\u5141\u8bb8\u53ef\u6267\u884c\u6587\u4ef6\u89e3\u91ca Lean \u6587\u4ef6\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 Lean.Elab.runFrontend
\uff09\u3002\u5728\u5b9e\u73b0\u65b9\u9762\uff0c\u5728 Windows \u4e0a\uff0cLean \u5171\u4eab\u5e93\u94fe\u63a5\u5230\u53ef\u6267\u884c\u6587\u4ef6\uff0c\u5176\u4ed6\u7cfb\u7edf\u4e0a\uff0c\u53ef\u6267\u884c\u6587\u4ef6\u4f7f\u7528 -rdynamic
\u8fdb\u884c\u94fe\u63a5\u3002\u8fd9\u4f1a\u589e\u52a0 Linux \u4e0a\u4e8c\u8fdb\u5236\u6587\u4ef6\u7684\u5927\u5c0f\uff0c\u5728 Windows \u4e0a\uff0c\u9700\u8981 libInit_shared.dll
\u548c libleanshared.dll
\u4e0e\u53ef\u6267\u884c\u6587\u4ef6\u5171\u540c\u5b9a\u4f4d\u6216\u4f5c\u4e3a PATH
\u7684\u4e00\u90e8\u5206\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 lake exe
\uff09\u3002\u56e0\u6b64\uff0c\u6b64\u529f\u80fd\u5e94\u4ec5\u5728\u5fc5\u8981\u65f6\u542f\u7528\u3002\u9ed8\u8ba4\u503c\u4e3a false
\u3002 platformIndependent
\u3001precompileModules
\u3001buildType
\u3001leanOptions
\u3001<more|weak><Lean|Leanc|Link>Args
\u3001moreServerOptions
\uff1a\u589e\u52a0\u5305\u7684\u76f8\u5e94\u914d\u7f6e\u9009\u9879\u3002\u53ef\u6267\u884c\u6587\u4ef6\u7684\u53c2\u6570\u5728\u5e93\u53c2\u6570\u4e4b\u540e\uff0c\u5982\u679c\u5e93\u6216\u5305\u90fd\u9884\u7f16\u8bd1\uff0c\u5219\u6a21\u5757\u4f1a\u88ab\u9884\u7f16\u8bd1\uff0cplatformIndependent
\u5728 none
\u60c5\u51b5\u4e0b\u4f1a\u56de\u9000\u5230\u5305\uff0c\u5e76\u4e14\u6784\u5efa\u7c7b\u578b\u662f\u4e24\u8005\u4e2d\u7684\u6700\u4f4e\u503c\uff08debug
\u662f\u6700\u4f4e\u7684\uff0c\u800c release
\u662f\u6700\u9ad8\u7684\uff09\u3002 "},{"location":"references/lake-doc/#_10","title":"\u5916\u90e8\u5e93","text":"\u5916\u90e8\u5e93\u76ee\u6807\u662f\u4e00\u4e2a\u975e Lean \u7684**\u9759\u6001**\u5e93\uff0c\u5c06\u94fe\u63a5\u5230\u5305\u53ca\u5176\u4f9d\u8d56\u9879\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\uff08\u4f8b\u5982\uff0c\u5b83\u4eec\u7684\u5171\u4eab\u5e93\u548c\u53ef\u6267\u884c\u6587\u4ef6\uff09\u3002
\u91cd\u8981: \u4e3a\u4e86\u5728 precompileModules
\u5f00\u542f\u65f6\u5916\u90e8\u5e93\u6b63\u786e\u94fe\u63a5\uff0c\u7531 extern_lib
\u76ee\u6807\u751f\u6210\u7684\u9759\u6001\u5e93\u5fc5\u987b\u9075\u5faa\u5e73\u53f0\u7684\u5e93\u547d\u540d\u7ea6\u5b9a\uff08\u5373\u5728 Windows \u4e0a\u547d\u540d\u4e3a foo.a
\uff0c\u5728 Unix \u4e0a\u547d\u540d\u4e3a libfoo.a
\uff09\u3002\u4e3a\u4e86\u7b80\u5316\u6b64\u64cd\u4f5c\uff0c\u53ef\u4ee5\u4f7f\u7528 Lake.nameToStaticLib
\u5b9e\u7528\u51fd\u6570\u5c06\u5e93\u540d\u79f0\u8f6c\u6362\u4e3a\u9002\u5408\u5e73\u53f0\u7684\u6b63\u786e\u6587\u4ef6\u540d\u79f0\u3002
\u8bed\u6cd5
extern_lib \u00abtarget-name\u00bb (pkg : NPackage _package.name) :=\n -- \u751f\u6210\u9759\u6001\u5e93\u7684\u6784\u5efa\u51fd\u6570\n
\u8be5\u58f0\u660e\u672c\u8d28\u4e0a\u662f\u56f4\u7ed5 System.FilePath
\u76ee\u6807 \u7684\u5305\u88c5\u3002\u7c7b\u4f3c\u4e8e\u8fd9\u6837\u7684\u76ee\u6807\uff0cpkg
\u53c2\u6570\u53ca\u5176\u7c7b\u578b\u8bf4\u660e\u662f\u53ef\u9009\u7684\uff0c\u4e3b\u4f53\u5e94\u4e3a\u7c7b\u578b FetchM (BuildJob System.FilePath)
\u7684\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u6784\u5efa\u9759\u6001\u5e93\u3002pkg
\u53c2\u6570\u7684\u7c7b\u578b\u4e3a NPackage _package.name
\uff0c\u4ee5\u786e\u51ff\u5730\u8868\u660e\u8fd9\u662f\u5b9a\u4e49\u5916\u90e8\u5e93\u7684\u5305\u3002
"},{"location":"references/lake-doc/#_11","title":"\u81ea\u5b9a\u4e49\u76ee\u6807","text":"\u53ef\u4ee5\u901a\u8fc7 lake build <target-name>
\u6784\u5efa\u7684\u4efb\u610f\u76ee\u6807\u3002
\u8bed\u6cd5
target \u00abtarget-name\u00bb (pkg : NPackage _package.name) : \u03b1 :=\n -- \u751f\u6210\u4e00\u4e2a `BuildJob \u03b1` \u7684\u6784\u5efa\u51fd\u6570\n
pkg
\u53c2\u6570\u53ca\u5176\u7c7b\u578b\u8bf4\u660e\u662f\u53ef\u9009\u7684\uff0c\u4e3b\u4f53\u5e94\u4e3a\u7c7b\u578b FetchM (BuildJob \u03b1)
\u7684\u8868\u8fbe\u5f0f\u3002pkg
\u53c2\u6570\u7684\u7c7b\u578b\u4e3a NPackage _package.name
\uff0c\u4ee5\u786e\u51ff\u5730\u8868\u660e\u8fd9\u662f\u5b9a\u4e49\u8be5\u76ee\u6807\u7684\u5305\u3002
"},{"location":"references/lake-doc/#facet","title":"\u5b9a\u4e49\u65b0 facet","text":"Lake \u5305\u4e5f\u53ef\u4ee5\u4e3a\u5305\u3001\u6a21\u5757\u548c\u5e93\u5b9a\u4e49\u65b0\u7684 facet\u3002\u5b9a\u4e49\u540e\uff0c\u65b0 facet\uff08\u4f8b\u5982 facet
\uff09\u53ef\u4ee5\u5728\u5176\u7c7b\u578b\u7684\u4efb\u4f55\u5f53\u524d\u6216\u672a\u6765\u5bf9\u8c61\u4e0a\u6784\u5efa\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 lake build pkg:facet
\u8fdb\u884c\u5305 facet \u7684\u6784\u5efa\uff09\u3002\u6a21\u5757 facet \u4e5f\u53ef\u4ee5\u63d0\u4f9b\u7ed9 LeanLib.nativeFacets
\u4ee5\u4fbf\u5728\u751f\u6210\u5171\u4eab\u5e93\u65f6\u7531 Lake \u81ea\u52a8\u6784\u5efa\u548c\u4f7f\u7528\u3002
\u8bed\u6cd5
package_facet \u00abfacet-name\u00bb (pkg : Package) : \u03b1 :=\n -- \u751f\u6210\u4e00\u4e2a `BuildJob \u03b1` \u7684\u6784\u5efa\u51fd\u6570\n\nmodule_facet \u00abfacet-name\u00bb (mod : Module) : \u03b1 :=\n -- \u751f\u6210\u4e00\u4e2a `BuildJob \u03b1` \u7684\u6784\u5efa\u51fd\u6570\n\nlibrary_facet \u00abfacet-name\u00bb (lib : LeanLib) : \u03b1 :=\n -- \u751f\u6210\u4e00\u4e2a `BuildJob \u03b1` \u7684\u6784\u5efa\u51fd\u6570\n
\u5728\u8fd9\u4e9b\u5b9a\u4e49\u4e2d\uff0c\u76ee\u6807\u53c2\u6570\u53ca\u5176\u7c7b\u578b\u8bf4\u660e\u662f\u53ef\u9009\u7684\uff0c\u4e3b\u4f53\u5e94\u4e3a\u7c7b\u578b FetchM (BuildJob \u03b1)
\u7684\u8868\u8fbe\u5f0f\u3002
"},{"location":"references/lake-doc/#_12","title":"\u6dfb\u52a0\u4f9d\u8d56","text":"Lake \u5305\u53ef\u6dfb\u52a0\u4f9d\u8d56\u3002\u4f9d\u8d56\u662f\u5f53\u524d\u5305\u4e3a\u4e86\u8fd0\u884c\u6240\u9700\u8981\u7684\u5176\u4ed6 Lake \u5305\u3002\u5b83\u4eec\u53ef\u4ee5\u76f4\u63a5\u6765\u81ea\u672c\u5730\u6587\u4ef6\u5939\uff08\u5982\u5305\u7684\u5b50\u76ee\u5f55\uff09\uff0c\u4e5f\u53ef\u4ee5\u6765\u81ea\u8fdc\u7a0b Git \u4ed3\u5e93\u3002\u4f8b\u5982\uff0c\u4f60\u53ef\u4ee5\u8fd9\u6837\u6dfb\u52a0 mathlib \u4f9d\u8d56\uff1a
package hello\n\nrequire \"leanprover-community\" / \"mathlib\"\n
\u4e0b\u6b21\u8fd0\u884c lake build
\uff08\u6216\u662f\u7528 VSCode \u4e00\u7c7b\u7684\u7f16\u8f91\u5668\u5237\u65b0\u4f9d\u8d56\uff09\u65f6\u5c06\u4f1a\u514b\u9686\u5e76\u6784\u5efa mathlib \u4ed3\u5e93\u3002\u514b\u9686\u7684\u7279\u5b9a\u7248\u672c\u7684\u4fe1\u606f\u5c06\u5b58\u5165 lake-manifest.json
\u4ee5\u786e\u4fdd\u53ef\u590d\u73b0\u6027\uff08\u5373\u4fdd\u8bc1\u672a\u6765\u7684\u6784\u5efa\u4f7f\u7528\u540c\u4e00\u7248\u672c\u7684 mathlib\uff09\u3002\u5728\u8fd9\u4e4b\u540e\u5982\u679c\u60f3\u8981\u66f4\u65b0 mathlib
\uff0c\u4f60\u9700\u8981\u4f7f\u7528 lake update
\u2014\u2014 \u5176\u5b83\u7684\u547d\u4ee4\u90fd\u5c06\u4e0d\u4f1a\u66f4\u65b0\u5df2\u89e3\u6790\u7684\u4f9d\u8d56\u3002
\u5bf9\u4e8e\u4f9d\u8d56 mathlib
\u7684\u5b9a\u7406\u8bc1\u660e\u5305\uff0c\u4f60\u4e5f\u53ef\u4ee5\u7528 lake new <package-name> math
\u76f4\u63a5\u521b\u5efa\u5e26\u6709 mathlib \u4f9d\u8d56\u7684\u5305\u914d\u7f6e\uff08\u4e14\u65e0\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u76ee\u6807\uff09\u3002
\u6ce8\u610f\uff1a \u5bf9\u4e8e mathlib \u800c\u8a00\uff0c\u5728\u6dfb\u52a0\u6216\u5347\u7ea7\u5176\u4f5c\u4e3a\u4f9d\u8d56\u540e\uff0c\u4f60\u8fd8\u9700\u8981\u5728 lake build
\u4e4b\u524d\u4f7f\u7528 lake exe cache get
\u3002\u5426\u5219\u6784\u5efa\u5c06\u4ece\u96f6\u5f00\u59cb\uff08\u8017\u65f6\u6570\u5c0f\u65f6\uff09\u3002\u53c2\u9605 mathlib wiki \u9875\u9762 \u83b7\u53d6\u66f4\u591a\u4fe1\u606f\u3002
"},{"location":"references/lake-doc/#lean-require","title":"Lean require
","text":"Lean \u7684 Lake \u914d\u7f6e\u6587\u4ef6\u4e2d require
\u547d\u4ee4\u7684\u57fa\u672c\u8bed\u6cd5\u5982\u4e0b\uff1a
require [\"<scope>\" /] <pkg-name> [@ <version>]\n [from <source>] [with <options>]\n
from
\u4ece\u53e5\u544a\u77e5 Lake \u4f9d\u8d56\u7684\u5730\u5740\u3002\u6ca1\u6709 from
\u4ece\u53e5\uff0cLake \u5c06\u4ece\u9ed8\u8ba4\u6ce8\u518c\u8868\uff08\u4f8b\u5982 Reservoir\uff09\u4e2d\u67e5\u627e\u5305\uff0c\u5e76\u4f7f\u7528\u83b7\u5f97\u7684\u4fe1\u606f\u4e0b\u8f7d\u6307\u5b9a version
\u7684\u5305\u3002\u53ef\u9009\u7684 scope
\u7528\u6765\u6d88\u9664\u540c\u540d\u5305\u7684\u6b67\u4e49\u3002\u5728 Reservoir \u4e2d\uff0cscope \u90e8\u5206\u662f\u5305\u7684\u6240\u6709\u8005\uff08\u4f8b\u5982\uff0c@leanprover/doc-gen4 \u4e2d\u7684 leanprover
\uff09\u3002
with
\u5b50\u53e5\u6307\u5b9a\u7528\u4e8e\u914d\u7f6e\u4f9d\u8d56\u9879\u7684 Lake \u9009\u9879\u7684 NameMap String
\u3002\u8fd9\u76f8\u5f53\u4e8e\u5728\u547d\u4ee4\u884c\u4e2d\u5c06 -K
\u9009\u9879\u4f20\u9012\u7ed9\u4f9d\u8d56\u9879\u3002
"},{"location":"references/lake-doc/#_13","title":"\u53d7\u652f\u6301\u7684\u6e90","text":"\u5728 from
\u5b50\u53e5\u4e2d\uff0cLake \u652f\u6301\u4e0b\u5217\u4f9d\u8d56\u6e90\u3002
"},{"location":"references/lake-doc/#_14","title":"\u8def\u5f84\u4f9d\u8d56","text":"from <path>\n
Lake \u5c06\u4ece path
\u76ee\u5f55\uff08\u76f8\u5bf9\u4e8e\u6240\u4f9d\u8d56\u5305\u7684\u76ee\u5f55\uff09\u4e2d\u52a0\u8f7d\u5305\u3002
"},{"location":"references/lake-doc/#git","title":"Git \u4f9d\u8d56","text":"from git <url> [@ <rev>] [/ <subDir>]\n
Lake \u4ece\u56fa\u5b9a\u7684 url
\u4e2d\u514b\u9686 Git \u4ed3\u5e93\uff0c\u5e76 checkout \u5230\u6307\u5b9a\u7684 rev
\u3002\u5176\u4e2d rev
\u53ef\u4ee5\u662f commit hash\u3001branch \u6216 tag\u3002\u5982\u679c\u90fd\u6ca1\u6709\u6307\u5b9a\uff0cLake \u5c06\u4f7f\u7528\u9ed8\u8ba4\u7684 master
\u5206\u652f\u3002checkout \u4e4b\u540e\uff0cLake \u5c06\u4ece\u5b50\u76ee\u5f55 subDir
\u4e2d\u52a0\u8f7d\u5305\uff08\u5982\u679c\u672a\u6307\u5b9a\u5b50\u76ee\u5f55\uff0c\u5219\u4ece\u4ed3\u5e93\u6839\u76ee\u5f55\u52a0\u8f7d\uff09\u3002
"},{"location":"references/lake-doc/#toml-require","title":"TOML require
","text":"\u8981\u5728 TOML \u914d\u7f6e\u6587\u4ef6\u4e2d require
\u4e00\u4e2a\u5305\uff0c\u5176\u7b49\u4ef7\u8bed\u6cd5\u5982\u4e0b\uff1a
# A Reservoir dependency\n[[require]]\nname = \"<pkg-name>\"\nscope = \"<scope>\"\nversion = \"<version>\"\noptions = {<options>}\n\n# A path dependency\n[[require]]\nname = \"<pkg-name>\"\npath = \"<path>\"\n\n# A Git dependency\n[[require]]\nname = \"<pkg-name>\"\ngit = \"<url>\"\nrev = \"<rev>\"\nsubDir = \"<subDir>\"\n
"},{"location":"references/lake-doc/#github","title":"GitHub \u53d1\u5e03\u6784\u5efa","text":"Lake \u652f\u6301\u5c06\u6784\u5efa\u4ea7\u7269\uff08\u5373\u5df2\u5f52\u6863\u7684\u6784\u5efa\u76ee\u5f55\uff09\u4e0a\u4f20\u5230 GitHub \u53d1\u5e03\u7248\u672c\uff0c\u6216\u4ece\u4e2d\u4e0b\u8f7d\u3002\u8fd9\u4f7f\u5f97\u7ec8\u7aef\u7528\u6237\u53ef\u4ee5\u4ece\u4e91\u7aef\u83b7\u53d6\u9884\u6784\u5efa\u7684\u4ea7\u7269\uff0c\u800c\u65e0\u9700\u81ea\u5df1\u4ece\u6e90\u7801\u91cd\u5efa\u5305\u3002
"},{"location":"references/lake-doc/#_15","title":"\u4e0b\u8f7d","text":"\u8981\u4e0b\u8f7d\u4ea7\u7269\uff0c\u7528\u6237\u5e94\u914d\u7f6e\u5305\u7684 \u9009\u9879releaseRepo?
\u548c buildArchive?
\uff0c\u6307\u5411\u6258\u7ba1\u53d1\u5e03\u7684 GitHub \u4ed3\u5e93\u53ca\u5176\u4e2d\u7684\u6b63\u786e\u4ea7\u7269\u540d\u79f0\uff08\u5982\u679c\u9ed8\u8ba4\u8bbe\u7f6e\u4e0d\u591f\uff09\u3002\u7136\u540e\uff0c\u8bbe\u7f6e preferReleaseBuild := true
\u4ee5\u544a\u77e5 Lake \u83b7\u53d6\u5e76\u89e3\u538b\u5b83\u4f5c\u4e3a\u989d\u5916\u7684\u5305\u4f9d\u8d56\u9879\u3002
Lake \u4ec5\u5728\u5176\u6807\u51c6\u6784\u5efa\u8fc7\u7a0b\u4e2d\u624d\u4f1a\u83b7\u53d6\u53d1\u5e03\u6784\u5efa\uff0c\u5982\u679c\u9700\u8981\u7684\u5305\u662f\u4f9d\u8d56\u9879\uff08\u56e0\u4e3a\u6839\u5305\u901a\u5e38\u4f1a\u88ab\u4fee\u6539\uff0c\u56e0\u6b64\u4e0d\u5e38\u4e0e\u6b64\u65b9\u6848\u517c\u5bb9\uff09\u3002\u7136\u800c\uff0c\u5982\u679c\u5e0c\u671b\u83b7\u53d6\u6839\u5305\u7684\u53d1\u5e03\uff08\u4f8b\u5982\uff0c\u5728\u514b\u9686\u53d1\u5e03\u7684\u6e90\u7801\u540e\u4f46\u5728\u7f16\u8f91\u4e4b\u524d\uff09\uff0c\u53ef\u4ee5\u901a\u8fc7 lake build :release
\u624b\u52a8\u6267\u884c\u6b64\u64cd\u4f5c\u3002
Lake \u5185\u90e8\u4f7f\u7528 curl
\u4e0b\u8f7d\u53d1\u5e03\uff0c\u5e76\u4f7f\u7528 tar
\u89e3\u538b\u7f29\u5b83\uff0c\u56e0\u6b64\u7ec8\u7aef\u7528\u6237\u5fc5\u987b\u5b89\u88c5\u8fd9\u4e24\u79cd\u5de5\u5177\u624d\u80fd\u4f7f\u7528\u6b64\u529f\u80fd\u3002\u5982\u679c Lake \u7531\u4e8e\u4efb\u4f55\u539f\u56e0\u65e0\u6cd5\u83b7\u53d6\u53d1\u5e03\uff0c\u5b83\u5c06\u8f6c\u800c\u4ece\u6e90\u7801\u6784\u5efa\u3002\u53e6\u5916\u8bf7\u6ce8\u610f\uff0c\u6b64\u673a\u5236\u5728\u6280\u672f\u4e0a\u4e0d\u4ec5\u9650\u4e8e GitHub\uff0c\u4efb\u4f55\u4f7f\u7528\u76f8\u540c URL \u65b9\u6848\u7684 Git \u4e3b\u673a\u4e5f\u53ef\u4ee5\u4f7f\u7528\u3002
"},{"location":"references/lake-doc/#_16","title":"\u4e0a\u4f20","text":"\u8981\u5c06\u6784\u5efa\u7684\u5305\u4f5c\u4e3a\u4ea7\u7269\u4e0a\u4f20\u5230 GitHub \u53d1\u5e03\uff0cLake \u63d0\u4f9b\u4e86\u4e00\u4e2a\u4fbf\u6377\u7684\u7b80\u5199\u547d\u4ee4 lake upload <tag>
\u3002\u6b64\u547d\u4ee4\u4f7f\u7528 tar
\u5c06\u5305\u7684\u6784\u5efa\u76ee\u5f55\u6253\u5305\u6210\u6863\u6848\uff0c\u5e76\u4f7f\u7528 gh release upload
\u5c06\u5176\u9644\u52a0\u5230 tag
\u5bf9\u5e94\u7684\u9884\u5148\u5b58\u5728\u7684 GitHub \u53d1\u5e03\u7248\u672c\u4e2d\u3002\u56e0\u6b64\uff0c\u4e3a\u4e86\u4f7f\u7528\u5b83\uff0c\u5305\u4e0a\u4f20\u8005\uff08\u4f46\u4e0d\u662f\u4e0b\u8f7d\u8005\uff09\u9700\u8981\u5b89\u88c5 gh
\uff0c\u5373 GitHub CLI\uff0c\u5e76\u5c06\u5176\u6dfb\u52a0\u5230 PATH
\u3002
"},{"location":"references/lake-doc/#_17","title":"\u7f16\u5199\u53ca\u8fd0\u884c\u811a\u672c","text":"\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e5f\u53ef\u80fd\u5305\u542b scripts
\u58f0\u660e\u3002\u811a\u672c\u662f\u4efb\u610f\u7684 (args : List String) \u2192 ScriptM UInt32
\u7c7b\u578b\u7684\u5b9a\u4e49\uff0c\u53ef\u4ee5\u901a\u8fc7 lake script run
\u6765\u8fd0\u884c\u3002\u4f8b\u5982\u4ee5\u4e0b\u7684 lakefile.lean
\uff1a
import Lake\nopen Lake DSL\n\npackage scripts\n\n/--\nDisplay a greeting\n\nUSAGE:\n lake run greet [name]\n\nGreet the entity with the given name. Otherwise, greet the whole world.\n-/\nscript greet (args) do\n if h : 0 < args.length then\n IO.println s!\"Hello, {args[0]'h}!\"\n else\n IO.println \"Hello, world!\"\n return 0\n
\u811a\u672c greet
\u53ef\u4ee5\u8fd9\u6837\u8fd0\u884c\uff1a
$ lake script run greet\nHello, world!\n$ lake script run greet me\nHello, me!\n
\u4f60\u53ef\u4ee5\u7528 lake script doc
\u8f93\u51fa\u4e00\u4e2a\u811a\u672c\u7684 docstring\uff1a
$ lake script doc greet\nDisplay a greeting\n\nUSAGE:\n lake run greet [name]\n\nGreet the entity with the given name. Otherwise, greet the whole world.\n
"},{"location":"references/lake-doc/#lake_2","title":"\u4ece\u6e90\u7801\u6784\u5efa\u5e76\u8fd0\u884c Lake","text":"\u5982\u679c\u4f60\u5df2\u7ecf\u5b89\u88c5\u4e86\u5e26\u6709 lake
\u7684 Lean\uff0c\u53ef\u4ee5\u76f4\u63a5\u7528 lake build
\u6784\u5efa\u4e00\u4e2a\u65b0\u7684 lake
\u3002
\u6216\u8005\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u5df2\u9884\u6253\u5305\u7684 build.sh
\u811a\u672c\u6765\u6784\u5efa Lake\u3002\u5b83\u5c06\u53c2\u6570\u4f20\u9012\u7ed9 make
\u547d\u4ee4\u3002\u6240\u4ee5\uff0c\u5982\u679c\u4f60\u7684\u5904\u7406\u5668\u652f\u6301\u591a\u6838\u5fc3\uff0c\u53ef\u4ee5\u4f7f\u7528 -jX
\u9009\u9879\u6307\u5b9a\u5e0c\u671b\u5e76\u884c\u8fd0\u884c\u7684\u6784\u5efa\u4efb\u52a1\u6570\u3002\u4f8b\u5982\uff1a
$ ./build.sh -j4\n
\u6784\u5efa\u540e\uff0clake
\u4e8c\u8fdb\u5236\u6587\u4ef6\u5c06\u4f4d\u4e8e .lake/build/bin/lake
\u4e2d\uff0c\u800c\u5e93\u7684 .olean
\u6587\u4ef6\u5c06\u4f4d\u4e8e .lake/build/lib
\u4e0b\u3002
"},{"location":"references/lake-doc/#nix-flakes","title":"\u4f7f\u7528 Nix Flakes \u6784\u5efa","text":"Lake \u662f Lean 4 flake \u7684\u4e00\u90e8\u5206\uff0c\u5728\u4ed3\u5e93\u6839\u76ee\u5f55\u4e0b\u6784\u5efa\u3002
"},{"location":"references/lake-doc/#lake_3","title":"\u589e\u5f3a Lake \u7684\u641c\u7d22\u8def\u5f84","text":"lake
\u53ef\u6267\u884c\u6587\u4ef6\u9700\u8981\u77e5\u9053\u5728\u5305\u914d\u7f6e\u6587\u4ef6\u4e2d\u4f7f\u7528\u7684\u6a21\u5757\u7684 Lean \u5e93\u6587\u4ef6\uff08\u4f8b\u5982 .olean
, .ilean
\uff09\u5728\u54ea\u91cc\uff08\u4ee5\u53ca\u7f16\u8f91\u5668\u4e2d go-to-definition \u652f\u6301\u7684\u6e90\u6587\u4ef6\uff09\u3002Lake \u5c06\u57fa\u4e8e\u81ea\u8eab\u53ef\u6267\u884c\u6587\u4ef6\u548c lean
\u7684\u4f4d\u7f6e\u667a\u80fd\u5730\u8bbe\u7f6e\u521d\u59cb\u641c\u7d22\u8def\u5f84\u3002
\u5177\u4f53\u800c\u8a00\uff0c\u5982\u679c Lake \u4e0e lean
\u4f4d\u4e8e\u540c\u4e00\u4f4d\u7f6e\uff08\u5373\u4e0e lake
\u5728\u540c\u4e00\u76ee\u5f55\u4e0b\u6709 lean
\u53ef\u6267\u884c\u6587\u4ef6\uff09\uff0c\u5b83\u5c06\u5047\u5b9a\u5b83\u662f\u4e0e Lean \u4e00\u8d77\u5b89\u88c5\u7684\uff0c\u5e76\u4e14 Lean \u548c Lake \u4f4d\u4e8e\u5176\u5171\u4eab\u7684 sysroot \u4e0b\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u5b83\u4eec\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\u4f4d\u4e8e <sysroot>/bin
\uff0c\u5b83\u4eec\u7684 Lean \u5e93\u6587\u4ef6\u4f4d\u4e8e <sysroot>/lib/lean
\uff0cLean \u7684\u6e90\u6587\u4ef6\u4f4d\u4e8e <sysroot>/src/lean
\uff0c\u800c Lake \u7684\u6e90\u6587\u4ef6\u4f4d\u4e8e <sysroot>/src/lean/lake
\u3002\u5426\u5219\uff0c\u5b83\u5c06\u8fd0\u884c lean --print-prefix
\u4ee5\u627e\u5230 Lean \u7684 sysroot\uff0c\u5e76\u5047\u5b9a Lean \u7684\u6587\u4ef6\u5982\u524d\u6240\u8ff0\uff0c\u800c lake
\u4f4d\u4e8e <lake-home>/.lake/build/bin/lake
\uff0c\u5176 Lean \u5e93\u6587\u4ef6\u4f4d\u4e8e <lake-home>/.lake/build/lib
\uff0c\u5176\u6e90\u6587\u4ef6\u76f4\u63a5\u4f4d\u4e8e <lake-home>
\u3002
\u53ef\u4ee5\u901a\u8fc7\u5728 LEAN_PATH
\u73af\u5883\u53d8\u91cf\u4e2d\u5305\u542b\u5176\u4ed6 Lean \u5e93\u76ee\u5f55\uff08\u4ee5\u53ca\u5728 LEAN_SRC_PATH
\u4e2d\u7684\u6e90\u6587\u4ef6\u76ee\u5f55\uff09\u6765\u589e\u5f3a\u6b64\u641c\u7d22\u8def\u5f84\u3002\u8fd9\u5141\u8bb8\u7528\u6237\u5728 Lean \u7684\u6587\u4ef6\uff08\u6216 Lake \u672c\u8eab\uff09\u4f4d\u4e8e\u975e\u6807\u51c6\u4f4d\u7f6e\u65f6\u66f4\u6b63 Lake \u7684\u641c\u7d22\u8def\u5f84\u3002\u7136\u800c\uff0c\u8fd9\u4e9b\u76ee\u5f55\u4e0d\u4f1a\u4f18\u5148\u4e8e\u521d\u59cb\u641c\u7d22\u8def\u5f84\u3002\u8fd9\u5728\u5f00\u53d1\u671f\u95f4\u5f88\u91cd\u8981\uff0c\u56e0\u4e3a\u8fd9\u53ef\u4ee5\u9632\u6b62\u7528\u4e8e\u6784\u5efa Lake \u7684 Lake \u7248\u672c\u4f7f\u7528\u6b63\u5728\u6784\u5efa\u7684 Lake \u7248\u672c\u7684 Lean \u5e93\uff08\u800c\u4e0d\u662f\u5b83\u81ea\u5df1\u7684\uff09\u6765\u8be6\u7ec6\u8bf4\u660e Lake \u7684 lakefile.lean
\uff08\u8fd9\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5404\u79cd\u9519\u8bef\uff09\u3002
"},{"location":"tutorial/elan-lake/","title":"Lean \u5de5\u5177\u94fe\u4f7f\u7528\u6307\u5357","text":"\u524d\u8fb9\u901a\u8fc7\u5b89\u88c5\u6307\u5357 \u5b89\u88c5\u4e86 Lean \u5f00\u53d1\u7684\u4e09\u4ef6\u5957\uff1a\u7248\u672c\u7ba1\u7406\u5668 elan + \u5305\u7ba1\u7406\u5668\u548c\u6784\u5efa\u5de5\u5177 lake + \u8bed\u8a00\u672c\u8eab\u7684\u6838\u5fc3\u7ec4\u4ef6 lean\u3002\u4e0b\u8fb9\u5206\u522b\u4ecb\u7ecd\u8fd9\u4e09\u4e2a\u5de5\u5177\u7684\u57fa\u672c\u7528\u6cd5\u3002
\u8fd9\u79cd\u8bbe\u8ba1\u4e0e\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u7c7b\u4f3c\uff0c\u5982 Rust\uff08rustup + cargo + rustc\uff09\u6216 Node.js\uff08nvm + npm + node\uff09\u3002
"},{"location":"tutorial/elan-lake/#elan","title":"elan \u5e38\u7528\u529f\u80fd","text":"elan \u662f Lean \u7248\u672c\u7ba1\u7406\u5668\uff0c\u7528\u4e8e\u5b89\u88c5\u3001\u7ba1\u7406\u548c\u5207\u6362\u4e0d\u540c\u7248\u672c\u7684 Lean\u3002
\u7248\u672c\u7ba1\u7406\uff1a
elan --version # \u8f93\u51fa\u7248\u672c\u53f7\u6765\u6d4b\u8bd5\u5b89\u88c5\u662f\u5426\u6210\u529f\nelan self update # \u66f4\u65b0 elan\nelan show # \u663e\u793a\u5df2\u5b89\u88c5\u7684 Lean \u7248\u672c\n\n# \u4e0b\u8f7d\u6307\u5b9a Lean \u7248\u672c\uff0c\u6240\u6709\u7248\u672c\u53ef\u89c1 https://github.com/leanprover/lean4/releases\nelan install leanprover/lean4:v4.10.0\n\n# \u4e0b\u8f7d\u6700\u65b0\u7a33\u5b9a\u7248\u672c stable\nelan default leanprover/lean4:stable \n\n# \u5207\u6362\u9ed8\u8ba4\u7684 Lean \u7248\u672c\n# \u5207\u6362\u5230 leanprover/lean4:v4.11.0-rc1 \nelan default leanprover/lean4:v4.11.0-rc1 \n\n# \u8bbe\u7f6e\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u4f7f\u7528\u7684 Lean \u7248\u672c\nelan override set leanprover/lean4:stable\n# info: info: override toolchain for 'xxx' set to 'leanprover/lean4:stable'\n
\u6307\u5b9a\u7248\u672c\u8fd0\u884c lake
\u6216 lean
\u547d\u4ee4\uff1a
lake --version # \u4f7f\u7528 elan \u9ed8\u8ba4\u7248\u672c\n# \u4f7f\u7528\u6307\u5b9a\u7248\u672c\nelan run leanprover/lean4:v4.10.0 lake --version\nelan run leanprover/lean4:v4.10.0 lean --version\n# \u521b\u5efa\u6307\u5b9a\u7248\u672c\u7684\u9879\u76ee\nelan run leanprover/lean4:v4.10.0 lake new package\n
elan \u914d\u7f6e\u8bb0\u5f55\u53ef\u4ee5\u5728 ~/.elan/settings.toml
\u67e5\u770b\u3002
\u5177\u4f53\u5730\uff0cWindows \u4e0b\u7684 elan \u7ba1\u7406\u76ee\u5f55\u4e3a %USERPROFILE%\\.elan\\bin
\uff0cLinux/Mac \u4e0b\u7684\u7ba1\u7406\u76ee\u5f55\u4e3a $HOME/.elan
\uff0c\u5185\u5bb9\u5f62\u5982
\u276f tree .elan -L 2\n.elan\n\u251c\u2500\u2500 bin\n\u2502 \u251c\u2500\u2500 elan\n\u2502 \u251c\u2500\u2500 lake\n\u2502 \u251c\u2500\u2500 lean\n\u2502 \u251c\u2500\u2500 leanc\n\u2502 \u251c\u2500\u2500 leanchecker\n\u2502 \u251c\u2500\u2500 leanmake\n\u2502 \u2514\u2500\u2500 leanpkg\n\u251c\u2500\u2500 env\n\u251c\u2500\u2500 settings.toml\n\u251c\u2500\u2500 tmp\n\u251c\u2500\u2500 toolchains\n\u2502 \u2514\u2500\u2500 stable\n\u2514\u2500\u2500 update-hashes\n \u2514\u2500\u2500 stable\n
\u6587\u4ef6\u8bf4\u660e\uff1a
toolchains
\u5b58\u653e\u4e0b\u8f7d\u7684\u5404\u4e2a Lean \u7248\u672c settings.toml
\u662f elan \u7684\u914d\u7f6e\u6587\u4ef6\u3002 bin
\u5b58\u653e\u5e38\u7528\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\uff0c\u6bd4\u5982 lake
\u3002 "},{"location":"tutorial/elan-lake/#lake","title":"Lake \u57fa\u672c\u7528\u6cd5","text":"lake \u5168\u79f0 Lean Make\uff0c\u662f Lean 4 \u7684\u5305\u7ba1\u7406\u5668\uff0c\u7528\u4e8e\u521b\u5efa Lean \u9879\u76ee\uff0c\u6784\u5efa Lean \u5305\u548c\u7f16\u8bd1 Lean \u53ef\u6267\u884c\u6587\u4ef6\u3002
\u672c\u8282\u4ecb\u7ecd lake
\u7684\u57fa\u672c\u7528\u6cd5\uff0cLean \u51fd\u6570\u5f0f\u7f16\u7a0b\u4e5f\u63d0\u4f9b\u4e86\u521b\u5efa Lean \u9879\u76ee\u7684\u4f8b\u5b50\uff0c\u800c\u66f4\u5168\u9762\u7684\u53c2\u6570\u4ecb\u7ecd\u53ef\u53c2\u8003 lake \u6587\u6863\u3002
\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\uff08your_project_name
\u66ff\u6362\u4e3a\u4f60\u81ea\u5df1\u8d77\u7684\u540d\u5b57\uff09
lake new your_project_name\n\n# \u6216\u8005\u624b\u52a8\u521b\u5efa\u4e00\u4e2a\u65b0\u6587\u4ef6\u5939\u5e76\u5728\u539f\u5730\u5efa\u7acb\u9879\u76ee\nmkdir your_folder_name && cd your_folder_name && lake init your_project_name\n
\u4ee5\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a your_project_name
\u7684\u7a7a\u767d\u65b0\u9879\u76ee\u3002\u8fd9\u4e2a\u9879\u76ee\u7684\u5185\u5bb9\u5f62\u5982
your_project_name\n\u251c\u2500\u2500 YourProjectName\n\u2502 \u2514\u2500\u2500 Basic.lean\n\u251c\u2500\u2500 lakefile.lean\n\u251c\u2500\u2500 lean-toolchain\n\u251c\u2500\u2500 Main.lean\n\u251c\u2500\u2500 YourProjectName.lean\n\u2514\u2500\u2500 ...\n
\u5176\u4e2d lakefile.lean
\u662f\u5f53\u524d\u9879\u76ee\u7684\u914d\u7f6e\u6587\u4ef6\uff0clean-toolchain
\u662f\u5f53\u524d\u9879\u76ee\u4f7f\u7528\u7684 Lean \u7248\u672c\u3002
\u521d\u6b21\u8ba9 Lean Server \u8fd0\u884c\u8be5\u9879\u76ee\u65f6\u4f1a\u6dfb\u52a0
\u251c\u2500\u2500 .lake\n \u251c\u2500\u2500 lakefile.olean.trace\n \u2514\u2500\u2500 ...\n\u251c\u2500\u2500 lake-manifest.json\n
\u5982\u679c\u4f60\u60f3\u5728\u8fd9\u4e2a\u73b0\u6709\u7684\u5de5\u7a0b\u4e2d\u5f15\u7528 Mathlib4\uff0c\u4f60\u9700\u8981\u5728 lakefile.lean
\u6587\u4ef6\u5c3e\u4e2d\u52a0\u5165
require mathlib from git\n \"https://github.com/leanprover-community/mathlib4\"\n
\u4fdd\u5b58\u6587\u4ef6\u540e VS code \u4f1a\u63d0\u793a \"Restart Lean\"\uff0c\u70b9\u4e0d\u70b9\u90fd\u6ca1\u5173\u7cfb\u3002
\u4e0b\u9762\u8981\u4e0b\u8f7d Mathlib\uff0c\u6ce8\u610f\u8ba9\u7ec8\u7aef\u8def\u5f84\u5728\u4f60\u7684\u9879\u76ee\u6587\u4ef6\u5939\u4e0b\u3002\u5982\u679c\u4f60\u7684\u7f51\u7edc\u60c5\u51b5\u597d\uff0c\u90a3\u4e48\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c
curl -L https://raw.githubusercontent.com/leanprover-community/mathlib4/master/lean-toolchain -o lean-toolchain\nlake update\n
\u4fdd\u5b58\u8fd0\u884c\u7f13\u5b58\u4f1a\u8ba9\u6bcf\u6b21\u7f16\u8bd1\u8282\u7701\u4e00\u4e24\u4e2a\u5c0f\u65f6\uff0c\u4f46\u5b83\u5f53\u7136\u4e5f\u4e0d\u662f\u5fc5\u987b\u7684\uff1a
lake exe cache get\n
\u5426\u5219\uff08\u4f1a\u76f8\u5f53\u8270\u96be\uff09\uff0c\u53c2\u8003\u8fd9\u4e2a\u89e3\u51b3\u65b9\u6848\u3002\uff08\u4e0d\u4fdd\u8bc1\u8be5\u53c2\u8003\u65b9\u6848\u7684\u53ef\u9760\u6027\uff09
\u5982\u679c\u4f60\u770b\u5230\u7ec8\u7aef\u4e2d\u663e\u793a\u4e86\u7c7b\u4f3c\u5982\u4e0b\u7684\u63d0\u793a\uff1a
Decompressing 1234 file(s)\nunpacked in 12345 ms\n
\u540c\u65f6\u4f60\u7684\u9879\u76ee\u6587\u4ef6\u5939\u4e2d\u51fa\u73b0\u4e86 .lake\\packages
\u6587\u4ef6\u5939\uff0c\u90a3\u4e48\u8bc1\u660e\u4f60\u5b89\u88c5 Mathlib \u6210\u529f\u4e86\uff0c\u6b64\u65f6 \"Restart Lean\" \u5373\u53ef\u4f7f\u7528\u3002\u6ce8\u610f\uff1a\u4f60\u8981\u5728\u9879\u76ee\u6240\u5728\u7684\u76ee\u5f55\u4e2d\u8fd0\u884c VS code\uff0c\u624d\u80fd\u8ba9 Lean \u4f7f\u7528Mathlib\u3002
\u8fd9\u91cc\u63d0\u4f9b\u4e00\u4e2a\u5b9e\u4f8b\u6765\u6d4b\u8bd5\u4f60\u7684\u5b89\u88c5\uff1a
import Mathlib.Data.Real.Basic\nexample (a b : \u211d) : a * b = b * a := by\n rw [mul_comm a b]\n
\u5982\u679c\u4f60\u7684 Lean infoview \u6ca1\u6709\u4efb\u4f55\u62a5\u9519\uff0c\u5e76\u4e14\u5149\u6807\u653e\u5728\u6587\u4ef6\u6700\u540e\u4e00\u884c\u65f6\u4f1a\u63d0\u793a \"No goals\"\uff0c\u8bc1\u660e\u4f60\u7684 Mathlib \u5df2\u7ecf\u6b63\u786e\u5b89\u88c5\u4e86\u3002
\u5982\u679c\u4f60\u60f3\u66f4\u65b0 Mathlib\uff0c\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c
curl -L https://raw.githubusercontent.com/leanprover-community/mathlib4/master/lean-toolchain -o lean-toolchain\nlake update\nlake exe cache get\n
\u5173\u4e8e Mathlib \u7684\u66f4\u591a\u5185\u5bb9\u8bf7\u53c2\u8003 Mathlib Wiki
lake \u7684\u5176\u4ed6\u5e38\u7528\u529f\u80fd\uff1a
# \u6784\u5efa\u9879\u76ee\u53ef\u6267\u884c\u6587\u4ef6\nlake build\n# \u8fd0\u884c\nlake exec hello # Hello, world!\n# \u6e05\u7406\u6784\u5efa\u6587\u4ef6\nlake clean\n# \u66f4\u65b0\u4f9d\u8d56\nlake update\n# \u8fd0\u884c lakefile.lean \u7684\u811a\u672c\nlake run <script>\n
"},{"location":"tutorial/elan-lake/#lean_1","title":"lean","text":"lean\uff1a\u8bed\u8a00\u672c\u8eab\u7684\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u4e0d\u9700\u8981\u76f4\u63a5\u4e0e lean
\u4ea4\u4e92\u3002
\u8fd9\u91cc\u4ecb\u7ecd\u5e38\u89c1\u7684\u4e24\u4e2a\u64cd\u4f5c\uff1a\u8fd0\u884c Lean \u811a\u672c\uff0c\u4ee5\u53ca\u9a8c\u8bc1 Lean \u4ee3\u7801\u3002
\u6267\u884c Lean \u811a\u672c\uff0c\u5165\u53e3\u4e3a main
\u51fd\u6570\uff1a
-- hello.lean\ndef main : IO Unit := IO.println s!\"Version: {Lean.versionString}\"\n
\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\uff1a
elan default leanprover/lean4:v4.11.0-rc1\nlean --run hello.lean\n# Version: 4.11.0-rc1\nelan run leanprover/lean4:v4.10.0 lean --run hello.lean\n# Version: 4.10.0\n
\u9a8c\u8bc1 Lean \u4ee3\u7801\uff1a
-- proof.lean\ntheorem my_first_theorem : 1 + 1 = 2 := by\n simp\n\ntheorem my_false_theorem : 1 + 1 = 1 := by\n simp\n\ntheorem my_syntax_error_themore 1 + 1 = 2 := by\n simp\n
\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\uff1alean proof.lean
\uff0c\u8fd4\u56de\u9519\u8bef\u4fe1\u606f\uff1a
hello.lean:5:40: error: unsolved goals\n\u22a2 False\nhello.lean:8:31: error: unexpected token; expected ':'\n
"},{"location":"tutorial/lean-dojo/","title":"LeanDojo | \u4e3a Lean \u5b9a\u7406\u8bc1\u660e\u5668\u642d\u5efa\u6865\u6881","text":""},{"location":"tutorial/lean-dojo/#_1","title":"\u7b80\u4ecb","text":"LeanDojo \u662f\u4e00\u4e2a\u4e3a Lean \u5b9a\u7406\u8bc1\u660e\u5668\u8bbe\u8ba1\u7684 Python \u5e93\uff0c\u652f\u6301 Lean 3 \u548c Lean 4 \u7248\u672c\uff0c\u5176\u5728\u89e3\u6790 Lean \u6587\u4ef6\u53ca\u4e0e\u73af\u5883\u4ea4\u4e92\u65b9\u9762\u6709\u5f88\u9ad8\u7684\u5b9e\u7528\u6027\u3002\u9879\u76ee\u63d0\u4f9b\u4ee5\u4e0b\u4e24\u5927\u529f\u80fd\uff1a
\u6570\u636e\u63d0\u53d6\uff1a\u4ece Lean \u5b58\u50a8\u5e93\u4e2d\u63d0\u53d6\u8bc1\u660e\u72b6\u6001\u3001\u7b56\u7565\u3001\u524d\u63d0\u7b49\u5173\u952e\u4fe1\u606f\u3002 \u73af\u5883\u4ea4\u4e92\uff1a\u5141\u8bb8\u7528\u6237\u4ee5\u7f16\u7a0b\u65b9\u5f0f\u4e0e Lean \u73af\u5883\u8fdb\u884c\u4ea4\u4e92\u3002
LeanDojo \u6309\u7167 \u4ed3\u5e93=>\u6587\u4ef6=>\u5b9a\u7406
\u7684\u5c42\u6b21\u7ed3\u6784\u6765\u89e3\u6790\u6587\u4ef6\uff0c\u56f4\u7ed5 LeanGitRepo
\u5bf9\u8c61\u8fdb\u884c\u64cd\u4f5c\uff1a
"},{"location":"tutorial/lean-dojo/#_2","title":"\u76f8\u5173\u94fe\u63a5","text":" \u9879\u76ee\u6587\u6863\uff1aLeanDojo: Machine Learning for Theorem Proving in Lean \u9879\u76ee\u4ed3\u5e93\uff1alean-dojo/LeanDojo \u793e\u533a\u5e16\u5b50\uff1aReleasing LeanDojo "},{"location":"tutorial/lean-dojo/#_3","title":"\u57fa\u672c\u793a\u4f8b","text":"\u6211\u4eec\u5b98\u65b9\u793a\u4f8b\u4ed3\u5e93\uff1ayangky11/lean4-example \u6765\u6f14\u793a\u6570\u636e\u63d0\u53d6\u548c\u73af\u5883\u4ea4\u4e92\u7684\u8fc7\u7a0b\u3002\u8fd9\u662f\u4e00\u4e2a\u7b80\u6d01\u7684 Lean \u5305\uff0c\u6587\u4ef6\u7ed3\u6784\u5982\u4e0b\uff1a
lean4-example/\n\u251c\u2500\u2500 lakefile.lean\n\u251c\u2500\u2500 lake-manifest.json\n\u251c\u2500\u2500 Lean4Example.lean\n\u251c\u2500\u2500 lean-toolchain\n\u251c\u2500\u2500 LICENSE\n\u2514\u2500\u2500 README.md\n
\u5176\u4e2d\uff0cLean4Example.lean
\u6587\u4ef6\u7684\u5185\u5bb9\uff1a
open Nat (add_assoc add_comm)\n\ntheorem hello_world (a b c : Nat)\n : a + b + c = a + c + b := by\n rw [add_assoc, add_comm b, \u2190add_assoc]\n\ntheorem foo (a : Nat) : a + 1 = Nat.succ a := by rfl\n
\u4ece Nat
\u547d\u540d\u7a7a\u95f4\u5bfc\u5165\u4e86 add_assoc
\u548c add_comm
\u4e24\u4e2a\u5f15\u7406\uff0c\u7136\u540e\u5b9a\u4e49\u4e86\u4e24\u4e2a\u5b9a\u7406\u3002
"},{"location":"tutorial/lean-dojo/#_4","title":"\u73af\u5883\u51c6\u5907","text":"\u5b89\u88c5\u4f9d\u8d56\uff0c\u6d4b\u8bd5\u7528 Python 3.10 \u7248\u672c\uff1a
pip install lean-dojo\n
"},{"location":"tutorial/lean-dojo/#_5","title":"\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf","text":"\u73af\u5883\u53d8\u91cf\u53ea\u5728\u9996\u6b21 import lean_dojo
\u65f6\u751f\u6548\uff0c\u56e0\u6b64\u5148\u8bbe\u7f6e\uff1a
import os\n\n# \u8bbe\u7f6e GitHub token \u4ee5\u907f\u514d\u8bf7\u6c42\u9891\u7387\u9650\u5236\nos.environ['GITHUB_ACCESS_TOKEN'] = 'gho_xxx'\n# \u914d\u7f6e\u7ebf\u7a0b\u6570\u4ee5\u52a0\u5feb `trace` \u7684\u8fd0\u884c\u901f\u5ea6\nos.environ['NUM_PROCS'] = '64'\n# \u8bbe\u7f6e\u4e34\u65f6\u76ee\u5f55\u4ee5\u4fbf\u89c2\u5bdf `trace` \u9636\u6bb5\u751f\u6210\u7684\u6587\u4ef6\nos.environ['TMP_DIR'] = 'temp_dir'\n# \u53d6\u6d88\u8fdc\u7a0b\u7f13\u5b58\u4e0b\u8f7d\uff0c\u5728\u672c\u5730\u8fdb\u884c\u6784\u5efa\nos.environ['DISABLE_REMOTE_CACHE'] = 'true'\n
"},{"location":"tutorial/lean-dojo/#_6","title":"\u4ed3\u5e93\u5bf9\u8c61","text":"\u73af\u5883\u4ea4\u4e92\u548c\u6570\u636e\u63d0\u53d6\u90fd\u662f\u56f4\u7ed5 LeanGitRepo
\u5bf9\u8c61\u5c55\u5f00\u7684\u3002
\u9996\u5148\u5bfc\u5165 LeanGitRepo
\u7c7b
from lean_dojo import LeanGitRepo\n
\u521d\u59cb\u5316\u4ed3\u5e93\u5bf9\u8c61\uff0c\u53ef\u4f7f\u7528 commit hash \u6216 main \u5206\u652f\uff1a
repo = LeanGitRepo(\"https://github.com/PatrickMassot/GlimpseOfLean\", \"8d73d32d90ec2315616ad8e720754eeacfb96af6\")\n
\u67e5\u770b\u4ed3\u5e93\u5bf9\u8c61\u7684\u57fa\u672c\u5c5e\u6027\uff1a
print(\"repo.url\", repo.url)\nprint(\"repo.commit\", repo.commit)\nprint(\"repo.repo\", repo.repo)\nprint(repo.get_config(\"lean-toolchain\"))\n
\u8f93\u51fa\u7ed3\u679c\uff1a
repo.url https://github.com/PatrickMassot/GlimpseOfLean\nrepo.commit 8d73d32d90ec2315616ad8e720754eeacfb96af6\nrepo.repo Repository(full_name=\"PatrickMassot/GlimpseOfLean\")\n{'content': 'leanprover/lean4:v4.8.0-rc2\\n'}\n
\u6b64\u5916\uff0c\u4ece 2.1.0 \u7248\u672c\u5f00\u59cb\uff0cLeanDojo \u652f\u6301\u8ffd\u8e2a\u672c\u5730\u4ed3\u5e93\uff1a
repo = LeanGitRepo(\"<local_path>\", \"<commit_hash>\")\nrepo = LeanGitRepo.from_path(\"<local_path>\")\n
"},{"location":"tutorial/lean-dojo/#trace","title":"Trace \u64cd\u4f5c","text":"\u5bf9\u4ed3\u5e93\u8fdb\u884c trace \u64cd\u4f5c\uff1a
from lean_dojo import trace\n\nrepo = LeanGitRepo(\"https://github.com/yangky11/lean4-example\", \"04e29174a45eefaccb49b835a372aa762321194e\")\ntrace(repo, dst_dir=\"traced_lean4-example\", build_deps=False)\n
trace
\u4e3b\u8981\u6267\u884c\u4ee5\u4e0b\u6b65\u9aa4\uff1a
\u514b\u9686\u4ed3\u5e93\u5230 TMP_DIR
\u76ee\u5f55\uff0c\u5e76\u6267\u884c lake build
\u8fdb\u884c\u6784\u5efa\u3002 \u83b7\u53d6\u4ed3\u5e93\u7684 Lean4 \u7248\u672c\uff0c\u5c06\u5bf9\u5e94\u7248\u672c\u7684 Lean4 \u6587\u4ef6\u590d\u5236\u5230 .lake/packages
\u76ee\u5f55\u3002 \u6570\u636e\u63d0\u53d6\uff1a\u5c06 ExtractData.lean
\u811a\u672c\u62f7\u8d1d\u5230\u4ed3\u5e93\uff0c\u6267\u884c lake env lean --run ExtractData.lean
\u547d\u4ee4\uff0c\u63d0\u53d6 AST \u6811\u3001\u72b6\u6001\u548c\u5b9a\u7406\u7b49\u4fe1\u606f\uff0c\u968f\u540e\u5220\u9664 ExtractData.lean
\u6587\u4ef6\u3002 \u73af\u5883\u4ea4\u4e92\uff1a\u5c06 Lean4Repl.lean
\u811a\u672c\u62f7\u8d1d\u5230\u4ed3\u5e93\uff0c\u5e76\u66f4\u65b0 lakefile
\u4ee5\u5305\u542b\u4f9d\u8d56\u4fe1\u606f\uff0c\u6267\u884c lake build Lean4Repl
\u547d\u4ee4\u8fdb\u884c\u6784\u5efa\u3002 \u83b7\u53d6\u4ed3\u5e93\u4fe1\u606f\uff0c\u5e76\u66f4\u65b0 .cache/leandojo
\u76ee\u5f55\u4e0b\u7684\u7f13\u5b58\u3002 \u6b64\u5916\uff0cExtractData.lean
\u548c Lean4Repl.lean
\u6587\u4ef6\u662f\u6574\u4e2a\u9879\u76ee\u7684\u6838\u5fc3\u3002\u5982\u679c\u53ea\u5173\u5fc3\u73af\u5883\u4ea4\u4e92\u95ee\u9898\uff0c\u53ef\u4ee5\u91cd\u70b9\u5173\u6ce8 Lean4Repl.lean
\u6587\u4ef6\u3002
"},{"location":"tutorial/lean-dojo/#_7","title":"\u6570\u636e\u63d0\u53d6","text":"\u63d0\u53d6\u7684\u6587\u4ef6\u4f4d\u4e8e .lake/build
\u76ee\u5f55\uff1a
.lake\n\u251c\u2500\u2500 build\n\u2502 \u251c\u2500\u2500 ir\n\u2502 \u2502 \u251c\u2500\u2500 Lean4Example.ast.json\n\u2502 \u2502 \u251c\u2500\u2500 Lean4Example.c\n\u2502 \u2502 \u251c\u2500\u2500 Lean4Example.c.hash\n\u2502 \u2502 \u251c\u2500\u2500 Lean4Example.dep_paths\n\u2502 \u2502 \u2514\u2500\u2500 Lean4Example.trace.xml\n\u2502 \u2514\u2500\u2500 lib\n\u2502 \u251c\u2500\u2500 Lean4Example.ilean\n\u2502 \u251c\u2500\u2500 Lean4Example.ilean.hash\n\u2502 \u251c\u2500\u2500 Lean4Example.olean\n\u2502 \u251c\u2500\u2500 Lean4Example.olean.hash\n\u2502 \u2514\u2500\u2500 Lean4Example.trace\n\u251c\u2500\u2500 lakefile.olean\n\u251c\u2500\u2500 lakefile.olean.trace\n\u2514\u2500\u2500 packages\n \u2514\u2500\u2500 lean4\n \u251c\u2500\u2500 bin\n \u251c\u2500\u2500 include\n \u251c\u2500\u2500 lib\n \u251c\u2500\u2500 LICENSE\n \u251c\u2500\u2500 LICENSES\n \u251c\u2500\u2500 share\n \u2514\u2500\u2500 src\n
\u8fd9\u91cc\u6709\u4e24\u7c7b\u6bd4\u8f83\u91cd\u8981\u7684\u6587\u4ef6\uff1a
.ast.json
\uff1a\u5305\u542b\u5e26\u6709\u8bed\u4e49\u4fe1\u606f\u7684\u6ce8\u91ca\uff0c\u4f8b\u5982\u7b56\u7565\u72b6\u6001\u548c\u540d\u79f0\u3002 .trace.xml
\uff1a\u7ed3\u6784\u5316\u5904\u7406\u540e\u7684\u53e5\u6cd5\u548c\u8bed\u4e49\u4fe1\u606f\u3002 \u9879\u76ee\u6309 \u4ed3\u5e93 => \u6587\u4ef6 => \u5b9a\u7406
\u7684\u5c42\u6b21\u7ed3\u6784\u751f\u6210\u6587\u4ef6\u3002\u793a\u4f8b\u4e2d\u7684\u4f8b\u5b50\u6bd4\u8f83\u7b80\u5355\uff0c\u4ec5\u5305\u542b\u4e00\u4e2a\u6587\u4ef6\u3002
"},{"location":"tutorial/lean-dojo/#_8","title":"\u73af\u5883\u4ea4\u4e92","text":"\u793a\u4f8b\u4ed3\u5e93\u4e2d\u5305\u542b\u4e24\u4e2a\u5b9a\u7406\u3002\u4ee5 hello_world
\u5b9a\u7406\u4e3a\u4f8b\uff0c\u5c55\u793a\u5982\u4f55\u4f7f\u7528 Dojo
\u7c7b\u8fdb\u884c\u73af\u5883\u4ea4\u4e92\u3002
theorem hello_world (a b c : Nat)\n : a + b + c = a + c + b := by\n rw [add_assoc, add_comm b, \u2190add_assoc]\n
\u9996\u5148\u5bfc\u5165 Dojo
\u7c7b\u548c Theorem
\u7c7b\uff1a
from lean_dojo import Theorem, Dojo\n
\u83b7\u53d6\u5b9a\u7406\u5bf9\u8c61\uff0c\u4ece Lean4Example.lean
\u6587\u4ef6\u4e2d\u63d0\u53d6 hello_world
\u5b9a\u7406\uff1a
theorem = Theorem(repo, \"Lean4Example.lean\", \"hello_world\")\n
\u83b7\u53d6\u521d\u59cb\u72b6\u6001\uff1a
dojo, state_0 = Dojo(theorem).__enter__()\nprint(state_0)\n# TacticState(pp='a b c : Nat\\n\u22a2 a + b + c = a + c + b', id=0, message=None)\nprint(state_0.pp)\n# a b c : Nat\n# \u22a2 a + b + c = a + c + b\n
\u5bf9\u521d\u59cb\u72b6\u6001 state_0
\u6267\u884c\u7b56\u7565\uff0c\u5e76\u83b7\u53d6\u66f4\u65b0\u540e\u7684\u72b6\u6001\uff1a
state_1 = dojo.run_tac(state_0, \"rw [add_assoc]\")\nprint(state_1.pp)\n# a b c : Nat\n# \u22a2 a + (b + c) = a + c + b\n
\u7ee7\u7eed\u5bf9\u72b6\u6001 state_1
\u6267\u884c\u7b56\u7565\uff0c\u5e76\u83b7\u53d6\u6700\u7ec8\u72b6\u6001\uff1a
print(dojo.run_tac(state_1, \"sorry\"))\n# ProofGivenUp()\ndojo.run_tac(state_1, \"rw [add_comm b, \u2190add_assoc]\")\n# ProofFinished(tactic_state_id=4, message='')\n
"},{"location":"tutorial/lean-dojo/#_9","title":"\u5c0f\u7ed3","text":"\u4ee5\u4e0a\uff0c\u6f14\u793a\u4e86\u7528 LeanDojo \u8fdb\u884c\u6570\u636e\u63d0\u53d6\u548c\u73af\u5883\u4ea4\u4e92\u3002\u5982\u679c\u5bf9\u5173\u952e\u5b9e\u73b0\u7ec6\u8282\u611f\u5174\u8da3\uff0c\u53ef\u4ee5\u8fdb\u4e00\u6b65\u9605\u8bfb\u4e24\u4e2a\u6838\u5fc3\u6587\u4ef6\uff1a
ExtractData.lean Lean4Repl.lean "},{"location":"tutorial/lean4-jupyter/","title":"Lean4 Juptyer | TODO","text":"\u57fa\u4e8e REPL \u7684 Jupyter Kernel\u3002
\u9879\u76ee\u5730\u5740\uff1ahttps://github.com/utensil/lean4_jupyter "},{"location":"tutorial/pantograph/","title":"Pantograph \uff5c TODO","text":"Links:
Lean \u9879\u76ee\u5730\u5740\uff1ahttps://github.com/lenianiva/Pantograph Python \u5c01\u88c5\uff1ahttps://github.com/lenianiva/PyPantograph "},{"location":"tutorial/repl/","title":"Lean4 REPL","text":""},{"location":"tutorial/repl/#_1","title":"\u9879\u76ee\u6982\u8981","text":"REPL (Read-Eval-Print Loop) \u662f\u4e00\u4e2a\u4ea4\u4e92\u5f0f\u7f16\u7a0b\u73af\u5883\uff0c\u5141\u8bb8\u7528\u6237\u8f93\u5165\u547d\u4ee4\uff0c\u6267\u884c\u5e76\u67e5\u770b\u7ed3\u679c\u3002Lean 4 REPL \u57fa\u4e8e JSON \u901a\u4fe1\uff0c\u652f\u6301\u4e09\u79cd\u5de5\u4f5c\u6a21\u5f0f\u3002
"},{"location":"tutorial/repl/#command-mode","title":"\u547d\u4ee4\u6a21\u5f0f (Command Mode)","text":"\u5728\u547d\u4ee4\u6a21\u5f0f\u4e0b\uff0c\u53ef\u4ee5\u53d1\u9001\u5b8c\u6574\u7684 Lean \u547d\u4ee4\uff08\u5982\u58f0\u660e\u3001\u5b9a\u4e49\u7b49\uff09\u5230 REPL\uff0c\u6bd4\u5982\uff1a
{ \"cmd\": \"def f := 2\" }\n
"},{"location":"tutorial/repl/#file-mode","title":"\u6587\u4ef6\u6a21\u5f0f (File Mode)","text":"\u6587\u4ef6\u6a21\u5f0f\u662f\u547d\u4ee4\u6a21\u5f0f\u7684\u7b80\u5355\u5c01\u88c5\uff0c\u5141\u8bb8\u76f4\u63a5\u8bfb\u53d6\u548c\u6267\u884c\u6574\u4e2a Lean \u6587\u4ef6\u7684\u5185\u5bb9\u3002\u4f8b\u5982\uff1a
{ \"path\": \"test/file.lean\", \"allTactics\": true }\n
"},{"location":"tutorial/repl/#tactic-mode","title":"\u7b56\u7565\u6a21\u5f0f (Tactic Mode)","text":"\u7b56\u7565\u6a21\u5f0f\u5141\u8bb8\u4f7f\u7528 Lean \u7684\u8bc1\u660e\u7b56\u7565\uff08tactics\uff09\u6765\u4ea4\u4e92\u5f0f\u5730\u6784\u5efa\u8bc1\u660e\u3002\u8fd9\u4e2a\u6a21\u5f0f\u901a\u5e38\u4ece\u4e00\u4e2a\u5305\u542b sorry
\u7684\u547d\u4ee4\u5f00\u59cb\uff0c\u7136\u540e\u9010\u6b65\u5b8c\u6210\u8bc1\u660e\u3002
"},{"location":"tutorial/repl/#_2","title":"\u5b89\u88c5\u4e0e\u57fa\u672c\u4f7f\u7528","text":""},{"location":"tutorial/repl/#_3","title":"\u5b89\u88c5","text":"\u9996\u5148\uff0c\u514b\u9686\u5e76\u6784\u5efa REPL \u9879\u76ee\uff1a
git clone https://github.com/leanprover-community/repl\ncd repl\nlake update -R && lake build\n
\u7279\u522b\u6ce8\u610f\uff0cREPL \u7684\u7248\u672c\u9700\u8981\u4e0e\u76ee\u6807 Lean \u4ee3\u7801\u7684\u7248\u672c\u4fdd\u6301\u4e00\u81f4\u3002
"},{"location":"tutorial/repl/#_4","title":"\u57fa\u672c\u4f7f\u7528","text":"\u8fdb\u5165\u4ed3\u5e93\uff0c\u901a\u8fc7 lake exe repl
\u542f\u52a8\u4ea4\u4e92\u5f0f\u7ec8\u7aef\uff0c\u8f93\u5165 JSON \u5757\uff0c\u83b7\u53d6\u76f8\u5e94\u7684\u8f93\u51fa\u3002
\u6b64\u5916\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u6807\u51c6\u8f93\u5165\u8f93\u51fa\u6d41\u8fdb\u884c\u901a\u4fe1\uff0c\u6bd4\u5982\uff1a
echo '{ \"cmd\": \"def f := 2\" }' | lake exe repl\n
"},{"location":"tutorial/repl/#repl","title":"REPL \u547d\u4ee4\u6a21\u5f0f","text":"\u4e0b\u8fb9\uff0c\u6211\u4eec\u8be6\u7ec6\u4ecb\u7ecd REPL \u7684\u4e09\u79cd\u6a21\u5f0f\uff0c\u4ee5\u53ca Pickle \u7279\u6027\u3002\u5148\u4ece\u6700\u57fa\u7840\u7684 \u547d\u4ee4\u6a21\u5f0f \u5f00\u59cb\u3002
"},{"location":"tutorial/repl/#_5","title":"\u72b6\u6001\u8ddf\u8e2a","text":"REPL \u7684\u547d\u4ee4\u6a21\u5f0f\u901a\u8fc7 env
\u5b57\u6bb5\u8ddf\u8e2a\u73af\u5883\u72b6\u6001\uff0c\u6bcf\u6b21\u6267\u884c cmd
\u547d\u4ee4\u540e\u4f1a\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684\u73af\u5883\u7f16\u53f7\u3002\u8fd9\u79cd\u673a\u5236\u6709\u5f88\u591a\u597d\u5904\uff1a
\u72b6\u6001\u8ffd\u8e2a\uff1a\u5141\u8bb8\u5728\u4e00\u4e2a\u4ea4\u4e92\u7ec8\u7aef\u4e2d\u542f\u7528\u591a\u4e2a\u73af\u5883\uff0c\u6bd4\u5982 import
\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u6bcf\u4e2a\u547d\u4ee4\u6267\u884c\u540e\u90fd\u4f1a\u751f\u6210\u65b0\u7684\u73af\u5883\u7f16\u53f7 \u73af\u5883\u9009\u62e9\uff1a\u5141\u8bb8\u901a\u8fc7\u6307\u5b9a env
\u503c\u56de\u6eaf\u5230\u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5728\u8be5\u73af\u5883\u7684\u57fa\u7840\u4e0a\u6267\u884c\u65b0\u547d\u4ee4 \u73af\u5883\u9694\u79bb\uff1a\u4e0d\u540c\u73af\u5883\u7684\u53d8\u91cf\u76f8\u4e92\u72ec\u7acb "},{"location":"tutorial/repl/#_6","title":"\u793a\u4f8b\u89e3\u6790","text":"\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u5177\u4f53\u793a\u4f8b\u6765\u7406\u89e3\u547d\u4ee4\u6a21\u5f0f\u7684\u5de5\u4f5c\u65b9\u5f0f\uff1a
# \u547d\u4ee4\u5e8f\u5217\n{\"cmd\": \"def f1 := 37\"} # \u547d\u4ee4 1\n{\"cmd\": \"def f2 := 37\", \"env\":0} # \u547d\u4ee4 2\n{\"cmd\": \"def f3 := f1 + f2\", \"env\": 1 } # \u547d\u4ee4 3\n{\"cmd\": \"def f3 := f1 + f2\", \"env\": 1 } # \u547d\u4ee4 4\n{\"cmd\": \"def f3 := f1 + f2\", \"env\": 2 } # \u547d\u4ee4 5\n
\u73af\u5883\u53d8\u5316\u8fc7\u7a0b\uff1a
\u5b9a\u4e49 f1 := 37
\uff0c\u521b\u5efa\u65b0\u73af\u5883 env 0 \u57fa\u4e8e env 0 \u6dfb\u52a0\u5b9a\u4e49 f2 := 37
\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 1 \u57fa\u4e8e env 1 \u6dfb\u52a0\u5b9a\u4e49 f3 := f1 + f2
\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 2 \u57fa\u4e8e env 1 \u6267\u884c\u76f8\u540c\u64cd\u4f5c\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 3 \u57fa\u4e8e env 2 \u91cd\u65b0\u5b9a\u4e49 f3
\uff0c\u62a5\u9519\uff1a'f3' has already been declared
\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 4 "},{"location":"tutorial/repl/#repl_1","title":"REPL \u7b56\u7565\u6a21\u5f0f","text":"\u7b56\u7565\u6a21\u5f0f\uff08Tactic Mode\uff09\u662f REPL \u7684\u6838\u5fc3\u529f\u80fd\uff0c\u7528\u4e8e\u4ea4\u4e92\u5f0f\u8bc1\u660e\u6784\u5efa\u3002
\u7b56\u7565\u6a21\u5f0f\u6709\u4ee5\u4e0b\u7279\u6027\uff1a
\u72b6\u6001\u521b\u5efa\uff1a\u4f7f\u7528 sorry
\u521b\u5efa\u8bc1\u660e\u5360\u4f4d\u7b26\uff0c \u72b6\u6001\u8ffd\u8e2a\uff1a\u901a\u8fc7 proofState
\u6807\u8bc6\u72b6\u6001\u7d22\u5f15\uff0c\u6bcf\u4e2a sorry
\u6309\u987a\u5e8f\u751f\u6210 proofState
\uff0c\u7b56\u7565\u4f5c\u7528\u4e5f\u4f1a\u4ea7\u751f\u65b0\u7684\u8bc1\u660e\u72b6\u6001 \u591a\u76ee\u6807\u5904\u7406\uff1a\u652f\u6301 pick \u6307\u5b9a\u76ee\u6807\u6765\u8fdb\u884c\u4e0b\u4e00\u6b65\u8bc1\u660e \u7075\u6d3b\u6027\uff1a\u652f\u6301\u5404\u79cd\u8bc1\u660e\u7b56\u7565\uff0c\u5305\u62ec have, calc
\u7b49\uff0c\u4e14\u5141\u8bb8\u5206\u6b65\u6784\u5efa\u590d\u6742\u8bc1\u660e "},{"location":"tutorial/repl/#_7","title":"\u793a\u4f8b\u89e3\u6790","text":"\u4e3a\u5c55\u793a\u65b9\u4fbf\uff0c\u6211\u4eec\u5c06\u8f93\u51fa\u7ed3\u679c\u62fc\u63a5\u5230\u5bf9\u5e94\u8f93\u5165\u884c\u540e\u8fb9\uff1a
# \u6b65\u9aa41\uff1a\u521b\u5efa\u5b9a\u7406\n{\"cmd\" : \"def f (x : Unit) : Nat := by sorry\"}\n# \u8fd4\u56de proofState 0\uff0c\u5e76\u5f97\u5230 env 0\n{\"sorries\":\n [{\"proofState\": 0,\n \"pos\": {\"line\": 1, \"column\": 29},\n \"goal\": \"x : Unit\\n\u22a2 Nat\",\n \"endPos\": {\"line\": 1, \"column\": 34}}],\n \"messages\":\n [{\"severity\": \"warning\",\n \"pos\": {\"line\": 1, \"column\": 4},\n \"endPos\": {\"line\": 1, \"column\": 5},\n \"data\": \"declaration uses 'sorry'\"}],\n \"env\": 0}\n\n# \u6b65\u9aa42\uff1a\u5e94\u7528\u7b2c\u4e00\u4e2a\u7b56\u7565\n{\"tactic\": \"apply Int.natAbs\", \"proofState\": 0}\n# \u751f\u6210\u65b0\u7684\u8bc1\u660e\u72b6\u6001 proofState 1\n{\"proofState\": 1, \"goals\": [\"x : Unit\\n\u22a2 Int\"]}\n\n# \u6b65\u9aa43\uff1a\u5b8c\u6210\u8bc1\u660e\n{\"tactic\": \"exact 0\", \"proofState\": 1}\n# \u7a7a\u76ee\u6807\u5217\u8868\u8868\u793a\u8bc1\u660e\u5b8c\u6210\n{\"proofState\": 2, \"goals\": []}\n
"},{"location":"tutorial/repl/#have","title":"\u590d\u6742\u793a\u4f8b\uff1a\u4f7f\u7528 have \u7b56\u7565","text":"# \u521b\u5efa\u5e26\u6709\u4e2d\u95f4\u6b65\u9aa4\u7684\u5b9a\u7406\n{\"cmd\": \"theorem foo (x : Int) : x = x := by\\n have h : x = 1 := by sorry\"}\n\n# \u7ed3\u679c\uff1a\n# 1. \u629b\u51fa\u9519\u8bef\uff1a\u53ea\u653e\u4e86\u4e00\u5904 sorry\uff0c\u5b58\u5728\u672a\u89e3\u51b3\u7684\u76ee\u6807\n# 2. \u8fd4\u56de proofState 0\uff0c\u7531 have \u7684 sorry \u4ea7\u751f\n{\"sorries\":\n [{\"proofState\": 0,\n \"pos\": {\"line\": 2, \"column\": 23},\n \"goal\": \"x : Int\\n\u22a2 x = 1\",\n \"endPos\": {\"line\": 2, \"column\": 28}}],\n \"messages\":\n [{\"severity\": \"error\",\n \"pos\": {\"line\": 1, \"column\": 33},\n \"endPos\": {\"line\": 2, \"column\": 28},\n \"data\": \"unsolved goals\\nx : Int\\nh : x = 1\\n\u22a2 x = x\"}],\n \"env\": 0}\n\n# \u4f7f\u7528 have \u7b56\u7565\n{\"proofState\" : 0, \"tactic\": \"have h : x = 1 := by sorry\"}\n# \u7ed3\u679c\uff1a\n# 1. have \u5f15\u5165\u4e86\u65b0\u7684\u76ee\u6807 proofState 1\n# 2. proofState 0 \u5728\u6267\u884c have \u540e\u53d8\u4e3a proofState 2\n{\"sorries\": [{\"proofState\": 1, \"goal\": \"x : Int\\n\u22a2 x = 1\"}],\n \"proofState\": 2,\n \"goals\": [\"x : Int\\nh : x = 1\\n\u22a2 x = 1\"]}\n
"},{"location":"tutorial/repl/#repl_2","title":"REPL \u6587\u4ef6\u6a21\u5f0f","text":"\u6587\u4ef6\u6a21\u5f0f\u662f REPL \u63d0\u4f9b\u7684\u4e00\u4e2a\u7b80\u5355\u4f46\u5b9e\u7528\u7684\u529f\u80fd\uff0c\u5b83\u5141\u8bb8\u76f4\u63a5\u8bfb\u53d6\u548c\u6267\u884c Lean \u6e90\u6587\u4ef6\u3002
"},{"location":"tutorial/repl/#_8","title":"\u7528\u6cd5\u793a\u4f8b","text":"\u5047\u8bbe test/file.lean
\u5305\u542b\u4ee5\u4e0b\u5185\u5bb9\uff1a
def f : Nat := 37\ndef g := 2\ntheorem h : f + g = 39 := by exact rfl\n
\u5c06 allTactics
\u53c2\u6570\u8bbe\u7f6e\u4e3a true
\uff0c\u83b7\u53d6\u66f4\u8be6\u7ec6\u7684\u8bc1\u660e\u8fc7\u7a0b\u548c\u72b6\u6001\uff1a
echo '{\"path\": \"/path/to/file.lean\", \"allTactics\": true}' | lake exe repl\n
\u6267\u884c\u540e\u4f1a\u5f97\u5230\u7c7b\u4f3c\u7684\u8f93\u51fa\uff1a
{\"tactics\":\n [{\"tactic\": \"exact rfl\",\n \"proofState\": 0,\n \"pos\": {\"line\": 3, \"column\": 29},\n \"goals\": \"\u22a2 f + g = 39\",\n \"endPos\": {\"line\": 3, \"column\": 38}}],\n \"env\": 0}\n
\u6548\u679c\u7b49\u540c\u4e8e\u5c06\u6587\u4ef6\u5185\u5bb9\u901a\u8fc7 cmd
\u547d\u4ee4\u6267\u884c\uff0c\u5373\uff1a
echo '{\"cmd\" : \"def f : Nat := 37\\\\ndef g := 2\\\\ntheorem h : f + g = 39 := by exact rfl\", \"allTactics\": true}' | lake exe repl\n
"},{"location":"tutorial/repl/#pickle","title":"Pickle \u7279\u6027","text":"Pickle \u7279\u6027\u5141\u8bb8\u6211\u4eec\u5c06\u73af\u5883\u72b6\u6001\uff08env\uff09\u6216\u8bc1\u660e\u72b6\u6001\uff08proofState\uff09\u4fdd\u5b58\u5230\u6587\u4ef6\u4e2d\uff0c\u5e76\u5728\u9700\u8981\u65f6\u91cd\u65b0\u52a0\u8f7d\u3002
\u4f7f\u7528\u573a\u666f\uff1aREPL \u662f\u4ee5 Json \u6570\u636e\u5f62\u5f0f\u4ea4\u4e92\u7684\uff0c\u5982\u679c\u6211\u4eec\u60f3\u8fd8\u539f\u5f53\u524d\u7684\u8bc1\u660e\u72b6\u6001\u6216\u73af\u5883\uff0c\u9700\u8981\u91cd\u65b0\u6267\u884c\u6240\u6709\u547d\u4ee4\u3002\u5bf9\u4e8e\u590d\u6742\u7684\u8bc1\u660e\u8fc7\u7a0b\uff0c\u91cd\u590d\u6267\u884c\u4f1a\u5f88\u8017\u65f6\u3002\u6b64\u5916\uff0c\u5728\u591a\u673a\u534f\u4f5c\u65f6\uff0c\u6211\u4eec\u4e5f\u9700\u8981\u5171\u4eab\u8bc1\u660e\u72b6\u6001\u3002
"},{"location":"tutorial/repl/#pickle_1","title":"Pickle \u7684\u57fa\u672c\u64cd\u4f5c","text":"Pickle \u7684\u57fa\u672c\u64cd\u4f5c\uff1a
\u4fdd\u5b58\u73af\u5883/\u72b6\u6001\uff08pickleTo\uff09 \u52a0\u8f7d\u72b6\u6001\uff08unpickleProofStateFrom\uff09 \u52a0\u8f7d\u73af\u5883\uff08unpickleEnvFrom\uff09 "},{"location":"tutorial/repl/#_9","title":"\u793a\u4f8b\u5206\u6790","text":"\u770b\u4e00\u4e2a\u5b9e\u9645\u7684\u4f8b\u5b50\uff1a
# 1. \u5bfc\u5165\u57fa\u7840\u5e93\n{\"cmd\" : \"import Mathlib\"}\n\n# 2. \u521b\u5efa\u5b9a\u7406\n{\"cmd\": \"theorem simple \\n (a : \u211d):\\n a^((1:\u211d)/2 * 2) = a := by sorry\", \"env\":0}\n\n# 3. \u4fdd\u5b58\u8bc1\u660e\u72b6\u6001\n{\"pickleTo\": \"test.olean\", \"proofState\": 0}\n\n# 4. \u52a0\u8f7d\u8bc1\u660e\u72b6\u6001\n{\"unpickleProofStateFrom\": \"test.olean\"}\n\n# 5. \u7ee7\u7eed\u8bc1\u660e\n{\"tactic\": \"ring_nf\", \"proofState\": 1}\n{\"tactic\": \"simp\", \"proofState\": 2}\n
"},{"location":"tutorial/repl/#mathlib","title":"\u914d\u7f6e Mathlib \u4f9d\u8d56","text":"REPL \u672c\u8eab\u4e0d\u4f9d\u8d56 Mathlib\uff0c\u4f46\u6211\u4eec\u53ef\u80fd\u9700\u8981\u5904\u7406\u5305\u542b Mathlib \u4f9d\u8d56\u7684\u9879\u76ee\u3002\u4ee5 Lean 4.14.0 \u7248\u672c\u4e3a\u4f8b\uff0c\u6709\u4e24\u79cd\u89e3\u51b3\u65b9\u5f0f\uff1a
\u65b9\u5f0f\u4e00\uff1a\u76f4\u63a5\u6dfb\u52a0 Mathlib \u4f9d\u8d56
\u5728 REPL \u9879\u76ee\u7684 lakefile.toml
\u4e2d\u6dfb\u52a0\u4f9d\u8d56\uff1a [[require]]\nname = \"mathlib\"\ngit = \"https://github.com/leanprover-community/mathlib4\"\nrev = \"4bbdccd9c5f862bf90ff12f0a9e2c8be032b9a84\"\n
\u66f4\u65b0\u5e76\u6784\u5efa\uff1a lake update -R && lake exe cache get && lake build\n
\u4f7f\u7528\u793a\u4f8b\uff1a echo '{ \"cmd\": \"import Mathlib\" }' | lake exe repl\n
\u65b9\u5f0f\u4e8c\uff1a\u4f7f\u7528 lake env
\u5728\u5305\u542b Mathlib \u4f9d\u8d56\u7684\u9879\u76ee\u4e2d\uff0c\u4f7f\u7528 lake env
\u6307\u5411 REPL \u53ef\u6267\u884c\u6587\u4ef6\uff1a
echo '{ \"cmd\": \"import Mathlib\" }' | lake env /path/to/repl/.lake/build/bin/repl\n
"},{"location":"tutorial/repl/#_10","title":"\u66f4\u591a\u793a\u4f8b","text":"\u6700\u540e\uff0c\u9644\u4e0a REPL \u6d4b\u8bd5\u4ee3\u7801\u63d0\u4f9b\u7684\u793a\u4f8b\uff0c\u4e3a\u5c55\u793a\u65b9\u4fbf\uff0c\u6211\u4eec\u5c06\u8f93\u51fa\u7ed3\u679c\u62fc\u63a5\u5230\u5bf9\u5e94\u7684\u8f93\u5165\u884c\u540e\u8fb9\u3002
"},{"location":"tutorial/repl/#_11","title":"\u57fa\u7840\u793a\u4f8b\uff1a\u68c0\u67e5\u53d8\u91cf\u5b9a\u4e49","text":"# \u8f93\u5165\u547d\u4ee4\u548c\u5bf9\u5e94\u8f93\u51fa\n{\"cmd\": \"def f := 2\"} # \u5b9a\u4e49 f\n{\"env\": 0}\n\n{\"cmd\": \"#check f\", \"env\": 0} # \u68c0\u67e5 f \u7684\u7c7b\u578b\n{\"messages\": [{\"data\": \"f : Nat\"}...]} # f \u7684\u7c7b\u578b\u662f Nat\n\n{\"cmd\": \"#check g\", \"env\": 1} # \u68c0\u67e5\u672a\u5b9a\u4e49\u7684 g\n{\"messages\": [{\"data\": \"unknown identifier 'g'\"}...]} # \u62a5\u9519\uff1a\u672a\u77e5\u6807\u8bc6\u7b26\n
\u4f7f\u7528 #check
\u547d\u4ee4\u68c0\u67e5\u53d8\u91cf\u7684\u7c7b\u578b\uff0c\u4ee5\u53ca\u5904\u7406\u672a\u5b9a\u4e49\u53d8\u91cf\u7684\u9519\u8bef\u60c5\u51b5\u3002
"},{"location":"tutorial/repl/#by_cases","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 by_cases \u5206\u7c7b\u8ba8\u8bba","text":"# \u5b9a\u4e49\u5e26\u6709 sorry \u7684\u5b9a\u7406\n{\"cmd\": \"theorem foo (x : Int) : x = x := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"x : Int\\n\u22a2 x = x\"}...]}\n\n# \u4f7f\u7528 by_cases \u7b56\u7565\u5206\u7c7b\u8ba8\u8bba\n{\"proofState\" : 0, \"tactic\": \"by_cases h : x < 0\"}\n{\"proofState\": 1, \"goals\": [\n \"case pos\\nx : Int\\nh : x < 0\\n\u22a2 x = x\",\n \"case neg\\nx : Int\\nh : \u00acx < 0\\n\u22a2 x = x\"]}\n\n# \u5904\u7406\u6b63\u4f8b\n{\"proofState\" : 1, \"tactic\": \"case pos => rfl\"}\n{\"proofState\": 2, \"goals\": [\"case neg...\"]}\n\n# \u4f7f\u7528 sorry \u5b8c\u6210\u6240\u6709\u5269\u4f59\u76ee\u6807\n{\"proofState\" : 1, \"tactic\": \"all_goals sorry\"}\n{\"proofState\": 5, \"goals\": []}\n
\u4f7f\u7528 by_cases
\u7b56\u7565\u8fdb\u884c\u5206\u7c7b\u8ba8\u8bba\uff0c\u5e76\u901a\u8fc7 all_goals sorry
\u5904\u7406\u5269\u4f59\u8bc1\u660e\u76ee\u6807\u3002
"},{"location":"tutorial/repl/#_12","title":"\u53d8\u91cf\u58f0\u660e\u4e0e\u590d\u6742\u5b9a\u7406","text":"# \u58f0\u660e\u53d8\u91cf\n{\"cmd\": \"variable (x y : Nat)\"}\n{\"cmd\": \"variable (f : Nat \u2192 Nat)\", \"env\": 0}\n\n# \u5b9a\u4e49\u590d\u6742\u5b9a\u7406\n{\"cmd\": \"theorem problem (h0 : f 5 = 3) (h1 : f (4 * x * y) = 2 * y * (f (x + y) + f (x - y))) :\n \u2203 (k : Nat), f 2015 = k := by\\n sorry\", \"env\": 1}\n
\u58f0\u660e\u53d8\u91cf\u548c\u51fd\u6570\u53d8\u91cf\uff0c\u5e76\u6784\u5efa\u5305\u542b\u8fd9\u4e9b\u53d8\u91cf\u7684\u590d\u6742\u5b9a\u7406\u3002\u6ce8\u610f\u5230\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\u7684\u9519\u8bef\u63d0\u793a\u8868\u660e\u9700\u8981\u6b63\u786e\u5904\u7406\u53d8\u91cf\u4f5c\u7528\u57df\u3002
"},{"location":"tutorial/repl/#_13","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528\u5404\u79cd\u7b56\u7565\u7ec4\u5408","text":"# \u8bbe\u7f6e simp \u8ffd\u8e2a\u5e76\u5b9a\u4e49\u793a\u4f8b\n{\"cmd\": \"set_option trace.Meta.Tactic.simp true\\nexample {x : Int} (h0 : x > 0) : False := by sorry\"}\n\n# \u5c1d\u8bd5\u4e0d\u540c\u7b56\u7565\n{\"tactic\": \"have h : x > 0 := by sorry\", \"proofState\": 0} # \u5f15\u5165\u65b0\u5047\u8bbe\n{\"tactic\": \"exact h0\", \"proofState\": 1} # \u4f7f\u7528 exact\n{\"tactic\": \"assumption\", \"proofState\": 1} # \u4f7f\u7528 assumption\n{\"tactic\": \"simp only [of_eq_true (eq_true h0)]\", \"proofState\": 1} # simp \u5e26\u914d\u7f6e\n{\"tactic\": \"{ simp [h0] }\", \"proofState\": 1} # \u5c40\u90e8 simp\n# ... \u5176\u4ed6\u7b56\u7565\u5c1d\u8bd5\n
\u591a\u79cd\u8bc1\u660e\u7b56\u7565\u7684\u4f7f\u7528\u65b9\u5f0f\uff0c\u5305\u62ec have
\u3001exact
\u3001assumption
\u548c\u5e26\u4e0d\u540c\u914d\u7f6e\u7684 simp
\u3002
\u6ce8\uff1a\u4e3a\u7b80\u6d01\u8d77\u89c1\uff0c\u7701\u7565\u4e86\u90e8\u5206\u8f93\u51fa\u4fe1\u606f\u3002
"},{"location":"tutorial/repl/#have_1","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 have \u5f15\u5165\u4e2d\u95f4\u53d8\u91cf","text":"# \u4f7f\u7528 have \u5f15\u5165\u4e2d\u95f4\u53d8\u91cf\u5e76\u5b8c\u6210\u5b9a\u4e49\n{\"cmd\": \"def f : Nat := by have t := 37; exact t\", \"allTactics\": true}\n{\"proofState\": 0, \"goals\": [\"t : Nat\\n\u22a2 Nat\"]} # \u5f15\u5165 t \u540e\u7684\u72b6\u6001\n{\"proofState\": 1, \"goals\": []} # exact t \u5b8c\u6210\u8bc1\u660e\n
\u4f7f\u7528 have
\u5f15\u5165\u4e2d\u95f4\u53d8\u91cf\uff0c\u5e76\u7528 exact
\u5b8c\u6210\u5b9a\u4e49\uff0callTactics
\u53c2\u6570\u5141\u8bb8\u8ffd\u8e2a\u7b56\u7565\u6267\u884c\u8fc7\u7a0b\u3002
"},{"location":"tutorial/repl/#lake","title":"\u5305\u7ba1\u7406\u793a\u4f8b\uff1a\u5bfc\u5165 Lake","text":"# \u5bfc\u5165 Lake \u5305\u5e76\u6253\u5f00 DSL \u547d\u540d\u7a7a\u95f4\n{\"cmd\": \"import Lake open Lake DSL\\npackage REPL\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n
\u5bfc\u5165\u548c\u4f7f\u7528 Lake \u5305\u7ba1\u7406\u7cfb\u7edf\uff0c\u8fd9\u662f Lean 4 \u7684\u6807\u51c6\u5305\u7ba1\u7406\u5668\u3002
"},{"location":"tutorial/repl/#sorry","title":"\u7b80\u5355\u793a\u4f8b\uff1a\u57fa\u7840\u5b9a\u4e49\u4e2d\u7684 sorry","text":"# \u4f7f\u7528 sorry \u5b9a\u4e49\u51fd\u6570\n{\"cmd\": \"def f : Nat := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 \u25fe\"}...]}\n
\u6700\u57fa\u672c\u7684 sorry \u5360\u4f4d\u7b26\u4f7f\u7528\u65b9\u5f0f\uff0c\u5176\u4e2d \u22a2 \u25fe
\u8868\u793a\u9700\u8981\u8bc1\u660e\u4e00\u4e2a\u503c\uff08\u800c\u4e0d\u662f\u547d\u9898\uff09\u3002
"},{"location":"tutorial/repl/#_14","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u6784\u9020\u51fd\u6570\u5e94\u7528","text":"# \u7b80\u5355\u6784\u9020\u51fd\u6570\u5e94\u7528\n{\"cmd\": \"def f : Nat := by apply Nat.succ\"}\n{\"messages\": [{\"data\": \"unused variable `h`\"...}]}\n\n# \u4f7f\u7528 by_cases \u7684\u6761\u4ef6\u5206\u652f\n{\"cmd\": \"def f (x : Bool) : Nat := by\\n by_cases x\\n { apply Nat.succ }\"}\n
\u4f7f\u7528 apply
\u7b56\u7565\u5e94\u7528\u6784\u9020\u51fd\u6570\uff0c\u4ee5\u53ca\u5728 by_cases
\u5206\u652f\u4e2d\u4f7f\u7528\u6784\u9020\u51fd\u6570\u3002
"},{"location":"tutorial/repl/#have_2","title":"\u7b56\u7565\u793a\u4f8b\uff1ahave \u5f15\u5165\u4e2d\u95f4\u547d\u9898","text":"# \u521b\u5efa\u5e26\u6709\u591a\u4e2a sorry \u7684\u793a\u4f8b\n{\"cmd\" : \"example : True := by\\n have h : set Nat := by sorry\\n sorry\"}\n{\"sorries\": [\n {\"proofState\": 0, \"goal\": \"x : Int\\n\u22a2 x = x\"}...], # \u7b2c\u4e00\u4e2a sorry\n \"messages\": [{\"data\": \"declaration uses 'sorry'\"}...]}\n\n# have \u8bed\u53e5\u4ea7\u751f\u65b0\u7684\u8bc1\u660e\u72b6\u6001\n{\"sorries\": [{\"proofState\": 1, \"goal\": \"x : Int\\n\u22a2 x = 1\"}],\n \"proofState\": 2,\n \"goals\": [\"x : Int\\nh : x = 1\\n\u22a2 x = x\"]}\n
\u4f7f\u7528 have
\u7b56\u7565\u5f15\u5165\u4e2d\u95f4\u547d\u9898\uff0c\u8fd9\u4f1a\u4ea7\u751f\u4e24\u4e2a\u8bc1\u660e\u76ee\u6807\uff1a\u4e00\u4e2a\u7528\u4e8e\u8bc1\u660e\u5f15\u5165\u7684\u547d\u9898\uff0c\u53e6\u4e00\u4e2a\u7528\u4e8e\u5b8c\u6210\u4e3b\u8981\u8bc1\u660e\u3002
"},{"location":"tutorial/repl/#rfl","title":"\u57fa\u7840\u793a\u4f8b\uff1a\u4f7f\u7528 rfl \u68c0\u67e5\u76f8\u7b49\u6027","text":"# \u5b9a\u4e49\u6570\u503c\n{\"cmd\": \"def f := 37\"}\n{\"env\": 0}\n\n# \u4f7f\u7528 rfl \u68c0\u67e5\u76f8\u7b49\u6027\n{\"cmd\": \"#check (rfl : f = 37)\", \"env\": 0}\n# \u547d\u4ee4\u6267\u884c\u6210\u529f\uff0c\u65e0\u8f93\u51fa\u8868\u793a\u7c7b\u578b\u68c0\u67e5\u901a\u8fc7\n
\u4f7f\u7528 rfl
\uff08reflexivity\uff09\u8bc1\u660e\u7b80\u5355\u7684\u76f8\u7b49\u6027\uff0c\u5e76\u901a\u8fc7 #check
\u9a8c\u8bc1\u3002
"},{"location":"tutorial/repl/#_15","title":"\u793a\u4f8b\uff1a\u4f7f\u7528\u4e0b\u5212\u7ebf\u5360\u4f4d\u7b26","text":"# \u4f7f\u7528\u4e0b\u5212\u7ebf\u4f5c\u4e3a\u5360\u4f4d\u7b26\u5b9a\u4e49\u51fd\u6570\n{\"cmd\": \"def f : Nat := _\"}\n{\"messages\": [{\"data\": \"constructor List.cons...\"}...]}\n
\u4f7f\u7528\u4e0b\u5212\u7ebf\uff08_
\uff09\u4f5c\u4e3a\u5360\u4f4d\u7b26\u6765\u5b9a\u4e49\u51fd\u6570\uff0cREPL \u4f1a\u663e\u793a\u53ef\u80fd\u7684\u6784\u9020\u5668\u4fe1\u606f\u3002
"},{"location":"tutorial/repl/#_16","title":"\u57fa\u7840\u793a\u4f8b\uff1a\u5b9a\u4e49\u6570\u503c\u7c7b\u578b","text":"# \u4f7f\u7528 sorry \u5b9a\u4e49\u81ea\u7136\u6570\n{\"cmd\": \"def f : Nat := sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n
\u4f7f\u7528 sorry
\u4e3a\u81ea\u7136\u6570\u7c7b\u578b\u521b\u5efa\u4e00\u4e2a\u5360\u4f4d\u5b9a\u4e49\u3002
"},{"location":"tutorial/repl/#_17","title":"\u6253\u5370\u793a\u4f8b\uff1a\u67e5\u770b\u5b9a\u4e49\u548c\u8bbe\u7f6e\u9009\u9879","text":"# \u6253\u5370 List.cons \u5b9a\u4e49\n{\"cmd\": \"#print List.cons\"}\n{\"env\": 0}\n\n# \u542f\u7528\u6253\u5370universe\u5c42\u7ea7\n{\"cmd\": \"set_option pp.universes true\"}\n{\"env\": 1}\n\n# \u518d\u6b21\u6253\u5370 List.cons\uff0c\u8fd9\u6b21\u4f1a\u663e\u793auniverse\u4fe1\u606f\n{\"cmd\": \"#print List.cons\", \"env\": 1}\n{\"env\": 2}\n
\u4f7f\u7528 #print
\u547d\u4ee4\u67e5\u770b\u5b9a\u4e49\uff0c\u4ee5\u53ca\u901a\u8fc7 set_option
\u63a7\u5236\u8f93\u51fa\u683c\u5f0f\u3002
"},{"location":"tutorial/repl/#natabs","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 natAbs \u6784\u9020\u81ea\u7136\u6570","text":"# \u5b9a\u4e49\u8fd4\u56de\u81ea\u7136\u6570\u7684\u51fd\u6570\n{\"cmd\" : \"def f (x : Unit) : Nat := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"x : Unit\\n\u22a2 Nat\"}...]}\n\n# \u4f7f\u7528 Int.natAbs \u5c06\u6574\u6570\u8f6c\u6362\u4e3a\u81ea\u7136\u6570\n{\"tactic\": \"apply Int.natAbs\", \"proofState\": 0}\n{\"proofState\": 1, \"goals\": [\"x : Unit\\n\u22a2 Int\"]}\n\n# \u63d0\u4f9b\u5177\u4f53\u6574\u6570\u503c\n{\"tactic\": \"exact -37\", \"proofState\": 1}\n{\"proofState\": 2, \"goals\": []}\n
\u901a\u8fc7 Int.natAbs
\u5c06\u6574\u6570\u8f6c\u6362\u4e3a\u81ea\u7136\u6570\u6765\u6784\u9020 Nat
\u7c7b\u578b\u7684\u503c\u3002
"},{"location":"tutorial/repl/#_18","title":"\u9519\u8bef\u793a\u4f8b\uff1a\u9519\u8bef\u7684\u6784\u9020\u5668\u4f7f\u7528","text":"# \u5c1d\u8bd5\u4f7f\u7528 constructor \u6784\u9020 Nat\n{\"cmd\": \"def f (h : Int) : Nat := by constructor\", \"infotree\": \"substantive\"}\n{\"messages\": [{\"data\": \"don't know how to synthesize placeholder\\ncontext:\\n\u22a2 Nat\"}...]}\n
\u9519\u8bef\u4f7f\u7528 constructor
\u7b56\u7565\u7684\u60c5\u51b5\uff1a\u4e0d\u80fd\u76f4\u63a5\u7528\u6784\u9020\u5668\u6784\u9020 Nat
\u7c7b\u578b\u3002
"},{"location":"tutorial/repl/#_19","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u9519\u8bef\u5904\u7406\u6f14\u793a","text":"# \u5b9a\u4e49\u5b9a\u7406\n{\"cmd\": \"theorem my_theorem (x : Nat) : x = x := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"x : Int\\n\u22a2 x = x\"}...]}\n\n# \u5c1d\u8bd5\u4f7f\u7528\u672a\u5b9a\u4e49\u7684\u524d\u63d0\n{\"tactic\": \"exact my_fake_premise\", \"proofState\": 0}\n{\"messages\": [{\"severity\": \"error\", \"data\": \"unknown identifier 'my_fake_premise'\"}...]}\n
\u5728\u4f7f\u7528\u672a\u5b9a\u4e49\u53d8\u91cf\u65f6 REPL \u7684\u9519\u8bef\u5904\u7406\u673a\u5236\u3002
"},{"location":"tutorial/repl/#sorry_1","title":"\u793a\u4f8b\uff1a\u591a\u4e2a sorry \u7684\u5904\u7406","text":"# \u4f7f\u7528\u591a\u4e2a sorry \u7684\u793a\u4f8b\n{\"cmd\" : \"example : True := by\\n sorry\\n sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n
\u5728\u540c\u4e00\u4e2a\u8bc1\u660e\u4e2d\u4f7f\u7528\u591a\u4e2a sorry
\uff0cREPL \u4f1a\u4e3a\u6bcf\u4e2a sorry
\u5206\u914d\u72ec\u7acb\u7684 proofState
\u3002
"},{"location":"tutorial/repl/#have_3","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 have \u5f15\u5165\u4e2d\u95f4\u7ed3\u8bba","text":"# \u5b9a\u4e49\u5b9a\u7406\n{\"cmd\": \"theorem foo (x : Int) : x = x := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"x : Int\\n\u22a2 x = x\"}...]}\n\n# \u4f7f\u7528 have \u5f15\u5165\u4e2d\u95f4\u7ed3\u8bba\n{\"proofState\" : 0, \"tactic\": \"have h : x = 1 := sorry\"}\n{\"messages\": [{\"data\": \"unsolved goals...\"}...]}\n
\u4f7f\u7528 have
\u7b56\u7565\u5f15\u5165\u4e2d\u95f4\u7ed3\u8bba\uff0c\u8fd9\u4f1a\u4ea7\u751f\u4e24\u4e2a\u8bc1\u660e\u76ee\u6807\uff1a\u4e00\u4e2a\u662f\u8bc1\u660e\u4e2d\u95f4\u7ed3\u8bba\uff0c\u53e6\u4e00\u4e2a\u662f\u4f7f\u7528\u4e2d\u95f4\u7ed3\u8bba\u8bc1\u660e\u539f\u76ee\u6807\u3002
"},{"location":"tutorial/repl/#_20","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u7b80\u5355\u503c\u5b9a\u4e49","text":"# \u5b9a\u4e49\u5e26\u6709 sorry \u7684\u81ea\u7136\u6570\n{\"cmd\" : \"def f : Nat := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 True\"}...]}\n\n# \u5c1d\u8bd5\u4f7f\u7528 exact \u7b56\u7565\uff08\u9519\u8bef\u793a\u4f8b\uff09\n{\"tactic\": \"exact 42\", \"proofState\": 1}\n{\"messages\": [{\"data\": \"no goals to be solved\"}...]}\n
\u4e00\u4e2a\u7b80\u5355\u7684\u503c\u5b9a\u4e49\uff0c\u4ee5\u53ca\u5f53\u5c1d\u8bd5\u5728\u65e0\u6548\u72b6\u6001\u4e0a\u4f7f\u7528\u7b56\u7565\u65f6\u7684\u9519\u8bef\u5904\u7406\u3002
"},{"location":"tutorial/repl/#_21","title":"\u6587\u4ef6\u6a21\u5f0f\u793a\u4f8b\uff1a\u8bfb\u53d6\u6587\u4ef6\u5e76\u5904\u7406\u9519\u8bef","text":"# \u8bfb\u53d6\u5e76\u6267\u884c Lean \u6587\u4ef6\n{\"path\": \"test/file.lean\", \"allTactics\": true}\n\n# \u8f93\u51fa\u5305\u542b\u9519\u8bef\u4fe1\u606f\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"x : Nat\\n\u22a2 x = x\"}...]}\n{\"proofState\": 1, \"messages\": [\n {\"data\": \"unknown identifier 'my_fake_premise'\"}...]}\n
\u6587\u4ef6\u6a21\u5f0f\u8bfb\u53d6 Lean \u6587\u4ef6\u5e76\u5904\u7406\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u9519\u8bef\uff08\u5982\u672a\u77e5\u6807\u8bc6\u7b26\uff09\u3002
"},{"location":"tutorial/repl/#trace-simp","title":"\u8c03\u8bd5\u793a\u4f8b\uff1a\u4f7f\u7528 trace \u548c simp","text":"# \u5b9a\u4e49\u51fd\u6570\u548c\u7b80\u5316\u89c4\u5219\n{\"cmd\": \"def f := 37\"}\n{\"cmd\": \"@[simp] theorem f_def : f = 37 := by rfl\", \"env\": 0}\n\n# \u542f\u7528 simp \u8ddf\u8e2a\n{\"cmd\": \"set_option trace.Meta.Tactic.simp true\", \"env\": 1}\n\n# \u4f7f\u7528 simp \u8bc1\u660e\n{\"cmd\": \"example : f = 37 := by simp\", \"env\": 2}\n\n# \u4f7f\u7528 trace \u8fdb\u884c\u8c03\u8bd5\n{\"cmd\": \"example : f = 37 := by sorry\", \"env\": 2}\n{\"tactic\": \"trace \\\"37\\\"\", \"proofState\": 0}\n{\"tactic\": \"simp\", \"proofState\": 0}\n\n# \u5728\u8bc1\u660e\u4e2d\u5d4c\u5165 trace\n{\"cmd\": \"example : True := by\\n trace \\\"!\\\"\\n trivial\"}\n
\u4f7f\u7528 trace
\u548c simp
\u8fdb\u884c\u8c03\u8bd5\u548c\u7b80\u5316\u8bc1\u660e\uff0c\u4ee5\u53ca\u8bbe\u7f6e\u8ddf\u8e2a\u9009\u9879\u3002
"},{"location":"tutorial/repl/#sorry_2","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u76f4\u63a5\u4f7f\u7528 sorry","text":"# \u5b9a\u4e49\u5e26\u6709 sorry \u7684\u51fd\u6570\n{\"cmd\": \"def f : Nat := by sorry\"}\n{\"env\": 0}\n\n# \u76f4\u63a5\u4f7f\u7528 sorry \u5b8c\u6210\u8bc1\u660e\n{\"proofState\": 0, \"tactic\": \"sorry\"}\n{\"env\": 2}\n
\u6700\u7b80\u5355\u7684 sorry \u7528\u6cd5\uff1a\u76f4\u63a5\u7528 sorry \u5b8c\u6210\u5b9a\u4e49\u6216\u8bc1\u660e\u3002
"},{"location":"tutorial/repl/#calc","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 calc\uff08\u8ba1\u7b97\u5757\uff09","text":"# \u4f7f\u7528 calc \u5757\u8fdb\u884c\u94fe\u5f0f\u63a8\u5bfc\n{\"cmd\": \"example : 3 = 5 := by calc\\n 3 = 4 := by sorry\\n 4 = 5 := by sorry\", \"allTactics\": true }\n{\"tactics\": [{\"tactic\": \"exact rfl\", \"goals\": \"\u22a2 f + g = 39\"...}]}\n
\u4f7f\u7528 calc
\u8bed\u6cd5\u6784\u5efa\u94fe\u5f0f\u7b49\u5f0f\u63a8\u5bfc\uff0c\u6bcf\u4e00\u6b65\u90fd\u4f7f\u7528 sorry
\u6807\u8bb0\u5f85\u8bc1\u660e\u7684\u6b65\u9aa4\u3002
"},{"location":"tutorial/repl/#_22","title":"\u9519\u8bef\u5904\u7406\u793a\u4f8b\uff1a\u7b56\u7565\u540d\u62fc\u5199\u9519\u8bef","text":"# \u5b9a\u4e49\u5e26\u6709 sorry \u7684\u51fd\u6570\n{\"cmd\" : \"def f : Nat := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n\n# \u9519\u8bef\u7684\u7b56\u7565\u540d\u79f0 (exat \u5e94\u4e3a exact)\n{\"tactic\": \"exat 42\", \"proofState\": 0}\n{\"proofState\": 1, \"goals\": [\"\u22a2 Nat\"]} # \u7b56\u7565\u6267\u884c\u5931\u8d25\uff0c\u76ee\u6807\u4fdd\u6301\u4e0d\u53d8\n
\u5f53\u7b56\u7565\u540d\u79f0\u62fc\u5199\u9519\u8bef\u65f6\uff08exat
\u800c\u4e0d\u662f exact
\uff09\uff0cREPL \u4f1a\u4fdd\u6301\u8bc1\u660e\u72b6\u6001\u4e0d\u53d8\uff0c\u5141\u8bb8\u7ee7\u7eed\u5c1d\u8bd5\u6b63\u786e\u7684\u7b56\u7565\u3002
"},{"location":"tutorial/repl/#_23","title":"\u793a\u4f8b\uff1a\u591a\u4e2a\u5b9a\u7406\u7684\u8fde\u7eed\u5b9a\u4e49","text":"# \u5b9a\u4e49\u7b2c\u4e00\u4e2a\u5b9a\u7406\n{\"cmd\": \"theorem thm1 : 1 = 1 := sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 1 = 1\"}...], \"env\": 0}\n\n# \u5728\u540c\u4e00\u73af\u5883\u4e0b\u5b9a\u4e49\u7b2c\u4e8c\u4e2a\u5b9a\u7406\n{\"cmd\": \"theorem thm2 : 2 = 2 := sorry\", \"env\": 0}\n{\"sorries\": [{\"proofState\": 1, \"goal\": \"\u22a2 2 = 2\"}...], \"env\": 1}\n
\u5728\u540c\u4e00\u73af\u5883\u4e2d\u8fde\u7eed\u5b9a\u4e49\u591a\u4e2a\u5f85\u8bc1\u660e\u7684\u5b9a\u7406\uff0c\u6bcf\u4e2a\u5b9a\u7406\u83b7\u5f97\u72ec\u7acb\u7684 proofState
\u3002
"},{"location":"tutorial/repl/#sorry_3","title":"\u793a\u4f8b\uff1asorry \u5360\u4f4d\u7b26\u7684\u57fa\u672c\u4f7f\u7528","text":"# \u4f7f\u7528 sorry \u5b9a\u4e49\u4e00\u4e2a\u81ea\u7136\u6570\n{\"cmd\": \"def f : Nat := by sorry\", \"env\": 5}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 \u25fe\"}...],\n \"messages\": [{\"data\": \"declaration uses 'sorry'\"}...],\n \"env\": 2}\n
\u4f7f\u7528 sorry
\u4f5c\u4e3a\u5360\u4f4d\u7b26\u6765\u5b9a\u4e49\u4e00\u4e2a\u5c1a\u672a\u5b9e\u73b0\u7684\u81ea\u7136\u6570\u503c\uff0c\u5176\u4e2d \u22a2 \u25fe
\u8868\u793a\u9700\u8981\u63d0\u4f9b\u4e00\u4e2a Nat
\u7c7b\u578b\u7684\u503c\u3002
"},{"location":"tutorial/repl/#_24","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u5b9a\u4e49\u81ea\u7136\u6570\u503c","text":"# \u5b9a\u4e49\u5e26\u8bc1\u660e\u7684\u81ea\u7136\u6570\n{\"cmd\" : \"def f : Nat := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n\n# \u5c1d\u8bd5\u5e94\u7528 Int.natAbs\uff08\u9519\u8bef\u793a\u8303\uff09\n{\"tactic\": \"apply Int.natAbs\", \"proofState\": 0}\n{\"messages\": [{\"data\": \"type expected, got (set Nat...\"}...]}\n\n# \u5f15\u5165\u4e2d\u95f4\u503c\n{\"tactic\": \"have t : Nat := 42\", \"proofState\": 0}\n{\"proofState\": 2...}\n\n# \u4f7f\u7528\u5f15\u5165\u7684\u503c\u5b8c\u6210\u8bc1\u660e\n{\"tactic\": \"exact t\", \"proofState\": 2}\n{\"proofState\": 3, \"goals\": []}\n
\u901a\u8fc7\u5f15\u5165\u5177\u4f53\u503c\uff0842\uff09\u6765\u5b9a\u4e49\u81ea\u7136\u6570\uff0c\u4ee5\u53ca\u5904\u7406\u9519\u8bef\u7b56\u7565\u5e94\u7528\u7684\u60c5\u51b5\u3002
"},{"location":"tutorial/repl/#have_4","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 have \u5f15\u5165\u4e2d\u95f4\u7ed3\u8bba","text":"# \u65b9\u5f0f\u4e00\uff1a\u5728\u5b9a\u7406\u4e2d\u76f4\u63a5\u4f7f\u7528 have\n{\"cmd\": \"theorem foo (x : Int) : x = x := by\\n have h : x = 1 := by sorry\"}\n{\"messages\": [\"unsolved goals\\nx : Int\\nh : x = 1\\n\u22a2 x = x\"...]}\n\n# \u65b9\u5f0f\u4e8c\uff1a\u5206\u6b65\u6267\u884c have\n{\"cmd\": \"theorem foo (x : Int) : x = x := by sorry\"}\n{\"sorries\": [{\"proofState\": 1, \"goal\": \"x : Int\\n\u22a2 x = x\"}...]}\n\n{\"proofState\" : 0, \"tactic\": \"have h : x = 1 := by sorry\"}\n{\"sorries\": [{\"goal\": \"x : Int\\n\u22a2 x = 1\"}],\n \"goals\": [\"x : Int\\nh : x = 1\\n\u22a2 x = 1\"]}\n
\u4e24\u79cd\u4f7f\u7528 have
\u5f15\u5165\u4e2d\u95f4\u7ed3\u8bba\u7684\u65b9\u5f0f\uff0c\u4ee5\u53ca\u5b83\u4eec\u4ea7\u751f\u7684\u8bc1\u660e\u72b6\u6001\u3002
"},{"location":"tutorial/repl/#_25","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u57fa\u672c\u7b56\u7565\u7ec4\u5408","text":"# \u5b9a\u4e49\u51fd\u6570 f\uff0c\u4f7f\u7528\u7b56\u7565\u6a21\u5f0f\n{\"cmd\": \"def f : Nat := by\"}\n{\"tactics\": [\n # \u7b2c\u4e00\u4e2a\u7b56\u7565\uff1a\u5f15\u5165\u4e2d\u95f4\u53d8\u91cf\n {\"tactic\": \"have t := 37\", \"goals\": \"\u22a2 Nat\"...},\n # \u7b2c\u4e8c\u4e2a\u7b56\u7565\uff1a\u4f7f\u7528\u5f15\u5165\u7684\u53d8\u91cf\u5b8c\u6210\u8bc1\u660e\n {\"tactic\": \"exact t\", \"goals\": \"t : Nat\\n\u22a2 Nat\"...}\n]}\n
\u4f7f\u7528 have
\u548c exact
\u7b56\u7565\u7684\u7ec4\u5408\u6765\u6784\u9020\u4e00\u4e2a\u7b80\u5355\u7684\u81ea\u7136\u6570\u5b9a\u4e49\u3002
"},{"location":"tutorial/repl/#pickle_2","title":"Pickle \u6a21\u5f0f","text":""},{"location":"tutorial/repl/#pickle_3","title":"Pickle \u793a\u4f8b\uff1a\u4fdd\u5b58\u548c\u52a0\u8f7d\u73af\u5883","text":"# \u5b9a\u4e49\u5e76\u4fdd\u5b58\u73af\u5883\n{\"cmd\": \"def f := 42\"} # \u5b9a\u4e49 f\n{\"pickleTo\": \"test/a.olean\", \"env\": 0} # \u4fdd\u5b58\u73af\u5883\n\n# \u52a0\u8f7d\u73af\u5883\u5e76\u4f7f\u7528\n{\"unpickleEnvFrom\": \"test/a.olean\"} # \u52a0\u8f7d\n
\u73af\u5883\u7684\u5e8f\u5217\u5316\u64cd\u4f5c\u3002
"},{"location":"tutorial/repl/#pickle_4","title":"Pickle \u793a\u4f8b\uff1a\u4fdd\u5b58\u548c\u52a0\u8f7d\u73af\u5883","text":"# \u5bfc\u5165\u57fa\u7840\u5e93\u5e76\u5b9a\u4e49\u51fd\u6570\n{\"cmd\": \"import Lean\"}\n{\"cmd\": \"def f := 42\", \"env\": 0}\n\n# \u4fdd\u5b58\u73af\u5883\u5230\u6587\u4ef6\n{\"pickleTo\": \"test/b.olean\", \"env\": 1}\n\n# \u4ece\u6587\u4ef6\u52a0\u8f7d\u73af\u5883\n{\"unpickleEnvFrom\": \"test/b.olean\"}\n\n# \u5728\u52a0\u8f7d\u7684\u73af\u5883\u4e2d\u9a8c\u8bc1\u5b9a\u4e49\n{\"cmd\": \"example : f = 42 := by rfl\", \"env\": 2}\n
\u4f7f\u7528 pickleTo
\u548c unpickleEnvFrom
\u547d\u4ee4\u6765\u4fdd\u5b58\u548c\u6062\u590d\u73af\u5883\u72b6\u6001\uff0c\u5e76\u5728\u6062\u590d\u7684\u73af\u5883\u4e2d\u7ee7\u7eed\u5de5\u4f5c\u3002
"},{"location":"tutorial/repl/#pickle_5","title":"Pickle \u793a\u4f8b\uff1a\u4fdd\u5b58\u548c\u52a0\u8f7d\u8bc1\u660e\u72b6\u6001","text":"# \u5bfc\u5165\u57fa\u7840\u5e93\u5e76\u5b9a\u4e49\u5e26 sorry \u7684\u51fd\u6570\n{\"cmd\" : \"import Lean\"}\n{\"cmd\" : \"def f : Nat := by sorry\", \"env\": 0}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n\n# \u4fdd\u5b58\u521d\u59cb\u72b6\u6001\n{\"pickleTo\": \"test/c.olean\", \"proofState\": 0}\n\n# \u52a0\u8f7d\u72b6\u6001\u5e76\u7ee7\u7eed\u8bc1\u660e\n{\"unpickleProofStateFrom\": \"test/c.olean\", \"env\": 0}\n{\"tactic\": \"have t : Nat := 42\", \"proofState\": 2}\n\n# \u4fdd\u5b58\u4e2d\u95f4\u72b6\u6001\n{\"pickleTo\": \"test/d.olean\", \"proofState\": 3}\n\n# \u52a0\u8f7d\u4e2d\u95f4\u72b6\u6001\u5e76\u5b8c\u6210\u8bc1\u660e\n{\"unpickleProofStateFrom\": \"test/d.olean\", \"env\": 0}\n{\"tactic\": \"exact t\", \"proofState\": 5}\n
\u5728\u8bc1\u660e\u8fc7\u7a0b\u4e2d\u4f7f\u7528 pickle \u4fdd\u5b58\u548c\u52a0\u8f7d\u8bc1\u660e\u72b6\u6001\uff0c\u5b9e\u73b0\u8bc1\u660e\u7684\u65ad\u70b9\u7eed\u4f20\u3002
"},{"location":"tutorial/repl/#pickle_6","title":"Pickle \u793a\u4f8b\uff1a\u52a0\u8f7d\u5e76\u7ee7\u7eed\u8bc1\u660e","text":"# \u4ece\u6587\u4ef6\u52a0\u8f7d\u8bc1\u660e\u72b6\u6001\n{\"unpickleProofStateFrom\": \"test/d.olean\"}\n{\"env\": 0}\n\n# \u4f7f\u7528 exact \u5b8c\u6210\u8bc1\u660e\n{\"tactic\": \"exact t\", \"proofState\": 0}\n{\"messages\": [{\"data\": \"f : Nat\"}...]}\n
\u4ece .olean
\u6587\u4ef6\u52a0\u8f7d\u8bc1\u660e\u72b6\u6001\uff0c\u5e76\u7ee7\u7eed\u5b8c\u6210\u8bc1\u660e\u8fc7\u7a0b\u3002
"},{"location":"tutorial/repl/#pickle-open","title":"Pickle \u793a\u4f8b\uff1a\u4f7f\u7528 open \u5bfc\u5165\u5b9a\u4e49","text":"# \u5728\u547d\u540d\u7a7a\u95f4 X \u4e2d\u5b9a\u4e49 Y\n{\"cmd\": \"def X.Y : Nat := 37\"}\n{\"env\": 0}\n\n# \u6253\u5f00\u547d\u540d\u7a7a\u95f4 X\n{\"cmd\": \"open X\", \"env\": 0}\n{\"env\": 1}\n\n# \u76f4\u63a5\u4f7f\u7528 Y\uff08\u65e0\u9700 X.Y\uff09\u9a8c\u8bc1\u503c\n{\"cmd\": \"example : Y = 37 := rfl\", \"env\": 1}\n{\"env\": 2}\n\n# \u4fdd\u5b58\u73af\u5883\u72b6\u6001\n{\"pickleTo\": \"test/e.olean\", \"env\": 1}\n
\u4f7f\u7528\u547d\u540d\u7a7a\u95f4\uff08namespace\uff09\u7ec4\u7ec7\u4ee3\u7801\uff0c\u4ee5\u53ca\u901a\u8fc7 open
\u547d\u4ee4\u7b80\u5316\u8bbf\u95ee\u3002
"},{"location":"tutorial/repl/#pickle_7","title":"Pickle \u793a\u4f8b\uff1a\u52a0\u8f7d\u73af\u5883\u53d8\u91cf","text":"# \u52a0\u8f7d\u5df2\u4fdd\u5b58\u7684\u73af\u5883\n{\"unpickleEnvFrom\": \"test/e.olean\"}\n{\"env\": 0}\n\n# \u5728\u52a0\u8f7d\u7684\u73af\u5883\u4e2d\u4f7f\u7528\u53d8\u91cf\n{\"cmd\": \"example : Y = 37 := rfl\", \"env\": 0}\n{\"env\": 1}\n
\u4ece .olean
\u6587\u4ef6\u52a0\u8f7d\u9884\u5b9a\u4e49\u7684\u73af\u5883\u5e76\u4f7f\u7528\u5176\u4e2d\u7684\u53d8\u91cf\u3002
"},{"location":"tutorial/repl/#unsafe","title":"\u5bfc\u5165\u6a21\u5757\u548c\u4f7f\u7528 unsafe \u793a\u4f8b","text":"# \u5bfc\u5165 Lean \u6838\u5fc3\u5e93\u5e76\u6253\u5f00\u7f16\u8bd1\u5668\u547d\u540d\u7a7a\u95f4\n{\"cmd\": \"import Lean\"}\n{\"cmd\": \"open Lean.Compiler\", \"env\": 0}\n\n# \u4f7f\u7528 unsafe \u5b9a\u4e49\u5305\u542b sorry \u7684\u793a\u4f8b\n{\"cmd\": \"unsafe example : \u25fe := sorry\", \"env\": 1}\n\n# \u4fdd\u5b58\u73af\u5883\u72b6\u6001\n{\"pickleTo\": \"test/f.olean\", \"env\": 1}\n
\u5bfc\u5165\u6a21\u5757\u3001\u4f7f\u7528 unsafe \u5173\u952e\u5b57\uff0c\u4ee5\u53ca\u5c06\u73af\u5883\u72b6\u6001\u4fdd\u5b58\u5230\u6587\u4ef6\u3002\u8f93\u51fa\u4e2d\u5305\u542b\u4e86\u4e00\u4e9b\u7f16\u8bd1\u5668\u7684\u8ffd\u8e2a\u4fe1\u606f\uff08\u4f7f\u7528 traces
\u5b57\u6bb5\uff09\u548c\u91cd\u5199\u89c4\u5219\u7684\u5e94\u7528\u8fc7\u7a0b\u3002
"},{"location":"tutorial/repl/#pickle-unsafe","title":"Pickle \u793a\u4f8b\uff1a\u52a0\u8f7d\u73af\u5883\u5e76\u5b9a\u4e49 unsafe \u793a\u4f8b","text":"# \u4ece\u6587\u4ef6\u52a0\u8f7d\u73af\u5883\n{\"unpickleEnvFrom\": \"test/f.olean\"}\n\n# \u5728\u52a0\u8f7d\u7684\u73af\u5883\u4e2d\u5b9a\u4e49\u4e0d\u5b89\u5168\u793a\u4f8b\n{\"cmd\": \"unsafe example : \u25fe := sorry\", \"env\": 0}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n
\u4ece\u6301\u4e45\u5316\u6587\u4ef6\u52a0\u8f7d\u73af\u5883\uff0c\u5e76\u5728\u8be5\u73af\u5883\u4e2d\u5b9a\u4e49\u4e00\u4e2a\u5e26\u6709 unsafe
\u6807\u8bb0\u7684\u793a\u4f8b\u3002
"},{"location":"tutorial/repl/#mathlib_1","title":"Mathlib \u793a\u4f8b","text":"\u4ee5\u4e0b\u793a\u4f8b\u6d89\u53ca Mathlib \u4f9d\u8d56\u3002
"},{"location":"tutorial/repl/#pickle_8","title":"\u6570\u5b66\u5b9a\u7406\u793a\u4f8b\uff1a\u4ee3\u6570\u8fd0\u7b97\u4e0e pickle","text":"# \u5bfc\u5165\u5fc5\u8981\u7684\u5e93\n{\"cmd\": \"import Mathlib\\nopen BigOperators\\nopen Real\\nopen Nat\"}\n{\"env\": 0}\n\n# \u5b9a\u4e49\u6570\u5b66\u5b9a\u7406\n{\"cmd\": \"theorem mathd_algebra_455\\n (x : Nat)\\n (h : 2 * (2 * (2 * (2 * x))) = 48) :\\n x = 3 := by sorry\", \"env\": 0}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"...\"}...]}\n\n# \u4fdd\u5b58\u8bc1\u660e\u72b6\u6001\n{\"pickleTo\": \"test/pickle.olean\", \"proofState\": 0}\n
\u8bbe\u7f6e\u4e00\u4e2a\u5305\u542b\u6570\u5b66\u8fd0\u7b97\u7684\u5b9a\u7406\uff0c\u5e76\u4f7f\u7528 pickle \u4fdd\u5b58\u8bc1\u660e\u72b6\u6001\uff0c\u4ee5\u4fbf\u540e\u7eed\u7ee7\u7eed\u5b8c\u6210\u8bc1\u660e\u3002
"},{"location":"tutorial/repl/#pickle_9","title":"Pickle \u793a\u4f8b\uff1a\u52a0\u8f7d\u5df2\u4fdd\u5b58\u7684\u8bc1\u660e\u72b6\u6001","text":"# \u4ece\u6587\u4ef6\u52a0\u8f7d\u8bc1\u660e\u72b6\u6001\n{\"unpickleProofStateFrom\": \"test/pickle.olean\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"x : Nat\\n\u22a2 x + 1 > x\"}...]}\n\n# \u5e94\u7528\u6570\u503c\u89c4\u8303\u5316\u7b56\u7565\n{\"tactic\": \"norm_num at h\", \"proofState\": 0}\n{\"proofState\": 1, \"goals\": [\n \"case zero\\n\u22a2 0 + 1 > 0\",\n \"case succ\\nx : Nat\\nhx : x + 1 > x\\n\u22a2 x + 1 + 1 > x + 1\"]}\n
\u4ece\u5df2\u4fdd\u5b58\u7684\u8bc1\u660e\u72b6\u6001\u6587\u4ef6\u4e2d\u6062\u590d\uff0c\u5e76\u7ee7\u7eed\u4f7f\u7528 norm_num
\u7b56\u7565\u8fdb\u884c\u6570\u503c\u89c4\u8303\u5316\u3002
"},{"location":"tutorial/repl/#_26","title":"\u590d\u6742\u793a\u4f8b\uff1a\u5b9e\u6570\u5206\u6790\u4e2d\u7684\u6307\u6570\u51fd\u6570\u4f30\u8ba1","text":"# \u5bfc\u5165\u6570\u5b66\u5e93\u5e76\u8bbe\u7f6e\u5e42\u8fd0\u7b97\u7b26\u53f7\n{\"cmd\": \"import Mathlib\\nopen Real\\nlocal macro_rules | `($x ^ $y) => `(HPow.hPow $x $y)\"}\n{\"env\": 0}\n\n# \u8bc1\u660e\u6307\u6570\u51fd\u6570\u7684\u8fd1\u4f3c\u4f30\u8ba1\u5b9a\u7406\n{\"cmd\": \"example {n} {x a b : \u211d} (m : \u2115) (e\u2081 : n + 1 = m) (rm : \u211d) (er : \u2191m = rm) \n (h : |x| \u2264 1) (e : |1 - a| \u2264 b - |x| / rm * ((rm + 1) / rm)) : \n |exp x - expNear n x a| \u2264 |x| ^ n / n.factorial * b := \n by apply Real.exp_approx_end' m e\u2081 rm er h e\", \n \"env\": 0}\n
\u4e00\u4e2a\u5173\u4e8e\u6307\u6570\u51fd\u6570\u8fd1\u4f3c\u4f30\u8ba1\u7684\u590d\u6742\u5b9a\u7406\uff0c\u4f7f\u7528 Real.exp_approx_end'
\u5b8c\u6210\u8bc1\u660e\u3002
"},{"location":"tutorial/repl/#_27","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u6570\u5b66\u5f52\u7eb3\u6cd5","text":"# \u5bfc\u5165\u5fc5\u8981\u7684\u7b56\u7565\u5e93\n{\"cmd\": \"import Mathlib.Tactic.Cases\"}\n{\"env\": 0}\n\n# \u4f7f\u7528\u5f52\u7eb3\u6cd5\u8bc1\u660e\u81ea\u7136\u6570\u6027\u8d28\n{\"cmd\": \"example {x : Nat} : x + 1 > x := by\\n induction' x with x hx\", \"env\": 0}\n{\"sorries\": [{\"proofState\": 0, \n \"goal\": \"x : \u2115\\nh : 2 * (2 * (2 * (2 * x))) = 48\\n\u22a2 x = 3\"}...]}\n
\u4f7f\u7528 induction'
\u7b56\u7565\u5bf9\u81ea\u7136\u6570\u8fdb\u884c\u5f52\u7eb3\u8bc1\u660e\u3002
"},{"location":"tutorial/repl/#_28","title":"\u6570\u8bba\u5b9a\u7406\u793a\u4f8b\uff1a\u4f7f\u7528\u5185\u7f6e\u7b56\u7565","text":"# \u5bfc\u5165\u5fc5\u8981\u7684\u5e93\n{\"cmd\": \"import Mathlib.Algebra.BigOperators.Group.Finset\\n...\"}\n{\"env\": 0}\n\n# GCD \u8ba1\u7b97\u793a\u4f8b\n{\"cmd\": \"theorem mathd_numbertheory_188 : Nat.gcd 180 168 = 12 := by norm_num\"}\n\n# \u8ba1\u7b97\u771f\u56e0\u5b50\u4e4b\u548c\n{\"cmd\": \"theorem mathd_numbertheory_403 : \u2211 k in (Nat.properDivisors 198), k = 270 := by simp...\"}\n\n# \u6570\u5217\u6c42\u548c\u53d6\u6a21\n{\"cmd\": \"theorem mathd_numbertheory_109 : (\u2211 k in Finset.Icc 1 100, v k) % 7 = 4 := by simp_rw...\"}\n
\u4f7f\u7528 Lean \u7684\u5185\u7f6e\u7b56\u7565\uff08norm_num
, simp
\uff09\u6765\u8bc1\u660e\u6570\u8bba\u76f8\u5173\u7684\u5b9a\u7406\uff0c\u5305\u62ec GCD \u8ba1\u7b97\u3001\u56e0\u5b50\u6c42\u548c\u548c\u6a21\u8fd0\u7b97\u3002
"},{"location":"tutorial/repl/#_29","title":"\u793a\u4f8b\uff1a\u5f52\u7eb3\u6cd5\u6846\u67b6","text":"# \u5bfc\u5165\u7b56\u7565\u5e93\n{\"cmd\": \"import Mathlib.Tactic.Cases\"}\n{\"env\": 0}\n\n# \u4f7f\u7528\u5f52\u7eb3\u6cd5\u8bc1\u660e\u81ea\u7136\u6570\u6027\u8d28\n{\"cmd\": \"example {x : Nat} : x + 1 > x := by\\n induction' x with x hx\\n all_goals sorry\", \"env\": 0}\n{\"env\": 0}\n
\u4f7f\u7528 induction'
\u7b56\u7565\u8bbe\u7f6e\u5f52\u7eb3\u8bc1\u660e\u7684\u57fa\u672c\u6846\u67b6\u3002\u867d\u7136\u8fd9\u91cc\u7528 sorry
\u8df3\u8fc7\u4e86\u5177\u4f53\u8bc1\u660e\u6b65\u9aa4\uff0c\u4f46\u5c55\u793a\u4e86\u5f52\u7eb3\u8bc1\u660e\u7684\u57fa\u672c\u7ed3\u6784\u3002
"},{"location":"tutorial/repl/#simpa","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 simpa \u7b56\u7565","text":"# \u521b\u5efa False \u7684\u793a\u4f8b\u8bc1\u660e\n{\"cmd\": \"example : False := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 False\"}...]}\n\n# \u4f7f\u7528 simpa \u7b56\u7565\n{\"tactic\": \"simpa using show False by done\", \"proofState\": 0}\n{\"sorries\": [...], \"proofState\": 3, \"goals\": [\n \"case pos\\nx : \u211d\\nh0 : |x| > 1...\",\n \"case neg\\nx : \u211d\\nh0 : |x| > 1...\"]}\n
\u4f7f\u7528 simpa
\u7b56\u7565\u7b80\u5316\u8bc1\u660e\u76ee\u6807\uff0c\u5e76\u901a\u8fc7 show
\u6307\u5b9a\u4e2d\u95f4\u7ed3\u679c\u3002
"},{"location":"tutorial/repl/#_30","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528\u5f52\u7eb3\u6cd5\u8bc1\u660e","text":"# \u5bfc\u5165 Mathlib \u5e76\u5b9a\u4e49\u5b9a\u7406\n{\"cmd\": \"import Mathlib\"}\n{\"env\" : 0, \"cmd\": \"theorem foo (x : Nat) : x = x := by sorry\"}\n\n# \u65b9\u5f0f\u4e00\uff1a\u4f7f\u7528 induction \u540e\u9010\u6b65\u5904\u7406\n{\"proofState\" : 0, \"tactic\": \"induction x\"} # \u5f52\u7eb3\n{\"proofState\" : 1, \"tactic\": \"next => rfl\"} # \u5904\u7406\u4e0b\u4e00\u4e2a\u5206\u652f\n\n# \u65b9\u5f0f\u4e8c\uff1a\u4f7f\u7528 induction with \u6a21\u5f0f\u5339\u914d\u8bed\u6cd5\n{\"proofState\" : 0, \"tactic\": \"induction x with\\n| zero => sorry\\n| succ x => sorry\"}\n
\u4e24\u79cd\u4f7f\u7528\u5f52\u7eb3\u6cd5\u7684\u65b9\u5f0f\uff1a\u9010\u6b65\u5904\u7406\u548c\u6a21\u5f0f\u5339\u914d\u8bed\u6cd5\u3002\u4e24\u79cd\u65b9\u5f0f\u90fd\u4f1a\u751f\u6210\u57fa\u7840\u60c5\u51b5\u548c\u5f52\u7eb3\u6b65\u9aa4\u7684\u8bc1\u660e\u76ee\u6807\u3002
"},{"location":"tutorial/repl/#_31","title":"\u6570\u5b66\u793a\u4f8b\uff1a\u5b9e\u6570\u7edd\u5bf9\u503c\u7684\u8ba8\u8bba","text":"# \u5bfc\u5165\u6570\u5b66\u5e93\u5e76\u6253\u5f00\u5b9e\u6570\u547d\u540d\u7a7a\u95f4\n{\"cmd\": \"import Mathlib\\nopen Real\"}\n\n# \u5b9a\u4e49\u5173\u4e8e\u5b9e\u6570\u7edd\u5bf9\u503c\u7684\u547d\u9898\n{\"cmd\": \"example {x : \u211d} (h0: |x| > 1) : (x < 0) \u2228 (2 * x > 2) := by sorry\", \"env\": 0}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 False\"}...]}\n\n# \u5c1d\u8bd5\u4f7f\u7528\u591a\u4e2a\u8f85\u52a9\u5f15\u7406\u548c\u5206\u7c7b\u8ba8\u8bba\n{\"tactic\": \"on_goal 1 =>\\n have h1 : x = x := by sorry\\n have h2 : x = x := by sorry\\n by_cases h3 : x < 0\", \"proofState\": 0}\n{\"proofState\": 1, \"messages\": [{\"data\": \"unsolved goals\\n\u22a2 False\"}...]}\n
\u5904\u7406\u6d89\u53ca\u5b9e\u6570\u7edd\u5bf9\u503c\u7684\u547d\u9898\uff0c\u4f7f\u7528 have
\u5f15\u5165\u8f85\u52a9\u5f15\u7406\u548c by_cases
\u8fdb\u884c\u5206\u7c7b\u8ba8\u8bba\uff08\u867d\u7136\u8fd9\u4e2a\u5c1d\u8bd5\u672a\u80fd\u5b8c\u6210\u8bc1\u660e\uff09\u3002
"},{"location":"tutorial/repl/#_32","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528\u5f52\u7eb3\u6cd5\u8bc1\u660e","text":"# \u5bfc\u5165\u7b56\u7565\u5e93\n{\"cmd\": \"import Mathlib.Tactic.Cases\"}\n{\"env\": 0}\n\n# \u521b\u5efa\u5173\u4e8e\u81ea\u7136\u6570\u7684\u793a\u4f8b\u5b9a\u7406\n{\"cmd\": \"example {x : Nat} : x + 1 > x := by sorry\", \"env\": 0}\n\n# \u5e94\u7528\u5f52\u7eb3\u6cd5\u7b56\u7565\uff0c\u751f\u6210\u4e24\u4e2a\u5b50\u76ee\u6807\n{\"tactic\": \"induction' x with x hx\", \"proofState\": 0}\n{\"messages\": [{\"data\": \"unsolved goals\\n\n case zero\\n\u22a2 0 + 1 > 0\\n\n case succ\\nx : Nat\\nhx : x + 1 > x\\n\u22a2 x + 1 + 1 > x + 1\"}...]}\n
\u4f7f\u7528 induction'
\u7b56\u7565\u5bf9\u81ea\u7136\u6570\u8fdb\u884c\u5f52\u7eb3\u8bc1\u660e\uff0c\u751f\u6210\u57fa\u7840\u60c5\u51b5\u548c\u5f52\u7eb3\u6b65\u9aa4\u4e24\u4e2a\u5b50\u76ee\u6807\u3002
"},{"location":"tutorial/repl/#_33","title":"\u5bfc\u5165\u793a\u4f8b\uff1a\u4fdd\u5b58\u6570\u5b66\u5e93\u4f9d\u8d56\u73af\u5883","text":"# \u5bfc\u5165\u6570\u5b66\u5e93\u76f8\u5173\u6a21\u5757\n{\"cmd\": \"import Mathlib\\nopen BigOperators\\nopen Real\\nopen Nat\"}\n{\"env\": 0}\n\n# \u4fdd\u5b58\u73af\u5883\u5230\u6587\u4ef6\n{\"pickleTo\": \"test/H20231215.olean\", \"env\": 0}\n
\u5bfc\u5165 Mathlib \u76f8\u5173\u6a21\u5757\u5e76\u5c06\u73af\u5883\u6301\u4e45\u5316\u4fdd\u5b58\uff0c\u8fd9\u5bf9\u4e8e\u9700\u8981\u9891\u7e41\u4f7f\u7528\u6570\u5b66\u5e93\u7684\u8bc1\u660e\u5f88\u6709\u5e2e\u52a9\u3002
"},{"location":"tutorial/repl/#_34","title":"\u6570\u5b66\u8bc1\u660e\u793a\u4f8b\uff1a\u8ba1\u7b97\u590d\u5408\u51fd\u6570","text":"# \u5bfc\u5165\u5fc5\u8981\u7684\u5e93\n{\"cmd\": \"import Mathlib\\nopen Real\\nopen Nat\\nopen BigOperators\"}\n\n# \u5b9a\u4e49\u5b9a\u7406\uff1a\u5173\u4e8e\u590d\u5408\u51fd\u6570 p(q(2)) \u7684\u8ba1\u7b97\n{\"cmd\" : \"theorem mathd_algebra_35\n (p q : \u211d \u2192 \u211d)\n (h\u2080 : \u2200 x, p x = 2 - x^2)\n (h\u2081 : \u2200 x, x \u2260 0 -> q x = 6 / x) :\n p (q 2) = -7 := by sorry\", \"env\": 0}\n\n# \u5c1d\u8bd5\u8bc1\u660e\u6b65\u9aa4\uff08\u672a\u5b8c\u6210\uff09\n{\"tactic\": \"have hQ : \u2200 x, p x = 6 / x\", \"proofState\": 0}\n{\"tactic\": \" intro x\", \"proofState\": 1}\n{\"tactic\": \" calc p x = 6 / x * p x := h\u2080 (x)...\", \"proofState\": 2}\n
\u4e00\u4e2a\u6570\u5b66\u8bc1\u660e\u7684\u5f00\u59cb\uff0c\u6d89\u53ca\u5b9e\u6570\u51fd\u6570\u7684\u590d\u5408\u8ba1\u7b97\uff0c\u5c3d\u7ba1\u8bc1\u660e\u5c1a\u672a\u5b8c\u6210\u3002
"},{"location":"tutorial/repl/#_35","title":"\u793a\u4f8b\uff1a\u4f7f\u7528\u5df2\u4fdd\u5b58\u7684\u73af\u5883\u72b6\u6001","text":"# \u52a0\u8f7d\u4fdd\u5b58\u7684\u73af\u5883\u72b6\u6001\n{\"unpickleEnvFrom\": \"test/H20231215.olean\"}\n{\"env\": 0}\n\n# \u5728\u52a0\u8f7d\u7684\u73af\u5883\u4e2d\u5b9a\u4e49\u65b0\u5b9a\u7406\n{\"cmd\": \"theorem mathd_numbertheory_739 :\\n 9! % 10 = 0 := by sorry\", \"env\": 0}\n{\"env\": 1}\n
\u4f7f\u7528 pickle \u529f\u80fd\u52a0\u8f7d\u9884\u5148\u4fdd\u5b58\u7684\u73af\u5883\u72b6\u6001\uff0c\u5e76\u5728\u5176\u57fa\u7840\u4e0a\u5b9a\u4e49\u65b0\u7684\u5b9a\u7406\u3002
"},{"location":"tutorial/repl/#exact","title":"exact? \u7b56\u7565\u793a\u4f8b\uff1a\u81ea\u52a8\u63a8\u5bfc","text":"# \u5bfc\u5165 Mathlib\n{\"cmd\": \"import Mathlib\"}\n\n# \u6d4b\u8bd5\u7b80\u5355\u5b9a\u7406\uff1a0 < 1\n{\"cmd\": \"theorem test : 0 < 1 := by sorry\", \"env\": 0}\n{\"tactic\": \"exact?\", \"proofState\": 0} # exact? \u81ea\u52a8\u627e\u5230\u8bc1\u660e\n\n# \u6d4b\u8bd5\u4e0d\u53ef\u80fd\u7684\u5b9a\u7406\uff1a3 = 7\n{\"cmd\": \"theorem test : 3 = 7 := by sorry\", \"env\": 0}\n{\"tactic\": \"exact?\", \"proofState\": 2} # exact? \u65e0\u6cd5\u627e\u5230\u8bc1\u660e\n
exact?
\u7b56\u7565\u7684\u81ea\u52a8\u63a8\u5bfc\u80fd\u529b\uff1a\u5bf9\u4e8e\u663e\u7136\u6210\u7acb\u7684\u547d\u9898\u80fd\u81ea\u52a8\u627e\u5230\u8bc1\u660e\uff0c\u5bf9\u4e8e\u660e\u663e\u9519\u8bef\u7684\u547d\u9898\u5219\u65e0\u6cd5\u5b8c\u6210\u8bc1\u660e\u3002
"}]}
\ No newline at end of file
+{"config":{"lang":["zh"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Lean \u4e2d\u6587\u6587\u6863","text":""},{"location":"#lean_1","title":"Lean \u662f\u4ec0\u4e48","text":"Lean \u662f\u5fae\u8f6f\u7814\u7a76\u9662\u5728 2013 \u5e74\u63a8\u51fa\u7684\u8ba1\u7b97\u673a\u5b9a\u7406\u8bc1\u660e\u5668\u3002Lean4 \u4e8e 2021 \u5e74\u53d1\u5e03\uff0c\u4e3a Lean \u5b9a\u7406\u8bc1\u660e\u5668\u7684\u91cd\u65b0\u5b9e\u73b0\uff0c\u80fd\u591f\u751f\u6210 C \u4ee3\u7801\u540e\u8fdb\u884c\u7f16\u8bd1\uff0c\u4ee5\u4fbf\u5f00\u53d1\u9ad8\u6548\u7684\u7279\u5b9a\u9886\u57df\u81ea\u52a8\u5316\u3002
Lean \u4f5c\u4e3a\u4e00\u95e8\u72ec\u7279\u7684\u8bed\u8a00\uff0c\u517c\u5177 \u6570\u5b66\u548c\u7f16\u7a0b \u4e24\u65b9\u9762\u7684\u7279\u6027\u3002
\u4f5c\u4e3a\u4ea4\u4e92\u5f0f\u5b9a\u7406\u8bc1\u660e\u5668\uff0cLean \u63d0\u4f9b\u4e86\u4e25\u683c\u7684\u903b\u8f91\u6846\u67b6\uff0c\u6570\u5b66\u5bb6\u53ef\u4ee5\u5c06\u6570\u5b66\u5b9a\u7406\u8f6c\u6362\u6210\u4ee3\u7801\uff0c\u5e76\u4e25\u683c\u9a8c\u8bc1\u8fd9\u4e9b\u5b9a\u7406\u7684\u6b63\u786e\u6027\u3002 \u4f5c\u4e3a\u901a\u7528\u51fd\u6570\u5f0f\u7f16\u7a0b\u8bed\u8a00\uff0c\u5b83\u5177\u6709 \u4f9d\u8d56\u7c7b\u578b \u7684 \u4e25\u683c \u7684 \u7eaf\u51fd\u6570\u5f0f \u8bed\u8a00\u6027\u8d28\u3002 \u8fd9\u4e9b\u7279\u6027\u8ba9 Lean \u5728\u6570\u5b66\u548c\u8ba1\u7b97\u673a\u79d1\u5b66\u7814\u7a76\u4e2d\u975e\u5e38\u6709\u7528\uff0c\u5b83\u53ef\u4ee5\u5e2e\u52a9\u7814\u7a76\u4eba\u5458\u53d1\u73b0\u5e76\u7ea0\u6b63\u6982\u5ff5\u4e0a\u7684\u9519\u8bef\uff0c\u540c\u65f6\u52a0\u6df1\u4ed6\u4eec\u5bf9\u7814\u7a76\u5bf9\u8c61\u7684\u7406\u89e3\u3002Lean \u7684\u6807\u51c6\u5e93 mathlib \u88ab\u79f0\u4e3a\u672a\u6765\u7684\u6570\u5b66\u56fe\u4e66\u9986\u3002
"},{"location":"#lean-zh","title":"\u5173\u4e8e Lean-zh","text":"Lean-zh \u662f\u4e00\u4e2a\u81ea\u53d1\u7ec4\u6210\u7684\u56e2\u4f53\uff0c\u65e8\u5728\u63a8\u52a8 Lean \u5728\u4e2d\u6587\u5b66\u672f\u548c\u7f16\u7a0b\u793e\u533a\u7684\u666e\u53ca\u548c\u5e94\u7528\u3002
Lean-zh \u63d0\u4f9b\u4e86\u4e00\u4e2a\u5b66\u4e60\u4e0e\u5b9e\u8df5\u7684\u5e73\u53f0\uff0c\u5982\u679c\u4f60\u5bf9 Lean \u611f\u5174\u8da3\uff0c\u65e0\u8bba\u662f\u53c2\u4e0e\u7f16\u5199 Lean \u6559\u7a0b\u3001\u7ffb\u8bd1\u5b98\u65b9\u6587\u6863\u3001\u5f00\u53d1 Lean \u9879\u76ee\uff0c\u8fd8\u662f\u4ee5\u5176\u4ed6\u65b9\u5f0f\u8d21\u732e\u529b\u91cf\uff0c\u6b22\u8fce\u4f60\u7684\u52a0\u5165\uff01
"},{"location":"#_1","title":"\u5feb\u901f\u4e0a\u624b","text":"\u5b66\u4e60 Lean \u7684\u6559\u7a0b\u548c\u9014\u5f84\u5f88\u591a\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u4e2a\u4eba\u7684\u77e5\u8bc6\u80cc\u666f\u548c\u504f\u597d\u3002\u8fd9\u4e9b\u6559\u7a0b\u6709\u504f\u6570\u5b66\u7684\u4e5f\u6709\u504f\u7f16\u7a0b\u7684\u3002
\u6570\u5b66\u65b9\u9762\uff1a
\u81ea\u7136\u6570\u6e38\u620f NNG4\uff1a\u5728\u7ebf\u4ea4\u4e92\u5f0f Lean \u6559\u7a0b\uff0c\u91cd\u70b9\u5728\u8bc1\u660e\u81ea\u7136\u6570\u57fa\u672c\u8fd0\u7b97\u7684\u5c5e\u6027\u3002\u6b64\u5916\uff0cLean Game Server \u6258\u7ba1\u5404\u79cd\u5b66\u4e60\u6e38\u620f\uff0c\u5305\u62ec\u96c6\u5408\u8bba\u3001\u903b\u8f91\u548c Robo\uff08\u4e00\u4e2a\u5173\u4e8e\u672c\u79d1\u6570\u5b66\u7684\u6545\u4e8b\uff09\u7b49\u3002 \u5feb\u901f\u4e0a\u624b\u7684 Lean \u521d\u63a2\u6559\u7a0b\uff1a\u6db5\u76d6\u4f7f\u7528 Lean \u8bc1\u660e\u7684\u4e00\u4e9b\u57fa\u672c\u6982\u5ff5\uff0c\u4e5f\u5305\u62ec\u521d\u7ea7\u5206\u6790\u3001\u521d\u7b49\u6570\u8bba\u548c\u6570\u7406\u903b\u8f91\u7684\u72ec\u7acb\u4e3b\u9898\u3002 \u7f16\u7a0b\u65b9\u9762\uff1a\u53ef\u4ee5\u6d4f\u89c8\u7f51\u7ad9\u9876\u90e8\u7684\u5176\u4ed6\u6807\u7b7e\uff0c\u5305\u62ec\u4e0e Lean \u4ea4\u4e92\u7684\u5e38\u7528\u7f16\u7a0b\u5de5\u5177\u548c Lean \u9879\u76ee\u6559\u7a0b\u7b49\uff0c\u6559\u7a0b\u5e72\u8d27\u6b63\u5728\u8def\u4e0a\u3002\u3002\u3002
"},{"location":"#lean-zh_1","title":"Lean-zh \u8bd1\u5236","text":"\u76ee\u524d Lean-zh \u5df2\u7ffb\u8bd1\u7684\u8d44\u6e90\uff1a
Lean4 \u51fd\u6570\u5f0f\u7f16\u7a0b\uff08Functional Programming in Lean\uff09 Lean4 \u5b9a\u7406\u8bc1\u660e\uff08Theorem Proving in Lean\uff09 Lean4 \u5143\u7f16\u7a0b\uff08Metaprogramming in Lean\uff09 \u8fdb\u884c\u4e2d
Lean \u5f62\u5f0f\u5316\u6570\u5b66(Mathematics in Lean) Lean \u4ea4\u4e92\u5de5\u5177\u7684\u4f7f\u7528\u6559\u7a0b Lean \u9879\u76ee\u7684\u5b9e\u8df5\u6559\u7a0b \u8ba1\u5212\u8fdb\u884c
GlimpseToGame \u5b9a\u7406\u8bc1\u660e\u6e38\u620f\u5236\u4f5c\u53ca\u7ffb\u8bd1 Tactic \u624b\u518c\u53ca\u5982\u4f55\u7f16\u5199 tactic LeanCopliot\uff0cLLMStep \u7b49\u5b9e\u7528\u5de5\u5177\u6559\u7a0b\u53ca\u5b9e\u73b0\u673a\u5236 ... "},{"location":"#_2","title":"\u8054\u7cfb\u6211\u4eec","text":"\u5982\u679c\u6709\u4efb\u4f55\u95ee\u9898\u3001\u5efa\u8bae\u6216\u60f3\u53c2\u4e0e\u5230\u793e\u533a\u4e2d\u6765\uff0c\u6b22\u8fce\u52a0\u5165 QQ \u7fa4 897971266 \u6216 Telegram \u8ba8\u8bba\u7ec4 \u6765\u4e00\u8d77\u4ea4\u6d41\u3002
"},{"location":"#_3","title":"\u5176\u4ed6\u8d44\u6e90","text":"\u6570\u5b66\u5bfc\u5411\uff1a
\u7ecf\u5178\u6559\u6750 Mathematics in Lean \u8282\u594f\u66f4\u7f13\u7684 The Mechanics of Proof \u4ece\u7c7b\u578b\u8bba\u57fa\u7840\u51fa\u53d1\u7684 Theorem Proving in Lean \u8ba1\u7b97\u673a\u5bfc\u5411\uff1a
\u4fa7\u91cd\u5c06 Lean \u4f5c\u4e3a\u7f16\u7a0b\u8bed\u8a00\u7684 Functional Programming in Lean \u4fa7\u91cd\u5143\u7f16\u7a0b\u7b56\u7565\u7f16\u5199\u7684 Metaprogramming in Lean \u66f4\u5173\u6ce8 LEAN \u672c\u8eab\u800c\u4e0d\u4ec5\u662f\u4f7f\u7528\u7684 Reference manual \u8ba1\u7b97\u673a\u79d1\u5b66\u89d2\u5ea6\u7684 The Hitchhiker's Guide to Logical Verification \u5176\u4ed6\u63a8\u8350\uff1a
\u8f6f\u4ef6\u57fa\u7840\uff1aSoftware Foundations \u7f16\u7a0b\u8bed\u8a00\u57fa\u7840\uff1aAgda \u63cf\u8ff0 "},{"location":"install/","title":"LEAN 4 \u5b89\u88c5\u6559\u7a0b","text":"Lean \u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u5b9a\u7406\u8bc1\u660e\u52a9\u624b\u548c\u51fd\u6570\u5f0f\u7f16\u7a0b\u8bed\u8a00\uff0c\u7531\u5fae\u8f6f\u7814\u7a76\u9662\u5f00\u53d1\u3002\u5b83\u65e2\u53ef\u4ee5\u7528\u4e8e\u5f62\u5f0f\u5316\u6570\u5b66\u8bc1\u660e\uff0c\u4e5f\u53ef\u4ee5\u7528\u4e8e\u901a\u7528\u7a0b\u5e8f\u8bbe\u8ba1\u3002
"},{"location":"install/#lean-4_1","title":"Lean 4 \u5de5\u5177\u94fe","text":"Lean 4 \u7684\u5b8c\u6574\u5f00\u53d1\u73af\u5883\u7531\u4ee5\u4e0b\u6838\u5fc3\u7ec4\u4ef6\u6784\u6210\uff1a
elan\uff1aLean \u7684\u7248\u672c\u7ba1\u7406\u5de5\u5177\uff0c\u7528\u4e8e\u5b89\u88c5\u3001\u7ba1\u7406\u548c\u5207\u6362\u4e0d\u540c\u7248\u672c\u7684 Lean\uff0c\u7c7b\u4f3c\u4e8e Rust \u7684 rustup
\u6216 Node.js \u7684 nvm
\u3002 lake\uff08Lean Make\uff09\uff1aLean \u7684\u5305\u7ba1\u7406\u5668\u548c\u6784\u5efa\u5668\uff0c\u5df2\u96c6\u6210\u5230 Lean 4 \u6838\u5fc3\u4ed3\u5e93\u4e2d\u3002\u7528\u4e8e\u521b\u5efa Lean \u9879\u76ee\uff0c\u6784\u5efa Lean \u5305,\u7f16\u8bd1 Lean \u53ef\u6267\u884c\u6587\u4ef6\u7b49\u3002 lean\uff1a\u8bed\u8a00\u672c\u8eab\u7684\u6838\u5fc3\u7ec4\u4ef6\uff0c\u8d1f\u8d23\u5b9e\u9645\u7684\u4ee3\u7801\u7f16\u8bd1\u548c\u8bed\u8a00\u670d\u52a1\u5668\u534f\u8bae\uff08LSP\uff09\u652f\u6301\uff0c\u7528\u6237\u4e0d\u9700\u8981\u76f4\u63a5\u4e0e lean
\u4ea4\u4e92\u3002 \u6b64\u5916\uff0c\u8fd8\u6709 Lean \u7684\u6807\u51c6\u6570\u5b66\u5e93 Mathlib\uff0c\u5305\u542b\u5927\u91cf\u6570\u5b66\u5b9a\u4e49\u548c\u5b9a\u7406\uff0c\u4ee5\u53ca\u5b9e\u7528\u7684\u8bc1\u660e\u5de5\u5177\u548c\u7b56\u7565\u3002
\u4e3a\u4e86\u4f7f\u7528 Lean\uff0c\u9700\u8981\u5148\u5b89\u88c5 VS Code \u548c Git\uff0c\u7136\u540e\u5b89\u88c5 elan\u3002\u518d\u901a\u8fc7 elan \u5b89\u88c5\u5404\u4e2a Lean4 \u7248\u672c\u4ee5\u53ca lake \u5305\u7ba1\u7406\u5668\uff0c\u63a5\u4e0b\u6765\u5c31\u53ef\u4ee5\u4f7f\u7528 lake \u521b\u5efa\u81ea\u5df1\u7684 Lean \u9879\u76ee\u3002\u5de5\u5177\u94fe\u7684\u7528\u6cd5\u793a\u4f8b\u53c2\u89c1 Lean \u5de5\u5177\u94fe \u4e00\u8282\u6216 lake \u6587\u6863\u3002
\u5982\u679c\u5e0c\u671b\u5feb\u901f\u4e86\u89e3\u548c\u4f7f\u7528 Lean\uff0c\u9664\u4e86\u5728\u672c\u5730\u5b89\u88c5\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee live.lean-lang.org \u6216 live.leanprover.cn \u5728\u7ebf\u4f53\u9a8c\u3002
"},{"location":"install/#linux-elan","title":"Linux \u5b89\u88c5 elan","text":"\u5982\u679c\u6ca1\u6709\u7f51\u7edc\u95ee\u9898\uff0c\u7528\u4e00\u884c\u547d\u4ee4\u5b89\u88c5\uff1a
wget -q https://raw.githubusercontent.com/leanprover-community/mathlib4/master/scripts/install_debian.sh && bash install_debian.sh ; rm -f install_debian.sh && source ~/.profile\n
\u811a\u672c\u5185\u5bb9\u5305\u62ec\uff1a\u68c0\u67e5\u5e76\u5b89\u88c5 VsCode\uff0cLean \u63d2\u4ef6\uff0c\u5e76\u5b89\u88c5 elan\u3002
\u5982\u679c\u8bbf\u95ee GitHub \u5b58\u5728\u95ee\u9898\uff0c\u53ef\u4ee5\u5728\u5b89\u88c5 vscode \u540e\uff0c\u624b\u52a8\u5b89\u88c5 elan\u3002
\u5177\u4f53\u5730\uff0c\u5728 GitHub release \u9875\u9762\u6216\u8005 \u4e0a\u4ea4\u955c\u50cf\u6e90 \uff0c\u6839\u636e\u7cfb\u7edf\u7248\u672c\u4e0b\u8f7d elan\u3002
\u6bd4\u5982\u4e0b\u8f7d linux-x86_64
\u7cfb\u7edf\u7684 elan \u5de5\u5177\uff1a
# \u5982\u679c\u7f51\u7edc\u4e0d\u884c\u5c31\u672c\u5730\u4e0b\u8f7d\u518d\u4e0a\u4f20\ncurl -L https://github.com/leanprover/elan/releases/download/v3.1.1/elan-x86_64-unknown-linux-gnu.tar.gz -o elan.tar.gz\ntar xf elan.tar.gz\n
\u89e3\u538b\u5f97\u5230 elan-init
\u6587\u4ef6\uff0c\u8d4b\u4e88\u53ef\u6267\u884c\u6743\u9650\u5e76\u6267\u884c\u5b89\u88c5\uff1a
chmod +x elan-init\n./elan-init -y --default-toolchain none\n
\u9ed8\u8ba4\u5b89\u88c5\u6700\u65b0\u7248\u672c\u7684 Lean\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u53c2\u6570\u6307\u5b9a\u7248\u672c\uff0c\u6216\u7565\u8fc7\u5177\u4f53 Lean \u7248\u672c\u7684\u5b89\u88c5\u3002
\u5b8c\u6210\u540e\uff0c\u5728 .bashrc
\u6216 .zshrc
\u4e2d\u4fee\u6539\u73af\u5883\u53d8\u91cf\uff1a
export PATH=\"$HOME/.elan/bin:$PATH\"\n
\u91cd\u542f\u7ec8\u7aef\uff0c\u68c0\u67e5 elan
\u7248\u672c\u548c\u9ed8\u8ba4\u5b89\u88c5\u7684 Lean \u7248\u672c\uff1a
\u276f elan -V\nelan 3.1.1 (71ddc6633 2024-02-22)\n\u276f elan show\nstable (default)\nLean (version 4.7.0, x86_64-unknown-linux-gnu, commit 6fce8f7d5cd1, Release)\n
"},{"location":"install/#windows-elan","title":"Windows \u5b89\u88c5 elan","text":"\u5148\u5728\u8fd9\u91cc\u4e0b\u8f7d\u5b89\u88c5 VS Code \u548c Git\u3002
\u5b89\u88c5 VS Code \u540e\uff0c\u9700\u8981\u5b89\u88c5 lean4 \u6269\u5c55\uff08extension\uff09\u3002\u5982\u679c\u7f51\u7edc\u73af\u5883\u987a\u7545\uff0c\u53ef\u4ee5\u5728 lean4 \u6269\u5c55\u7684\u6b22\u8fce\u9875\u9009\u62e9 Get Start \u6765\u5b8c\u6210\u5b89\u88c5\uff0c\u6216\u8005\u521b\u5efa\u7a7a\u7684 Lean \u6587\u4ef6\u65f6\u6269\u5c55\u4f1a\u5f39\u51fa\u63d0\u793a\u63d0\u9192\u4f60\u5b89\u88c5 elan \u548c Lean 4\u3002 \u9664\u4e86\u8fd9\u79cd\u65b9\u5f0f\uff0c\u4e5f\u53ef\u4ee5\u5728 cmd \u6216 powershell \u4e2d\u8fd0\u884c\u547d\u4ee4
curl -O --location https://raw.githubusercontent.com/leanprover/elan/master/elan-init.ps1\npowershell -ExecutionPolicy Bypass -f elan-init.ps1\ndel elan-init.ps1\n
\u5982\u679c\u9047\u5230\u4e86 \"SSL connect error\", \"Timeout was reached\",\"Failed to connect to github.com port 443\"...
\u7b49\u9519\u8bef\uff0c\u5c31\u662f\u8bf4\u660e\u4f60\u7684\u7f51\u7edc\u73af\u5883\u4e0d\u7406\u60f3\u3002\u5982\u679c\u8fd9\u6837\u53ef\u4ee5\u901a\u8fc7\u4e0a\u4ea4\u955c\u50cf\u6e90\u4e0b\u8f7d\u5b89\u88c5\u3002\u4e0b\u9762\u6f14\u793a\u5728\u7f51\u7edc\u73af\u5883\u4e0d\u7406\u60f3\u7684\u6761\u4ef6\u4e0b\u7684\u5b89\u88c5\u3002
\u6253\u5f00 cmd \u6216 Powershell\uff0c\u8fd0\u884c
curl -O --location https://s3.jcloud.sjtu.edu.cn/899a892efef34b1b944a19981040f55b-oss01/elan/elan/releases/download/v4.0.0-rc1/elan-x86_64-pc-windows-msvc.zip\nunzip -o elan-x86_64-pc-windows-msvc.zip\n.\\elan-init.exe\n
\u4f1a\u5728\u7ec8\u7aef\u4e2d\u5f00\u59cb\u5b89\u88c5\u7a0b\u5e8f\u3002\u5355\u51fb\u56de\u8f66\u5728\u9ed8\u8ba4\u4f4d\u7f6e ~\\.elan
\u5b89\u88c5\u3002 \u5b89\u88c5\u5b8c\u6210\u540e\u53ef\u4ee5\u5220\u9664\u521a\u521a\u4e0b\u8f7d\u7684\u4e34\u65f6\u6587\u4ef6\uff1a
del elan-init.exe\ndel elan-x86_64-pc-windows-msvc.zip\n
\u6dfb\u52a0 elan \u7684\u5b89\u88c5\u5730\u5740\u5230 PATH \u73af\u5883\u53d8\u91cf\uff08\u5982\u679c\u662f\u9ed8\u8ba4\u5b89\u88c5\uff0c\u90a3\u4e48\u662f %USERPROFILE%\\.elan\\bin
\uff09\u3002
\u91cd\u542f\u7ec8\u7aef\u8f93\u5165 elan --version
\uff0c\u5982\u679c\u80fd\u6b63\u5e38\u8f93\u51fa\u7248\u672c\u53f7\uff0c\u90a3\u4e48\u4f60\u5df2\u7ecf\u88c5\u597d\u4e86 elan \u548c Lean 4 stable \u7248\u672c\u3002
"},{"location":"install/#mac-elan","title":"Mac \u5b89\u88c5 elan","text":"\u548c ubuntu \u7cfb\u7edf\u7c7b\u4f3c\uff0c\u7528\u811a\u672c\u4e00\u952e\u5b89\u88c5\uff1a
/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/leanprover-community/mathlib4/master/scripts/install_macos.sh)\" && source ~/.profile\n
\u6216\u8005\u5728 GitHub release \u9875\u9762 \u6216 \u4e0a\u4ea4\u955c\u50cf\u6e90 \u624b\u52a8\u4e0b\u8f7d\u8fd0\u884c\u5b89\u88c5\u7a0b\u5e8f\u3002
\u6b64\u5916\uff0c\u4e0d\u9f13\u52b1\u4f7f\u7528 homebrew \u5b89\u88c5 elan-init \u5305\uff0c\u8fd9\u53ef\u80fd\u4f1a\u843d\u540e\u4e8e\u5b98\u65b9\u7248\u672c\u7684\u66f4\u65b0\u3002
"},{"location":"contribute/project/","title":"\u9879\u76ee\u6559\u7a0b","text":"TODO
"},{"location":"contribute/translation/","title":"\u6587\u6863\u7ffb\u8bd1","text":"TODO
"},{"location":"projects/blueprints/","title":"Lean Bleu Print","text":"\u9879\u76ee\u5730\u5740\uff1ahttps://github.com/PatrickMassot/leanblueprint
"},{"location":"projects/jixia/","title":"jixia \u6570\u636e\u5206\u6790 | TODO","text":"jixia \u662f\u4e00\u4e2a\u4e3a Lean 4 \u8bbe\u8ba1\u7684\u65b0\u9759\u6001\u5206\u6790\u5de5\u5177\uff0c\u5176\u65e8\u5728\u652f\u6301\u6784\u5efa\u5177\u6709 Lean \u611f\u77e5\u80fd\u529b\u7684\u96c6\u6210\u5f00\u53d1\u73af\u5883\uff08IDE\uff09\uff0c\u5e76\u4e3a\u673a\u5668\u5b66\u4e60\u63d0\u53d6\u6709\u7528\u7684\u6570\u636e\u3002\u8be5\u9879\u76ee\u662f\u5317\u4eac\u5927\u5b66\u6570\u5b66\u79d1\u5b66\u5b66\u9662\uff08BICMR\uff09\u4eba\u5de5\u667a\u80fd\u4e0e\u6570\u5b66\u7a0b\u5e8f\u9879\u76ee\u7684\u4e00\u90e8\u5206\u3002\"jixia\" \u8fd9\u4e2a\u540d\u5b57\u6765\u6e90\u4e8e\u5386\u53f2\u4e0a\u7684\u201c\u7a37\u4e0b\u5b66\u5bab\u201d\uff0c\u4f4d\u4e8e\u73b0\u5728\u7684\u5c71\u4e1c\u6dc4\u535a\u3002
\u5de5\u5177\u7279\u70b9\uff1a
\u975e\u4fb5\u5165\u6027\uff1a\u65e0\u9700\u5bf9\u76ee\u6807\u6587\u4ef6\u8fdb\u884c\u4efb\u4f55\u4fee\u6539\uff0c\u8fd9\u6709\u5229\u4e8e\u63d0\u9ad8\u7f13\u5b58\u5229\u7528\u7387\uff0c\u7279\u522b\u662f\u5728 mathlib4 \u4e0a\u3002 \u5355\u6587\u4ef6\u5206\u6790\u3002 \u6e90\u7801\u7ea7\u4fe1\u606f\uff1a\u5305\u542b\u6bcf\u4e2a\u5b9a\u4e49\u51fd\u6570\u7684\u6e90\u7801\u8303\u56f4\u3001\u53c2\u6570\u548c\u8fd4\u56de\u7c7b\u578b\u7b49\u4fe1\u606f\u3002 \u6613\u4e8e\u6269\u5c55\uff1ajixia \u7684\u57fa\u4e8e\u63d2\u4ef6\u7684\u8bbe\u8ba1\u4f7f\u5f97\u6613\u4e8e\u6269\u5c55\uff0c\u540c\u65f6\u4fdd\u6301\u4e86\u4e0a\u8ff0\u6240\u6709\u4f18\u70b9\u3002 "},{"location":"projects/jixia/#_1","title":"\u4f7f\u7528\u65b9\u5f0f","text":"\u4e0b\u8f7d\u4ed3\u5e93\u5e76\u6784\u5efa\uff1a
git clone https://github.com/frenzymath/jixia\ncd jixia\nlake update && lake build\n
\u67e5\u770b\u5e2e\u52a9\uff1a
\u276f lake exe jixia --help \njixia\nA static analysis tool for Lean 4.\n\nUSAGE:\n jixia [FLAGS] <file>\n\nFLAGS:\n -h, --help Prints this message.\n -m, --import : String Import info\n -d, --declaration : String Declaration info\n -s, --symbol : String Symbol info\n -e, --elaboration : String Elaboration info\n -l, --line : String Line info\n -a, --ast : String AST\n -i, --initializer Execute initializers\n\nARGS:\n file : String File to process\n
jixia \u652f\u6301\u591a\u4e2a\u53c2\u6570\uff0c\u5305\u62ec\uff1a - Import
\uff1a\u5bfc\u5165\u6a21\u5757\u5217\u8868\u3002 - Declaration
\uff1a\u6bcf\u4e2a\u58f0\u660e\uff08def
\u3001theorem
\u3001inductive
\u7b49\uff09\u7684\u6e90\u7801\u7ea7\u4fe1\u606f\u3002 - Symbol
\uff1a\u7cbe\u7ec6\u5316\u540e\u7684\u7b26\u53f7\u4fe1\u606f\uff08\u6216 Lean 4 \u672f\u8bed\u4e2d\u7684 \u5e38\u6570\uff09\uff0c\u5305\u62ec\u5b83\u4eec\u7684\u7c7b\u578b\u548c\u5f15\u7528\u56fe\u3002 - Elaboration
\uff1a\u5173\u4e8e\u7cbe\u7ec6\u5316\u8fc7\u7a0b\u7684\u4fe1\u606f\uff0c\u5305\u62ec\u7b56\u7565\u4fe1\u606f\u3002 - Line
\uff1a\u6bcf\u884c\u5f00\u59cb\u65f6\u7684\u8bc1\u660e\u72b6\u6001\uff0c\u5982\u5728 VSCode \u7684 infoview \u4e2d\u663e\u793a\u3002 - AST
\uff1a\u89e3\u6790\u547d\u4ee4\u7684\u5b8c\u6574\u8f6c\u50a8\u3002
"},{"location":"projects/jixia/#_2","title":"\u4f7f\u7528\u793a\u4f8b","text":"\u65b0\u5efa Lean \u6587\u4ef6\uff0c\u6bd4\u5982 test.lean
import Init\n\nexample : \u2200 (p q: Prop), p \u2228 q \u2192 q \u2228 p := by\n intro p q h\n -- Here are some comments\n cases h\n . apply Or.inr\n assumption\n . apply Or.inl\n assumption\n
\u8fd0\u884c\u547d\u4ee4\uff1a
lake exe jixia -d test.decl.json -s test.sym.json -e test.elab.json -l test.lines.json test.lean\n
"},{"location":"projects/jixia/#_3","title":"\u53c2\u6570\u4ecb\u7ecd","text":"TODO\u3002
"},{"location":"projects/lean4game/","title":"Lean4Game \u6559\u7a0b","text":""},{"location":"projects/lean4game/#_1","title":"\u5f15\u8a00","text":"\u672c\u7bc7\u4ecb\u7ecd\u5982\u4f55\u7528 Lean4Game \u6dfb\u52a0 Lean4 \u6e38\u620f\u3002\u8fd9\u7c7b\u4e92\u52a8\u6e38\u620f\u4e0d\u4ec5\u5229\u4e8e Lean \u672c\u8eab\u7684\u5b66\u4e60\uff0c\u8fd8\u80fd\u4fc3\u8fdb\u5bf9\u5b66\u79d1\u77e5\u8bc6\u7684\u7406\u89e3\uff0c\u8ba9\u5173\u8054\u7684\u5b66\u79d1\u7fa4\u4f53\u5bf9 Lean \u6709\u66f4\u76f4\u89c2\u7684\u8ba4\u8bc6\u3002
\u5f53\u524d\u90e8\u7f72\u4e86 NNG4 \u6e38\u620f\uff1anng4.leanprover.cn \uff0c\u53ef\u5728\u7ebf\u4f53\u9a8c\uff0c\u540e\u7eed\u8ba1\u5212\u5199\u4e00\u4e2a\u674e\u4ee3\u6570\u5165\u95e8\u7684\uff08mark \u5f00\u5751\uff09\u3002
"},{"location":"projects/lean4game/#_2","title":"\u76f8\u5173\u9879\u76ee\u4e0e\u8d44\u6e90","text":"\u6559\u7a0b\u6d89\u53ca\u7684\u9879\u76ee\u548c\u8d44\u6e90\u94fe\u63a5\uff1a
lean4game\uff1aLEAN \u793e\u533a\u9a71\u52a8\u7684\u9879\u76ee\uff0c\u7528\u4e8e\u5f00\u53d1 Lean4 \u6e38\u620f\uff08GitHub \u4ed3\u5e93\uff09\u3002 GameSkeleton\uff1aLean4 \u6e38\u620f\u7684\u6a21\u677f\u4ee3\u7801\uff08GitHub \u4ed3\u5e93\uff09\u3002 NNG4\uff1a\u81ea\u7136\u6570\u6e38\u620f\uff0c\u4ece\u76ae\u4e9a\u8bfa\u516c\u7406\u5f00\u59cb\uff0c\u6784\u5efa\u81ea\u7136\u6570\u7684\u57fa\u672c\u8fd0\u7b97\u548c\u6027\u8d28\uff08GitHub \u4ed3\u5e93\uff09\u3002 \u793e\u533a\u5b98\u7f51\u76ee\u524d\u63d0\u4f9b\u4e86\u81ea\u7136\u6570\u548c\u96c6\u5408\u8bba\u7b49\u6e38\u620f\uff0c\u4e5f\u6b22\u8fce\u6839\u636e\u81ea\u5df1\u7684\u5b66\u79d1\u77e5\u8bc6\uff0c\u8d21\u732e\u66f4\u591a\u7684\u6e38\u620f~
"},{"location":"projects/lean4game/#_3","title":"\u53d1\u5e03\u6e38\u620f","text":"\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u7b80\u5355\u7684\u793a\u4f8b\u4ecb\u7ecd\u6e38\u620f\u7684\u53d1\u5e03\u8fc7\u7a0b\u3002
"},{"location":"projects/lean4game/#_4","title":"\u4e0b\u8f7d\u6e38\u620f\u6a21\u677f","text":"\u9996\u5148\uff0c\u4e0b\u8f7d GameSkeleton \u6a21\u677f\u4ed3\u5e93\uff0c\u8fd9\u4e2a\u662f\u7f51\u9875\u4e0a\u6700\u7ec8\u5c55\u793a\u7684\u5185\u5bb9\uff1a
git clone https://github.com/hhu-adam/GameSkeleton.git\n
\u6587\u4ef6\u7ed3\u6784\u5982\u4e0b\uff1a
\u251c\u2500\u2500 Game\n\u2502 \u251c\u2500\u2500 Levels\n\u2502 \u2502 \u251c\u2500\u2500 DemoWorld\n\u2502 \u2502 \u2502 \u2514\u2500\u2500 L01_HelloWorld.lean\n\u2502 \u2502 \u2514\u2500\u2500 DemoWorld.lean\n\u2502 \u2514\u2500\u2500 Metadata.lean\n\u251c\u2500\u2500 Game.lean\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 lake-manifest.json\n\u251c\u2500\u2500 lakefile.lean\n\u2514\u2500\u2500 lean-toolchain\n
\u8fd9\u662f\u4e00\u4e2a\u6807\u51c6\u7684 Lean \u5305\u7ed3\u6784\uff0c\u5176\u4e2d lean-toolchain
\u3001lakefile.lean
\u548c lake-manifest.json
\u662f Lean \u5305\u7684\u57fa\u672c\u6587\u4ef6\u3002Game
\u6587\u4ef6\u5939\u5305\u542b\u6e38\u620f\u5185\u5bb9\uff0c\u800c Game.lean
\u662f\u6e38\u620f\u7684\u5165\u53e3\u6587\u4ef6\u3002
\u66f4\u65b0\u4f9d\u8d56\u5e76\u6784\u5efa\u9879\u76ee\uff1a
lake update -R\nlake build\n
\u7c7b\u4f3c\u5730\uff0c\u4e5f\u53ef\u4ee5\u4e0b\u8f7d\u5176\u4ed6\u6e38\u620f\u6a21\u677f\uff0c\u4f8b\u5982 NNG4\uff1a
# cd .. # \u56de\u5230\u540c\u4e00\u7ea7\u76ee\u5f55\ngit clone https://github.com/leanprover-community/NNG4.git\ncd NNG4\nlake update -R\nlake build\n
"},{"location":"projects/lean4game/#lean4game","title":"\u4e0b\u8f7d Lean4Game","text":"Lean4Game \u662f\u6e38\u620f\u7684\u524d\u540e\u7aef\u6846\u67b6\uff0c\u7528\u4e8e\u521b\u5efa\u6e38\u620f\u7684\u4e3b\u9875\u9762\u3002
\u9996\u5148\uff0c\u5b89\u88c5 Node.js \u548c npm
# \u5b89\u88c5 nvm\ncurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash\n# \u5b89\u88c5 nodejs\nnvm install node\nnvm use node\n
\u4e0b\u8f7d Lean4Game\uff0c\u5e76\u5c06\u5176\u653e\u5728\u6e38\u620f\u7684**\u540c\u7ea7\u76ee\u5f55**\uff1a
# \u4e0b\u8f7d Lean4Game\ngit clone https://github.com/leanprover-community/lean4game.git\ncd lean4game\n# \u5b89\u88c5\u4f9d\u8d56\nnpm install --force\n
\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\uff08\u53ef\u9009\uff09\uff1a
export PORT=8080\nexport CLIENT_PORT=3000\nexport VITE_CLIENT_DEFAULT_LANGUAGE=zh\n
\u5176\u4e2d PORT
\u4e3a\u8fd0\u884c Lean \u4ee3\u7801\u7684\u540e\u7aef\u7aef\u53e3\uff0c\u9ed8\u8ba4\u662f 8080
\uff1bCLIENT_PORT
\u4e3a\u524d\u7aef\u8bbf\u95ee\u7aef\u53e3\uff0c\u9ed8\u8ba4\u662f 3000
\uff1bVITE_CLIENT_DEFAULT_LANGUAGE
\u4e3a\u754c\u9762\u8bed\u8a00\uff0c\u9ed8\u8ba4\u4e3a en
\u3002
\u6267\u884c npm start
\u542f\u52a8\u6e38\u620f\uff0c\u5982\u679c\u770b\u5230\u4ee5\u4e0b\u9875\u9762\uff0c\u5c31\u8868\u793a\u8bbf\u95ee\u6210\u529f\uff1a
\u6b64\u5916\uff0c\u53ef\u4ee5\u5728\u53f3\u4e0a\u89d2\u7684\u504f\u597d\u8bbe\u7f6e\u5207\u6362\u8bed\u8a00\uff1a
"},{"location":"projects/lean4game/#nginx","title":"Nginx \u914d\u7f6e","text":"\u5982\u679c\u4e00\u5207\u987a\u5229\uff0c\u8bbf\u95ee http://localhost:3000/#/g/local/GameSkeleton
\u4f1a\u770b\u5230 \u201cHello World\u201d \u7684\u754c\u9762\uff1a
\u5047\u8bbe\u670d\u52a1\u542f\u52a8\u5728 3000 \u7aef\u53e3\uff0c\u53ef\u4ee5\u5c06\u57df\u540d game.leanprover.cn
\u914d\u7f6e\u4e3a\u6e38\u620f\u4e3b\u9875\u9762\uff0c\u53c2\u8003\u914d\u7f6e\u5982\u4e0b\uff1a
server {\n listen 443 ssl;\n ssl_certificate /etc/letsencrypt/live/game.leanprover.cn/fullchain.pem; \n ssl_certificate_key /etc/letsencrypt/live/game.leanprover.cn/privkey.pem; \n server_name game.leanprover.cn;\n location / {\n proxy_pass http://localhost:3000;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"Upgrade\";\n proxy_set_header Host $host;\n proxy_read_timeout 86400;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_ssl_server_name on;\n proxy_http_version 1.1;\n chunked_transfer_encoding off;\n proxy_buffering off;\n proxy_cache off;\n proxy_set_header X-Forwarded-Proto $scheme;\n client_max_body_size 0;\n }\n}\n
\u4e3a\u7b80\u5316\u8f93\u5165\uff0c\u53ef\u4ee5\u4e3a\u6e38\u620f\u5355\u72ec\u914d\u7f6e\u4e00\u4e2a\u5b50\u57df\u540d\u8fdb\u884c\u8df3\u8f6c\uff0c\u4f8b\u5982 nng4.leanprover.cn
\uff1a
server {\n listen 443 ssl; \n ssl_certificate /etc/letsencrypt/live/nng4.leanprover.cn/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/nng4.leanprover.cn/privkey.pem;\n server_name nng4.leanprover.cn;\n return 301 https://game.leanprover.cn/#/g/local/NNG4;\n}\n
\u8fd9\u6837\u53ea\u9700\u8bbf\u95ee nng4.leanprover.cn\uff0c\u800c\u4e0d\u9700\u8981\u8f93\u5165\u540e\u9762\u7684\u4e00\u957f\u4e32 URI\u3002
"},{"location":"projects/lean4game/#_5","title":"\u6e38\u620f\u4fee\u6539\u6307\u5357","text":"\u672c\u8282\u4ee5 NNG4 \u4e3a\u4f8b\uff0c\u4ecb\u7ecd\u6e38\u620f\u6587\u4ef6\u7ed3\u6784\u548c\u5982\u4f55\u6dfb\u52a0\u6e38\u620f\u5185\u5bb9\u3002
"},{"location":"projects/lean4game/#gamelean","title":"\u6e38\u620f\u5165\u53e3 Game.lean
","text":"\u6587\u4ef6 Game.lean
\u662f\u6574\u4e2a\u6e38\u620f\u7684\u4e3b\u5e72\uff0c\u8d1f\u8d23\u6574\u5408\u6240\u6709\u5185\u5bb9\u3002\u4ee5\u4e0b\u662f\u793a\u4f8b\u4ee3\u7801\uff1a
import GameServer.Commands\n\n-- \u5bfc\u5165\u6240\u6709\u4e16\u754c\nimport Game.Levels.Tutorial\n\nTitle \"My Game\"\n\nIntroduction \"\nHi, nice you're here! Click on a world to start.\n\"\n\nInfo \"\nThis game has been developed by me.\n\"\n\n-- Dependency World\u2081 \u2192 World\u2082 -- \u7531\u4e8e\u4f7f\u7528\u4e86 `\u2260`\nMakeGame\n
\u4ee3\u7801\u89e3\u6790\uff1a
import
\uff1a\u5bfc\u5165\u6e38\u620f\u670d\u52a1\u5668\u547d\u4ee4\u3002\u5176\u4e2d GameServer
\u662f\u4ece lean4game \u5f15\u5165\u7684\uff0c\u4e0d\u662f\u6765\u81ea\u5f53\u524d\u7684\u6a21\u677f\u4ed3\u5e93\u3002 Title \"My Game\"
\uff1a\u8bbe\u7f6e\u6e38\u620f\u7684\u6807\u9898\u3002 Introduction
\uff1a\u5728\u4e16\u754c\u9009\u62e9\u754c\u9762\u65c1\u663e\u793a\u7684\u4ecb\u7ecd\u6587\u672c\u3002 Info
\uff1a\u5728\u6e38\u620f\u83dc\u5355\u4e2d\u663e\u793a\u7684\u4fe1\u606f\uff0c\u4ecb\u7ecd\u6e38\u620f\u7684\u80cc\u666f\u548c\u5f00\u53d1\u8005\u4fe1\u606f\u7b49\u3002 Dependency
\uff1a\u4e00\u4e2a\u53ef\u9009\u547d\u4ee4\uff0c\u7528\u4e8e\u8bbe\u7f6e\u4e16\u754c\u4e4b\u95f4\u7684\u4f9d\u8d56\u5173\u7cfb\u3002\u4f8b\u5982\uff0c\u82e5\u4e00\u4e2a\u4e16\u754c\u4ecb\u7ecd\u4e86 \u2260
\u7b26\u53f7\uff0c\u800c\u5728\u53e6\u4e00\u4e2a\u4e16\u754c\u4e2d\u7528\u6237\u9700\u8981\u5df2\u77e5\u6b64\u7b26\u53f7\uff0c\u5219\u53ef\u4f7f\u7528\u6b64\u547d\u4ee4\u3002 MakeGame
\uff1a\u6784\u5efa\u6e38\u620f\u7684\u547d\u4ee4\u3002\u5982\u679c\u5b58\u5728\u9700\u8981\u4fee\u590d\u7684\u95ee\u9898\uff0c\u5c06\u4ee5\u8b66\u544a\u6216\u9519\u8bef\u7684\u5f62\u5f0f\u663e\u793a\uff08\u5728 VSCode \u4e2d\u4e3a\u6a59\u8272/\u7ea2\u8272\u6ce2\u6d6a\u7ebf\uff09\u3002 \u53ef\u5bf9\u7167\u4e0b\u56fe\uff1a
"},{"location":"projects/lean4game/#_6","title":"\u521b\u5efa\u5173\u5361","text":"\u4e0b\u9762\u662f\u4e00\u4e2a\u6700\u7b80\u5173\u5361\u6587\u4ef6\u793a\u4f8b\uff1a
import GameServer.Commands\n\nWorld \"MyWorld\"\nLevel 1\nTitle \"Hello World\"\n\nIntroduction \"\nA message shown at the beginning of the level. Use it to explain any new concepts.\n\"\n\n/-- The exercise statement in natural language using latex: $\\iff$. -/\nStatement (n : Nat) : 0 + n = n := by\n sorry\n\nConclusion \"\nThe message shown when the level is completed\n\"\n
\u64cd\u4f5c\u6b65\u9aa4\uff1a 1. \u521b\u5efa\u6587\u4ef6\u5939 Game/Levels/MyWorld
2. \u521b\u5efa\u6587\u4ef6 Game/Levels/MyWorld/L01_hello.lean
3. \u5c06\u4e0a\u8ff0\u4ee3\u7801\u590d\u5236\u5230\u4f60\u7684\u7b2c\u4e00\u4e2a\u5173\u5361\u6587\u4ef6\u4e2d\u3002
"},{"location":"projects/lean4game/#_7","title":"\u521b\u5efa\u4e16\u754c","text":"\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u4e16\u754c\u3002\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a MyWorld.lean
\u7684\u6587\u4ef6\uff0c\u5e76\u5c06\u6240\u6709\u5173\u5361\u6587\u4ef6\u5bfc\u5165\u5230\u8be5\u4e16\u754c\u4e2d\uff1a
import Game.Levels.MyWorld.L01_hello\n\nWorld \"MyWorld\"\nTitle \"My First World\"\n\nIntroduction \"\nThis introduction text is shown when one first enters a world.\n\"\n
\u64cd\u4f5c\u6b65\u9aa4\uff1a 1. \u521b\u5efa\u6587\u4ef6 Game/Levels/MyWorld.lean
2. \u4f7f\u7528\u4e0a\u9762\u7684\u6a21\u677f\uff0c\u786e\u4fdd\u5bfc\u5165\u4e86\u8be5\u4e16\u754c\u7684\u6240\u6709\u5173\u5361\u3002 3. \u5728 Game.lean
\u4e2d\u5bfc\u5165\u8be5\u4e16\u754c\uff1aimport Game.Levels.MyWorld
\u81f3\u6b64\uff0c\u6211\u4eec\u5df2\u6210\u529f\u521b\u5efa\u4e00\u4e2a\u5305\u542b\u4e00\u4e2a\u5173\u5361\u7684\u4e16\u754c\u5e76\u5c06\u5176\u52a0\u5165\u5230\u6e38\u620f\u4e2d \ud83c\udf89\u3002
Game.lean
\u4e2d\u7684 MakeGame
\u547d\u4ee4\u4f1a\u6307\u51fa\u9700\u8981\u4fee\u590d\u7684\u4efb\u4f55\u95ee\u9898\u3002\u4f8b\u5982\uff0c\u5982\u679c\u663e\u793a\uff1a
\u8fd9\u610f\u5473\u7740\u4e16\u754c MyWorld
\u4f7f\u7528\u4e86 sorry
\u7b56\u7565\uff0c\u4f46\u6b64\u7b56\u7565\u5c1a\u672a\u5728\u4efb\u4f55\u5730\u65b9\u88ab\u5f15\u5165\u3002
\u6bcf\u6b21\u6dfb\u52a0\u6216\u4fee\u6539\u6e38\u620f\u5185\u5bb9\u540e\uff0c\u90fd\u9700\u8981\u91cd\u65b0\u6784\u5efa\u66f4\u65b0\uff1a
# cd NNG4 # \u8fdb\u5165\u6e38\u620f\u76ee\u5f55\nlake build\n
"},{"location":"projects/lean4game/#_8","title":"\u9ad8\u7ea7\u4ea4\u4e92\u7279\u6027","text":"\u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u7c97\u7565\u4ecb\u7ecd\u6e38\u620f\u4e2d\u7684\u9ad8\u7ea7\u4ea4\u4e92\u529f\u80fd\u3002\u8fd9\u90e8\u5206\u529f\u80fd\u5341\u5206\u4e30\u5bcc\uff0c\u76ee\u524d\u53ea\u8fdb\u884c\u521d\u6b65\u8bf4\u660e\u3002\u540e\u7eed\u6dfb\u52a0\u5c0f\u6e38\u620f\u7684\u8fc7\u7a0b\uff0c\u518d\u8fdb\u4e00\u6b65\u62d3\u5c55\u548c\u8865\u5145\u3002
"},{"location":"projects/lean4game/#_9","title":"\u5b9a\u7406\u548c\u7b56\u7565\u7684\u7ba1\u7406","text":"\u73a9\u5bb6\u5728\u6e38\u620f\u4e2d\u62e5\u6709\u4e00\u4e2a\u9010\u6b65\u89e3\u9501\u7684\u5b9a\u7406\u548c\u7b56\u7565\u6e05\u5355\u3002\u5728\u5173\u5361\u8bbe\u8ba1\u4e2d\uff0c\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u5728 Statement
\u4e0b\u65b9\u89e3\u9501\u6216\u5f15\u5165\u65b0\u7684\u5b9a\u7406\u548c\u7b56\u7565\uff1a
NewTactic induction simp -- \u89e3\u9501 `induction` \u548c `simp`\nNewTheorem Nat.zero_mul\nNewDefinition Pow\n
\u91cd\u8981\u63d0\u793a\uff1a\u6240\u6709\u547d\u4ee4\u4e2d\u7684\u540d\u79f0\u90fd\u9700\u8981\u4f7f\u7528**\u5168\u9650\u5b9a\u540d**\u3002\u4f8b\u5982\uff0c\u5e94\u4f7f\u7528 NewTheorem Nat.zero_mul
\u800c\u975e NewTheorem zero_mul
\u3002
"},{"location":"projects/lean4game/#_10","title":"\u6587\u6863\u6761\u76ee","text":"\u5982\u679c\u53d1\u73b0\u5b9a\u7406\u6587\u6863\u7f3a\u5931\uff0c\u7cfb\u7edf\u4f1a\u663e\u793a\u8b66\u544a\u3002\u53ef\u4ee5\u901a\u8fc7\u6dfb\u52a0\u6587\u6863\u6761\u76ee\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898\uff1a
/--\nsome description\n-/\nTheoremDoc Nat.zero_mul as \"zero_mul\" in \"Mul\"\n\n/--\nsome description\n-/\nTacticDoc simp\n\n/--\nsome description\n-/\nDefinitionDoc Pow as \"^\"\n
\u521b\u5efa\u4e00\u4e2a\u6587\u4ef6 Game/Doc/MyTheorems.lean
\uff0c\u5728\u5176\u4e2d\u6dfb\u52a0\u6587\u6863\u5e76\u5c06\u5176\u5bfc\u5165\u9879\u76ee\u4e2d\u3002
\u5982\u679c\u672a\u63d0\u4f9b\u4efb\u4f55\u6587\u6863\u5185\u5bb9\uff0c\u6e38\u620f\u5c06\u5c1d\u8bd5\u5bfb\u627e\u5e76\u5c55\u793a\u8be5\u6761\u76ee\u7684\u6587\u6863\u5b57\u7b26\u4e32\u3002
"},{"location":"projects/lean4game/#_11","title":"\u6e05\u5355\u7ba1\u7406","text":"\u73a9\u5bb6\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u547d\u4ee4\u5728\u5173\u5361\u4e2d\u7981\u7528\u6216\u53ea\u542f\u7528\u7279\u5b9a\u7684\u5df2\u89e3\u9501\u6761\u76ee\uff1a
DisabledTactic, DisabledTheorem, OnlyTactic, OnlyTheorem\n
\u8fd9\u4e9b\u547d\u4ee4\u7684\u8bed\u6cd5\u4e0e\u524d\u8fb9\u76f8\u540c\u3002\u524d\u4e24\u4e2a\u547d\u4ee4\u7528\u4e8e\u7981\u7528\u8be5\u5173\u5361\u7684\u7279\u5b9a\u6761\u76ee\uff0c\u540e\u4e24\u4e2a\u547d\u4ee4\u7528\u4e8e\u53ea\u542f\u7528\u6307\u5b9a\u7684\u6761\u76ee\u3002
"},{"location":"projects/lean4game/#_12","title":"\u5b9a\u7406\u6807\u7b7e","text":"\u901a\u8fc7 TheoremTab \"Mul\"
\u547d\u4ee4\u4e3a\u5b9a\u7406\u5206\u7ec4\uff0c\u5e76\u6307\u5b9a\u5728\u5173\u5361\u4e2d\u9ed8\u8ba4\u6253\u5f00\u7684\u6807\u7b7e\u3002
"},{"location":"projects/lean4game/#_13","title":"\u9690\u85cf\u7b56\u7565","text":"\u4f7f\u7528 NewHiddenTactic
\u547d\u4ee4\u53ef\u4ee5\u6dfb\u52a0\u5141\u8bb8\u7b56\u7565\u800c\u4e0d\u5728\u73a9\u5bb6\u6e05\u5355\u4e2d\u663e\u793a\u3002\u4f8b\u5982\uff1a
NewTactic rw\nNewHiddenTactic rewrite nth_rewrite rwa\n
\u5728\u6b64\u4f8b\u4e2d\uff0c\u53ea\u6709 rw
\u4f1a\u5728\u6e05\u5355\u4e2d\u663e\u793a\u3002
"},{"location":"projects/lean4game/#_14","title":"\u5173\u5361\u8bbe\u8ba1","text":"\u901a\u8fc7\u4e00\u4e2a\u793a\u4f8b\u6765\u67e5\u770b\u5173\u5361\u7684\u4ee3\u7801\uff1a
/-- \u6211\u4eec\u5b9a\u4e49\u4e00\u4e2a\u4ece \u2115 \u5230 \u2115 \u7684\u51fd\u6570\u3002 -/\nStatement\n : \u2115 \u2192 \u2115 := by\n Hint \"\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u76ee\u6807\uff0c\n \u4f60\u9700\u8981\u6784\u60f3\u4e00\u4e2a\u4ece `\u2115`\n \u5230 `\u2115` \u7684\u51fd\u6570\u3002\u5f00\u59cb\u4f7f\u7528\n\n `intro n`\"\n intro n\n Hint \"\u6211\u4eec\u7684\u4efb\u52a1\u73b0\u5728\u662f\u6784\u9020\u4e00\u4e2a\u81ea\u7136\u6570\uff0c\u8fd9\u4e2a\u6570\u53ef\u4ee5\u4f9d\u8d56\u4e8e ${n}\u3002\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 `exact` \u5e76\u5199\u51fa\u6211\u4eec\u60f3\u8981\u5b9a\u4e49\u7684\u51fd\u6570\u7684\u516c\u5f0f\u3002\u4f8b\u5982\n \u6211\u4eec\u5728\u6587\u4ef6\u9876\u90e8\u5bfc\u5165\u4e86\u52a0\u6cd5\u548c\u4e58\u6cd5\uff0c\n \u6240\u4ee5\n\n `exact 3 * {n} + 2`\n\n \u5c06\u5b8c\u6210\u76ee\u6807\uff0c\u6700\u7ec8\u5b9a\u4e49\u51fd\u6570 $f({n})=3{n}+2$.\"\n exact 3 * n + 2\n
Statement
\u7528\u4e8e\u5b9a\u4e49\u7ec3\u4e60\uff0c\u5176\u7528\u6cd5\u7c7b\u4f3c\u4e8e example
\u6216 theorem
\uff0c\u4f46\u5fc5\u987b\u4f7f\u7528\u7b56\u7565\u8bc1\u660e\uff0c\u5373 := by
\u662f\u56fa\u5b9a\u7684\u8bed\u6cd5\u90e8\u5206\u3002
Statement
\u53ef\u4ee5\u63a5\u7ec3\u4e60\u7684\u547d\u540d\uff0c\u6bd4\u5982\uff1aStatement my_first_exercise (n : Nat) \u2026
\u3002\u547d\u540d\u540e\u5b83\u4f1a\u88ab\u6dfb\u52a0\u5230\u6e05\u5355\u4e2d\uff0c\u5e76\u5728\u540e\u7eed\u5173\u5361\u4e2d\u53ef\u7528\u3002
\u6b64\u5916\uff0cStatement
\u524d\u7684\u6ce8\u91ca\u5c06\u4f5c\u4e3a\u7ec3\u4e60\u7684\u63cf\u8ff0\u663e\u793a\u5728\u6e38\u620f\u4e2d\uff0c\u4e14\u652f\u6301 Latex\u3002
"},{"location":"projects/lean4game/#_15","title":"\u8bc1\u660e","text":"\u8bc1\u660e\u5fc5\u987b\u662f\u7b56\u7565\u8bc1\u660e\uff0c\u5373 := by
\u662f\u56fa\u5b9a\u7684\u8bed\u6cd5\u90e8\u5206\u3002
\u4ee5\u4e0b\u662f\u4e00\u4e9b\u6709\u52a9\u4e8e\u7ed3\u6784\u5316\u8bc1\u660e\u7684\u7b56\u7565\uff1a
Hint
\uff1a\u53ef\u4ee5\u4f7f\u7528 Hint \"text\"
\u5728\u6e38\u620f\u7684\u76ee\u6807\u72b6\u6001\u5339\u914d\u65f6\u663e\u793a\u6587\u672c\u3002\u66f4\u591a\u5173\u4e8e\u63d0\u793a\u7684\u9009\u9879\uff0c\u8bf7\u53c2\u89c1\u76f8\u5173\u6587\u6863\u3002 Branch
\uff1a\u53ef\u4ee5\u5728\u8bc1\u660e\u4e2d\u6dfb\u52a0 Branch
\uff0c\u6267\u884c\u66ff\u4ee3\u7b56\u7565\u5e8f\u5217\uff0c\u5e2e\u52a9\u5728\u4e0d\u540c\u4f4d\u7f6e\u8bbe\u7f6e Hint
\u3002Branch
\u4e0d\u4f1a\u5f71\u54cd\u4e3b\u8bc1\u660e\u4e14\u4e0d\u9700\u5b8c\u6210\u4efb\u4f55\u76ee\u6807\u3002 Template
/Hole
\uff1a\u7528\u4e8e\u63d0\u4f9b\u793a\u4f8b\u8bc1\u660e\u6a21\u677f\u3002Template
\u4e2d\u7684\u5185\u5bb9\u5c06\u88ab\u590d\u5236\u5230\u7f16\u8f91\u5668\u4e2d\uff0c\u6240\u6709 Hole
\u5c06\u88ab\u66ff\u6362\u4e3a sorry
\u3002\u6ce8\u610f\uff0c\u62e5\u6709 Template
\u5c06\u5f3a\u5236\u7528\u6237\u5728\u8be5\u5173\u5361\u4f7f\u7528\u7f16\u8f91\u5668\u6a21\u5f0f\u3002 "},{"location":"projects/lean4game/#_16","title":"\u63d0\u793a","text":"\u63d0\u793a\u662f\u6e38\u620f\u5f00\u53d1\u4e2d\u53ef\u80fd\u662f\u6700\u91cd\u8981\u7684\u90e8\u5206\u3002\u63d0\u793a\u5c06\u5728\u73a9\u5bb6\u7684\u5f53\u524d\u76ee\u6807\u4e0e\u793a\u4f8b\u8bc1\u660e\u4e2d\u7684\u76ee\u6807\u5339\u914d\u65f6\u663e\u793a\u3002\u53ef\u4ee5\u4f7f\u7528 Branch
\u5728\u6b7b\u80e1\u540c\u6216\u66ff\u4ee3\u8bc1\u660e\u8def\u5f84\u4e2d\u8bbe\u7f6e\u63d0\u793a\u3002
"},{"location":"projects/lean4game/#_17","title":"\u6dfb\u52a0\u56fe\u7247","text":"\u53ef\u4ee5\u5728\u6e38\u620f\u7684\u4efb\u4f55\u5c42\u7ea7\uff08\u6e38\u620f/\u4e16\u754c/\u5173\u5361\uff09\u6dfb\u52a0\u56fe\u7247\uff0c\u8fd9\u4e9b\u56fe\u50cf\u5c06\u663e\u793a\u5728\u6e38\u620f\u4e2d\u3002
\u6587\u4ef6\u9700\u653e\u7f6e\u5728 images/
\u4e2d\uff0c\u5e76\u901a\u8fc7\u5728\u521b\u5efa\u7684\u6587\u4ef6\u4e2d\u6dfb\u52a0\u5982 Image \"images/path/to/myWorldImage.png\"
\u7684\u547d\u4ee4\u6765\u5f15\u7528\u3002
"},{"location":"projects/lean4game/#_18","title":"\u6ce8\u610f\u4e8b\u9879","text":"\u8bbe\u8ba1\u65b0\u6e38\u620f\u65f6\u5e94\u8003\u8651\u7684\u5176\u4ed6\u4e8b\u9879\uff1a
\u5728\u5b57\u7b26\u4e32\u5185\u90e8\u9700\u8981\u8f6c\u4e49\u53cd\u659c\u6760\uff0c\u4f46\u5728\u6587\u6863\u6ce8\u91ca\u7684\u5b57\u7b26\u4e32\u5185\u90e8\u5219\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u4f60\u4f1a\u5199 Introduction \"some latex here: $\\\\iff$.\"
\u4f46 /-- some latex here: $\\iff$. -/ Statement ...
\u62e5\u6709\u8d85\u8fc7 16 \u4e2a\u5173\u5361\u7684\u4e16\u754c\u5c06\u4ee5\u87ba\u65cb\u5f62\u5411\u5916\u663e\u793a\uff0c\u6700\u597d\u4fdd\u6301\u5728\u8fd9\u4e2a\u8303\u56f4\u4ee5\u4e0b\u3002\u8d85\u8fc7 22 \u4e2a\u5173\u5361\u65f6\uff0c\u87ba\u65cb\u5f62\u5f00\u59cb\u53d8\u5f97\u96be\u4ee5\u63a7\u5236\u3002 "},{"location":"projects/lean4game/#_19","title":"\u6e38\u620f\u7ffb\u8bd1","text":"\u901a\u8fc7\u4f7f\u7528 lean-i18n \u548c i18next\uff0c\u53ef\u4ee5\u4e3a\u6e38\u620f\u6dfb\u52a0\u591a\u8bed\u8a00\u652f\u6301\u3002TODO Ref\uff1a https://github.com/leanprover-community/lean4game/blob/main/doc/translate.md
\u4ee5\u4e0a\uff0c\u4e00\u4e9b\u5185\u5bb9\u7ec6\u8282\u5f85\u8865\u5145\u5b8c\u5584\uff0c\u6b22\u8fce\u4ea4\u6d41~
"},{"location":"projects/lean4web/","title":"Lean4web \u5728\u7ebf\u7f16\u8f91\u5668","text":"Lean4web \u662f Lean 4 \u7684\u4e00\u4e2a\u7f51\u9875\u7248\u5de5\u5177\uff0c\u5141\u8bb8\u7528\u6237\u5728\u6d4f\u89c8\u5668\u4e2d\u7f16\u5199\u548c\u6267\u884c Lean \u4ee3\u7801\u3002
\u5b98\u65b9\u7684 Lean playground \u6258\u7ba1\u5728 live.lean-lang.org\uff0c\u4f46\u4ec5\u652f\u6301\u6700\u65b0\u5206\u652f\u548c\u6700\u65b0\u53d1\u884c\u7248\u3002\u7531\u4e8e Mathlib \u4e0d\u5411\u540e\u517c\u5bb9\uff0c\u65e7\u7248\u672c\u7684 Lean \u4ee3\u7801\u53ef\u80fd\u65e0\u6cd5\u5728\u6700\u65b0\u7684 Lean playground \u4e0a\u8fd0\u884c\u3002\u56e0\u6b64\u672c\u7bc7\u5c06\u4ecb\u7ecd\u5982\u4f55\u5728\u672c\u5730\u90e8\u7f72 Lean4web\uff0c\u4ee5\u53ca\u5982\u4f55\u6dfb\u52a0\u65e7\u7248\u73af\u5883\u3002
"},{"location":"projects/lean4web/#_1","title":"\u9879\u76ee\u94fe\u63a5\u89c4\u5219","text":"Lean4web \u4f7f\u7528 URL \u53c2\u6570\u6765\u63a7\u5236\u4e0d\u540c\u7684\u529f\u80fd\u548c\u52a0\u8f7d\u4e0d\u540c\u7684\u9879\u76ee\u3002\u4f8b\u5982\uff1a
code=
: \u7eaf\u6587\u672c\u4ee3\u7801 codez=
: \u4f7f\u7528 LZ-string \u538b\u7f29\u7684\u4ee3\u7801 url=
: \u4ece\u6307\u5b9a\u7684 URL \u52a0\u8f7d\u5185\u5bb9\uff0c\u4f18\u5148\u7ea7\u9ad8\u4e8e\u4e0a\u9762\u7684 code
\u548c codez
project=
: \u7528\u4e8e\u670d\u52a1\u5668\u8bc4\u4f30\u4ee3\u7801\u7684 Lean \u9879\u76ee\u540d\u79f0\uff0c\u8be5\u540d\u79f0\u5fc5\u987b\u662f\u670d\u52a1\u5668\u914d\u7f6e\u4e2d\u5b9a\u4e49\u7684\u9879\u76ee\u4e4b\u4e00 \u8fd9\u4e9b\u89c4\u5219\u5141\u8bb8\u901a\u8fc7 URL \u76f4\u63a5\u52a0\u8f7d Lean \u4ee3\u7801\uff0c\u65b9\u4fbf\u7528\u6237\u5206\u4eab\u548c\u4ea4\u6d41\u3002
"},{"location":"projects/lean4web/#_2","title":"\u9879\u76ee\u90e8\u7f72\u548c\u542f\u52a8\u65b9\u5f0f","text":"\u4ee5\u4e0b\u6b65\u9aa4\u90e8\u7f72\u5728 Ubuntu Server 22.10 \u4e0a\u65f6\u6d4b\u53ef\u884c\uff1a
\u5b89\u88c5 NPM:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash\nsource ~/.bashrc\nnvm install 20\n
\u514b\u9686 Lean4web \u4ed3\u5e93:
sudo apt-get install git\ngit clone --recurse-submodules https://github.com/leanprover-community/lean4web.git\n
\u5b89\u88c5 Bubblewrap \u4ee5\u589e\u5f3a\u5b89\u5168\u6027:
sudo apt-get install bubblewrap\n
\u56de\u5230\u4ed3\u5e93\u76ee\u5f55\uff0c\u5b89\u88c5\u4f9d\u8d56\u5e76\u7f16\u8bd1:
cd lean4web\nnpm install\nnpm run build\n
\u542f\u52a8\u670d\u52a1\u5668:
PORT=8080 npm run production\n
\u901a\u8fc7\u8fd9\u4e9b\u6b65\u9aa4\uff0cLean4web \u670d\u52a1\u5668\u5c06\u4f1a\u5728\u6307\u5b9a\u7684\u7aef\u53e3\u542f\u52a8\u670d\u52a1\u3002
"},{"location":"projects/lean4web/#mathlib","title":"\u6dfb\u52a0\u65e7\u7248\u5e26 mathlib \u7684\u65b9\u5f0f","text":"\u8981\u521b\u5efa\u5305\u542b\u7279\u5b9a\u7248\u672c mathlib \u7684 Lean \u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528 create_project.sh
\u811a\u672c\uff1a
cd lean4web\ncd Projects\nbash create_project.sh <version>\n
\u7528\u5177\u4f53\u7684\u7248\u672c\u53f7\u66ff\u6362 <version>
\u3002\u8fd9\u4f1a\u5728 Projects/
\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee\uff0c\u5e76\u914d\u7f6e\u76f8\u5e94\u7684 mathlib \u4f9d\u8d56\u548c\u5de5\u5177\u94fe\u7248\u672c\u3002
\u914d\u7f6e\u540e\uff0c\u5728 client/src/config/config.json
\u4e2d\u6dfb\u52a0\u7c7b\u4f3c\u5b57\u6bb5\uff1a
{ \"folder\": \"v4.13.0\",\n \"name\": \"Lean 4.13.0\",\n}\n
\u91cd\u65b0\u8fd0\u884c npm run build
\u548c npm run production
\u5373\u53ef\u3002
"},{"location":"projects/lean4web/#cdn","title":"CDN \u4f18\u5316","text":"\u7f51\u7ad9\u5b58\u5728\u8f83\u5927\u7684\u9759\u6001\u8d44\u6e90\uff0c\u9996\u6b21\u8bbf\u95ee\u901f\u5ea6\u53ef\u80fd\u8f83\u6162\uff0c\u6bd4\u5982\u5b57\u4f53\u6587\u4ef6\u548c JS \u6587\u4ef6\uff1a
\u540e\u7eed\u8003\u8651\u90e8\u7f72 CDN \u670d\u52a1\uff0c\u4f18\u5316\u52a0\u8f7d\u901f\u5ea6\u3002
"},{"location":"references/lake-doc/","title":"Lake \u5305\u7ba1\u7406","text":""},{"location":"references/lake-doc/#lake","title":"Lake \u5b98\u65b9\u6587\u6863","text":"Lake\uff08Lean Make\uff09\u662f Lean 4 \u65b0\u7684\u6784\u5efa\u7cfb\u7edf\u548c\u5305\u7ba1\u7406\u5668\u3002\u501f\u52a9 Lake\uff0c\u5305\u7684\u914d\u7f6e\u53ef\u4ee5\u5199\u5165\u4f4d\u4e8e\u5305\u6839\u76ee\u5f55\u4e0b\u7684\u4e13\u7528 lakefile.lean
\u6587\u4ef6\u4e2d\u3002
\u6bcf\u4e2a lakefile.lean
\u6587\u4ef6\u5305\u542b\u4e00\u4e2a package
\u58f0\u660e\uff08\u7c7b\u4f3c\u4e8e main
\u51fd\u6570\uff09\uff0c\u7528\u4e8e\u5b9a\u4e49\u5305\u7684\u57fa\u672c\u914d\u7f6e\u3002\u901a\u5e38\uff0c\u8fd8\u5305\u62ec\u4e0d\u540c\u76ee\u6807\u7684\u6784\u5efa\u914d\u7f6e\uff08\u4f8b\u5982 Lean \u5e93\u6587\u4ef6\u548c\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\uff09\uff0c\u4ee5\u53ca\u901a\u8fc7 lake script run
\u8fd0\u884c\u7684\u547d\u4ee4\u884c\u811a\u672c\u3002
\u6b64 README \u63d0\u4f9b\u4e86\u4e0e\u5f53\u524d\u63d0\u4ea4\u76f8\u5173\u7684 Lake \u4fe1\u606f\u3002\u5982\u679c\u60a8\u6b63\u5728\u67e5\u627e\u968f\u7279\u5b9a Lean \u7248\u672c\u53d1\u5e03\u7684 Lake \u6587\u6863\uff0c\u8bf7\u67e5\u770b\u8be5\u7248\u672c\u7684 README\u3002
"},{"location":"references/lake-doc/#lake_1","title":"\u83b7\u53d6 Lake","text":"Lake \u662f lean4 \u4ed3\u5e93\u7684\u4e00\u90e8\u5206\uff0c\u968f\u5176\u5b98\u65b9\u7248\u672c\u4e00\u540c\u53d1\u5e03\uff08\u4f8b\u5982\uff0c\u4f5c\u4e3a elan \u5de5\u5177\u94fe\u7684\u4e00\u90e8\u5206\uff09\u3002\u6240\u4ee5\uff0c\u5982\u679c\u4f60\u5df2\u7ecf\u5b89\u88c5\u4e86\u8fd1\u671f\u7248\u672c\u7684 Lean 4\uff0c\u4f60\u4e5f\u5e94\u8be5\u5df2\u7ecf\u62e5\u6709\u4e86 Lake\uff01\u5982\u679c\u4f60\u60f3\u81ea\u5df1\u4ece\u6e90\u7801\u6784\u5efa\u6700\u65b0\u7248\u672c\uff0c\u8bf7\u53c2\u9605\u6b64 README \u6700\u540e\u7684\u6784\u5efa\u6307\u5357\u3002
"},{"location":"references/lake-doc/#_1","title":"\u521b\u5efa\u5e76\u6784\u5efa\u4e00\u4e2a\u5305","text":"\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5305\uff0c\u53ef\u4ee5\u8fd0\u884c lake init
\u5728\u5f53\u524d\u76ee\u5f55\u4e2d\u8bbe\u7f6e\u5305\uff0c\u6216\u8fd0\u884c lake new
\u5728\u65b0\u76ee\u5f55\u4e2d\u521b\u5efa\u5305\u3002\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u521b\u5efa\u5305 hello
\uff1a
$ mkdir hello\n$ cd hello\n$ lake init hello\n
\u6216\u8005\u8fd9\u6837\uff1a
$ lake new hello\n$ cd hello\n
\u65e0\u8bba\u91c7\u7528\u54ea\u79cd\u65b9\u5f0f\uff0cLake \u90fd\u4f1a\u521b\u5efa\u5982\u4e0b\u6a21\u677f\u76ee\u5f55\u7ed3\u6784\u5e76\u4e3a\u5305\u521d\u59cb\u5316\u4e00\u4e2a Git \u4ed3\u5e93\u3002
.lake/ # Lake \u7684\u8f93\u51fa\u76ee\u5f55\nHello/ # \u5e93\u7684\u6e90\u6587\u4ef6\u76ee\u5f55; \u901a\u8fc7 `import Hello.*` \u5bfc\u5165\n Basic.lean # \u4e00\u4e2a\u793a\u4f8b\u5e93\u6a21\u5757\u6587\u4ef6\n ... # \u5728\u6b64\u5904\u6dfb\u52a0\u5176\u4ed6\u6587\u4ef6\nHello.lean # \u5e93\u7684\u6839\u6587\u4ef6; \u4ece Hello \u5bfc\u5165\u6807\u51c6\u6a21\u5757\nMain.lean # \u53ef\u6267\u884c\u6587\u4ef6\u7684\u4e3b\u6587\u4ef6 (\u542b `def main`)\nlakefile.lean # Lake \u7684\u5305\u914d\u7f6e\u6587\u4ef6\nlean-toolchain # \u5305\u6240\u4f7f\u7528\u7684 Lean \u7248\u672c\n.gitignore # \u6392\u9664\u7cfb\u7edf\u7279\u5b9a\u6587\u4ef6 (\u5982 `build`) \u4ece Git \u7248\u672c\u63a7\u5236\u4e2d\n
\u793a\u4f8b\u6a21\u5757\u6587\u4ef6\u5305\u542b\u4ee5\u4e0b \"Hello World\" \u7a0b\u5e8f\u3002
Hello/Basic.lean
def hello := \"world\"\n
Hello.lean
-- \u8fd9\u4e2a\u6a21\u5757\u662f `Hello` \u5e93\u7684\u6839\u6587\u4ef6\n-- \u5728\u8fd9\u91cc\u5bfc\u5165\u5e94\u4f5c\u4e3a\u5e93\u4e00\u90e8\u5206\u6784\u5efa\u7684\u6a21\u5757\u3002\nimport \u00abHello\u00bb.Basic\n
Main.lean
import \u00abHello\u00bb\n\ndef main : IO Unit :=\n IO.println s!\"Hello, {hello}!\"\n
Lake \u8fd8\u4f1a\u4e3a\u5305\u521b\u5efa\u4e00\u4e2a\u57fa\u7840\u7684 lakefile.lean
\u6587\u4ef6\u4ee5\u53ca\u4e00\u4e2a\u5305\u542b Lean \u5de5\u5177\u94fe\u540d\u79f0\u7684 lean-toolchain
\u6587\u4ef6\uff0c\u8fd9\u6837 elan \u5c31\u77e5\u9053\u8be5\u4e3a\u8fd9\u4e2a\u5305\u4f7f\u7528\u54ea\u4e2a Lean \u5de5\u5177\u94fe\u3002
lakefile.lean
import Lake\nopen Lake DSL\n\npackage \u00abhello\u00bb where\n -- \u5728\u6b64\u6dfb\u52a0\u5305\u914d\u7f6e\u9009\u9879\n\nlean_lib \u00abHello\u00bb where\n -- \u5728\u6b64\u6dfb\u52a0\u5e93\u914d\u7f6e\u9009\u9879\n\n@[default_target]\nlean_exe \u00abhello\u00bb where\n root := `Main\n
lake build
\u547d\u4ee4\u7528\u4e8e\u6784\u5efa\u5305\uff08\u53ca\u5176\u4f9d\u8d56\u9879\uff0c\u5982\u679c\u6709\u7684\u8bdd\uff09\u4e3a\u672c\u5730\u53ef\u6267\u884c\u6587\u4ef6\u3002\u7ed3\u679c\u5c06\u653e\u7f6e\u5728 .lake/build/bin
\u76ee\u5f55\u4e0b\u3002lake clean
\u547d\u4ee4\u4f1a\u5220\u9664 build
\u76ee\u5f55\u3002
$ lake build\n...\n$ ./.lake/build/bin/hello\nHello, world!\n
\u5728\u6b64\u4ed3\u5e93\u7684 examples
\u6587\u4ef6\u5939\u4e2d\u53ef\u4ee5\u627e\u5230\u4e0d\u540c\u5305\u914d\u7f6e\u7684\u793a\u4f8b\u3002\u4f60\u4e5f\u53ef\u4ee5\u4e3a lake init
\u6216 lake new
\u547d\u4ee4\u4f20\u5165\u6a21\u677f\u4ee5\u63a7\u5236 Lake \u521b\u5efa\u7684\u6587\u4ef6\u3002\u4f8b\u5982\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7 lake new hello .toml
\u547d\u4ee4\u751f\u6210\u4e00\u4e2a TOML \u7248\u672c\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u800c\u4e0d\u662f\u4f7f\u7528 Lean \u914d\u7f6e\u6587\u4ef6\u3002
lakefile.toml
name = \"hello\"\ndefaultTargets = [\"hello\"]\n\n[[lean_lib]]\nname = \"Hello\"\n\n[[lean_exe]]\nname = \"hello\"\nroot = \"Main\"\n
\u4f7f\u7528 lake help init
\u6216 lake help new
\u547d\u4ee4\u53ef\u4ee5\u67e5\u770b\u6709\u5173\u5176\u4ed6\u6a21\u677f\u9009\u9879\u7684\u66f4\u591a\u8be6\u7ec6\u4fe1\u606f\u3002
"},{"location":"references/lake-doc/#_2","title":"\u672f\u8bed\u8868","text":"\u5728\u8f6f\u4ef6\u5f00\u53d1\u8fc7\u7a0b\u4e2d\uff0cLake \u4f1a\u7528\u5230\u4e00\u7cfb\u5217\u7684\u672f\u8bed \u2014\u2014 \u5982\u5de5\u4f5c\u7a7a\u95f4\uff08workspace\uff09\u3001\u5305\uff08package\uff09\u3001\u5e93\uff08library\uff09\u3001\u53ef\u6267\u884c\u6587\u4ef6\uff08executable\uff09\u3001\u76ee\u6807\uff08target\uff09\u7b49\u7b49 \u2014\u2014 \u8fd8\u6709\u4e9b\u66f4\u96be\u7406\u89e3\u7684\u672f\u8bed\uff0c\u5982 facet\u3002\u4e0d\u8fc7\uff0c\u65e0\u8bba\u8fd9\u4e9b\u672f\u8bed\u662f\u5426\u5e38\u89c1\uff0c\u4e0d\u540c\u7684\u4eba\u5bf9\u5176\u90fd\u6709\u7740\u4e0d\u540c\u7684\u7406\u89e3\uff0c\u56e0\u6b64\u6709\u5fc5\u8981\u660e\u786e Lake \u5bf9\u8fd9\u4e9b\u672f\u8bed\u7684\u5b9a\u4e49\uff1a
\u5305\uff08package\uff09 \u662f Lake \u4ee3\u7801\u5206\u53d1\u7684\u57fa\u672c\u5355\u5143\u3002\u5305\u53ef\u4ee5\u6765\u6e90\u4e8e\u672c\u5730\u6587\u4ef6\u7cfb\u7edf\uff0c\u4e5f\u53ef\u4ee5\u4ece\u7f51\u7edc\u4e0b\u8f7d\uff08\u5982\u901a\u8fc7 Git\uff09\u3002\u5305\u7684 lakefile \u4e2d\u7684 package
\u58f0\u660e\u51b3\u5b9a\u4e86\u5305\u7684\u540d\u79f0\uff0c\u5e76\u5b9a\u4e49\u5176\u57fa\u672c\u5c5e\u6027\u3002 lakefile \u662f\u8bb0\u5f55\u6574\u4e2a\u5305\u914d\u7f6e\u7684 Lean \u6587\u4ef6\u3002\u5b83\u5b9a\u4e49\u4e86\u5982\u4f55\u67e5\u770b\u3001\u7f16\u8f91\u3001\u6784\u5efa\u548c\u8fd0\u884c\u5305\u4e2d\u7684\u4ee3\u7801\uff0c\u5e76\u6307\u5b9a\u4e86\u6240\u4f9d\u8d56\u7684\u5176\u5b83\u5305\u3002 \u5982\u679c\u5305 B \u4f9d\u8d56\u5305 A\uff0c\u5305 A \u5c31\u662f\u5305 B \u7684 \u4f9d\u8d56\uff08dependency\uff09\uff0c\u800c\u5305 B \u5c31\u662f\u5305 A \u7684 \u4e0b\u6e38\u4f9d\u8d56\uff08dependent\uff09\u3002\u5305 A \u662f\u5305 B \u7684 \u4e0a\u6e38\uff0c\u53cd\u4e4b\u5305 B \u662f\u5305 A \u7684 \u4e0b\u6e38\u3002\u53c2\u89c1\u6dfb\u52a0\u4f9d\u8d56 \u4ee5\u4e86\u89e3\u5982\u4f55\u6307\u5b9a\u4f9d\u8d56\u3002 \u5de5\u4f5c\u7a7a\u95f4\uff08workspace\uff09 \u662f Lake \u4e2d \u6700\u5927\u7684\u7ec4\u7ec7\u5355\u5143\u3002\u5b83\u5c06\u4e00\u4e2a\u88ab\u79f0\u4e3a root(\u6839) \u7684\u5305\u3001\u4f20\u9012\u7684\u4f9d\u8d56\u4ee5\u53ca Lake \u7684\u73af\u5883\u7ec4\u5408\u5728\u4e00\u8d77\u3002\u6bcf\u4e2a\u5305\u90fd\u53ef\u4ee5\u4f5c\u4e3a\u5de5\u4f5c\u533a\u7684\u6839\uff0c\u5e76\u4e14\u5de5\u4f5c\u533a\u5c06\u4ece\u8fd9\u4e2a\u6839\u6d3e\u751f\u5176\u914d\u7f6e\u3002 \u6a21\u5757\uff08module\uff09 \u662f Lake \u6784\u5efa\u7cfb\u7edf\u53ef\u89c1\u7684\u6700\u5c0f\u4ee3\u7801\u5355\u5143\u3002\u6a21\u5757\u901a\u5e38\u7531\u4e00\u4e2a Lean \u6e90\u6587\u4ef6\u548c\u4e00\u7ec4\u4e8c\u8fdb\u5236\u5e93\u6587\u4ef6\uff08\u5982 olean
\u548c ilean
\uff0c\u82e5\u5f00\u542f precompileModules
\u9009\u9879\uff0c\u8fd8\u5305\u62ec\u7cfb\u7edf\u5171\u4eab\u5e93\uff09\u7ec4\u6210\u3002\u6a21\u5757\u4e4b\u95f4\u53ef\u4ee5\u76f8\u4e92\u5bfc\u5165\u4ee5\u4f7f\u7528\u5f7c\u6b64\u7684\u4ee3\u7801\uff0cLake \u7684\u4e3b\u8981\u4f5c\u7528\u5c31\u662f\u4fc3\u8fdb\u8fd9\u4e00\u8fc7\u7a0b\u3002 Lean \u5e93\uff08Lean library\uff09 \u662f\u4e00\u7ec4\u5171\u4eab\u540c\u4e00\u914d\u7f6e\u7684\u6a21\u5757\u96c6\u5408\u3002\u5176\u914d\u7f6e\u5b9a\u4e49\u4e86\u4e00\u7ec4 \u6a21\u5757\u6839\uff08module roots\uff09\uff0c\u7528\u4e8e\u786e\u5b9a\u54ea\u4e9b\u6a21\u5757\u5c5e\u4e8e\u8be5\u5e93\uff0c\u4ee5\u53ca\u4e00\u7ec4 \u6a21\u5757\u5168\u5c40\u6a21\u5f0f\uff08module globs\uff09\uff0c\u7528\u4e8e\u5728\u5e93\u7684 lake build
\u8fc7\u7a0b\u4e2d\u9009\u62e9\u8981\u6784\u5efa\u7684\u6a21\u5757\u3002\u53c2\u89c1Lean \u5e93\u90e8\u5206\u4e86\u89e3\u66f4\u591a\u8be6\u60c5\u3002 Lean \u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\uff08Lean binary executable\uff09 \u662f\u4e00\u4e2a\u7531\u6839\u6a21\u5757\uff08\u5176\u4e2d\u5e94\u5305\u542b main
\u5b9a\u4e49\uff09\u6784\u5efa\u7684\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\uff08\u5373\u7528\u6237\u5728\u672a\u5b89\u88c5 Lean \u65f6\u5c31\u80fd\u5728\u7535\u8111\u4e0a\u8fd0\u884c\u7684\u7a0b\u5e8f\uff09\u3002\u53c2\u89c1\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u90e8\u5206\u4e86\u89e3\u66f4\u591a\u8be6\u60c5\u3002 \u5916\u90e8\u5e93\uff08external library\uff09 \u662f\u7531\u5916\u90e8\u4ee3\u7801\uff08\u5982 C \u8bed\u8a00\uff09\u6784\u5efa\u7684\u539f\u751f\uff08\u9759\u6001\uff09\u5e93\uff0cLean \u4ee3\u7801\u9700\u8981\u8fd9\u4e9b\u5e93\u6765\u5b9e\u73b0\u529f\u80fd\uff08\u4f8b\u5982\uff0c\u4f7f\u7528 @[extern]
\u8c03\u7528\u5916\u90e8\u4ee3\u7801\uff09\u3002extern_lib
\u76ee\u6807\u7528\u4e8e\u544a\u77e5 Lake \u6b64\u7c7b\u9700\u6c42\u5e76\u6307\u793a Lake \u5982\u4f55\u6784\u5efa\u5fc5\u8981\u7684\u5e93\u3002Lake \u968f\u540e\u4f1a\u5728\u9002\u5f53\u65f6\u81ea\u52a8\u94fe\u63a5\u5916\u90e8\u5e93\uff0c\u4ee5\u4fbf\u4f7f Lean \u4ee3\u7801\u80fd\u591f\u8bbf\u95ee\u6240\u9700\u7684\u5916\u90e8\u51fd\u6570\uff08\u6216\u66f4\u4e13\u4e1a\u5730\u8bf4\uff0c\u662f\u5916\u90e8\u7b26\u53f7\uff09\u3002\u53c2\u89c1\u5916\u90e8\u5e93\u90e8\u5206\u4e86\u89e3\u66f4\u591a\u8be6\u60c5\u3002 \u76ee\u6807\uff08target\uff09 \u662f Lake \u6784\u5efa\u7684\u57fa\u672c\u5355\u5143\u3002\u4e00\u4e2a\u5305\u53ef\u4ee5\u5b9a\u4e49\u4efb\u610f\u6570\u91cf\u7684\u76ee\u6807\u3002\u6bcf\u4e2a\u76ee\u6807\u90fd\u6709\u4e00\u4e2a\u540d\u79f0\uff0c\u7528\u4e8e\u6307\u793a Lake \u53bb\u6784\u5efa\u8be5\u76ee\u6807\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 lake build <target>
\uff09\u5e76\u5728\u5185\u90e8\u8ddf\u8e2a\u76ee\u6807\u7684\u6784\u5efa\u72b6\u6001\u3002Lake \u5b9a\u4e49\u4e86\u4e00\u7ec4\u5185\u7f6e\u76ee\u6807\u7c7b\u578b \u2014\u2014 Lean \u5e93\u3001\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6 \u548c \u5916\u90e8\u5e93 \u2014\u2014 \u4f46\u7528\u6237\u4e5f\u53ef\u4ee5\u5b9a\u4e49\u81ea\u5df1\u7684\u81ea\u5b9a\u4e49\u76ee\u6807\u3002\u590d\u6742\u7c7b\u578b\uff08\u5982\u5305\u3001\u5e93\u3001\u6a21\u5757\uff09\u5177\u6709\u591a\u4e2a facet\uff0c\u6bcf\u4e2a facet \u90fd\u7b97\u4f5c\u72ec\u7acb\u7684\u53ef\u6784\u5efa\u76ee\u6807\u3002\u53c2\u89c1\u5b9a\u4e49\u6784\u5efa\u76ee\u6807\u90e8\u5206\u4e86\u89e3\u66f4\u591a\u8be6\u60c5\u3002 facet \u662f\u4ece\u5176\u5b83\u7ec4\u7ec7\u5355\u4f4d\u6784\u5efa\u51fa\u7684\u5355\u4e2a\u5143\u7d20\uff08\u5982\u5305\u3001\u6a21\u5757\u3001\u5e93\u7b49\uff09\u3002\u4f8b\u5982\uff0cLake \u4ece\u5355\u4e2a\u6a21\u5757\u751f\u6210 olean
\u3001ilean
\u3001c
\u548c o
\u6587\u4ef6\uff0c\u8fd9\u4e9b\u7ec4\u4ef6\u90fd\u88ab\u79f0\u4e3a\u8be5\u6a21\u5757\u7684\u4e00\u4e2a facet\u3002\u540c\u6837\u5730\uff0cLake \u53ef\u4ee5\u4ece\u4e00\u4e2a\u5e93\u4e2d\u7f16\u8bd1\u9759\u6001\u548c\u5171\u4eab\u4e24\u79cd\u4e8c\u8fdb\u5236\u6587\u4ef6\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5e93\u540c\u65f6\u5177\u6709 static
\u548c shared
\u4e24\u79cd facet\u3002Lake \u8fd8\u5141\u8bb8\u7528\u6237\u5b9a\u4e49\u81ea\u5df1\u7684\u81ea\u5b9a\u4e49 facet \u6765\u4ece\u6a21\u5757\u548c\u5305\u6784\u5efa\uff0c\u4f46\u8fd9\u4e00\u7279\u6027\u5f53\u524d\u4ecd\u5728\u8bd5\u9a8c\u9636\u6bb5\u4e14\u5c1a\u65e0\u76f8\u5173\u6587\u6863\u3002 trace \u662f\u7528\u6765\u68c0\u67e5\u76ee\u6807\u662f\u5426\u6700\u65b0\uff08\u5373\u662f\u5426\u9700\u8981\u91cd\u65b0\u6784\u5efa\uff09\u7684\u4e00\u4e9b\u6570\u636e\uff08\u901a\u5e38\u662f\u54c8\u5e0c\u503c\uff09\u3002\u5982\u679c\u5df2\u6784\u5efa\u76ee\u6807\u7684 trace \u4e0e\u6784\u5efa\u8fc7\u7a0b\u4e2d\u8ba1\u7b97\u7684 trace \u76f8\u5339\u914d\uff0c\u5219\u76ee\u6807\u88ab\u8ba4\u4e3a\u662f\u6700\u65b0\u7684\u3002\u76ee\u6807\u7684 trace \u6e90\u4e8e\u5176\u5404\u79cd**\u8f93\u5165**\uff08\u5982\u6e90\u6587\u4ef6\u3001Lean \u5de5\u5177\u94fe\u3001\u5bfc\u5165\u7b49\uff09\u3002 "},{"location":"references/lake-doc/#_3","title":"\u5305\u914d\u7f6e\u9009\u9879","text":"Lake \u63d0\u4f9b\u4e86\u591a\u79cd\u591a\u6837\u7684\u5305\u914d\u7f6e\u9009\u9879\u3002
"},{"location":"references/lake-doc/#_4","title":"\u5e03\u5c40","text":"\u8fd9\u4e9b\u9009\u9879\u63a7\u5236\u5305\u53ca\u5176\u6784\u5efa\u76ee\u5f55\u7684\u9876\u5c42\u76ee\u5f55\u5e03\u5c40\u3002\u5e93\u3001\u53ef\u6267\u884c\u6587\u4ef6\u548c\u5305\u5185\u7684\u76ee\u6807\u6307\u5b9a\u7684\u8fdb\u4e00\u6b65\u8def\u5f84\u76f8\u5bf9\u4e8e\u8fd9\u4e9b\u76ee\u5f55\u3002
packagesDir
: Lake \u4e0b\u8f7d\u8fdc\u7a0b\u4f9d\u8d56\u9879\u7684\u76ee\u5f55\u3002\u9ed8\u8ba4\u4e3a .lake/packages
\u3002 srcDir
: \u5305\u542b\u5305\u7684 Lean \u6e90\u6587\u4ef6\u7684\u76ee\u5f55\u3002\u9ed8\u8ba4\u4e3a\u5305\u76ee\u5f55\u3002 buildDir
: Lake \u8f93\u51fa\u5305\u6784\u5efa\u7ed3\u679c\u7684\u76ee\u5f55\u3002\u9ed8\u8ba4\u503c\u4e3a build
\u3002 leanLibDir
: Lake \u8f93\u51fa\u5305\u7684\u4e8c\u8fdb\u5236 Lean \u5e93\u6587\u4ef6\uff08\u5982 .olean
\u3001.ilean
\u6587\u4ef6\uff09\u7684\u6784\u5efa\u5b50\u76ee\u5f55\u3002\u9ed8\u8ba4\u4e3a lib
\u3002 nativeLibDir
: Lake \u8f93\u51fa\u5305\u7684\u672c\u5730\u5e93\u6587\u4ef6\uff08\u5982 .a
\u3001.so
\u3001.dll
\u6587\u4ef6\uff09\u7684\u6784\u5efa\u5b50\u76ee\u5f55\u3002\u9ed8\u8ba4\u4e3a lib
\u3002 binDir
: Lake \u8f93\u51fa\u5305\u7684\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u7684\u6784\u5efa\u5b50\u76ee\u5f55\u3002\u9ed8\u8ba4\u4e3a bin
\u3002 irDir
: Lake \u8f93\u51fa\u5305\u7684\u4e2d\u95f4\u7ed3\u679c\uff08\u5982 .c
\u3001.o
\u6587\u4ef6\uff09\u7684\u6784\u5efa\u5b50\u76ee\u5f55\u3002\u9ed8\u8ba4\u4e3a ir
\u3002 "},{"location":"references/lake-doc/#_5","title":"\u6784\u5efa\u4e0e\u8fd0\u884c","text":"\u8fd9\u4e9b\u9009\u9879\u914d\u7f6e\u5305\u4e2d\u4ee3\u7801\u7684\u6784\u5efa\u548c\u8fd0\u884c\u65b9\u5f0f\u3002\u5305\u5185\u7684\u5e93\u3001\u53ef\u6267\u884c\u6587\u4ef6\u548c\u5176\u4ed6\u76ee\u6807\u53ef\u4ee5\u8fdb\u4e00\u6b65\u6dfb\u52a0\u5230\u6b64\u914d\u7f6e\u7684\u90e8\u5206\u5185\u5bb9\u3002
platformIndependent
: \u786e\u5b9a Lake \u662f\u5426\u5e94\u5047\u8bbe Lean \u6a21\u5757\u5e73\u53f0\u65e0\u5173\u3002\u5373\uff0cLake \u662f\u5426\u5e94\u5728\u6a21\u5757\u7684 trace \u4e2d\u5305\u542b\u5e73\u53f0\u53ca\u5176\u4f9d\u8d56\u7684\u5143\u7d20\u3002\u6709\u5173\u66f4\u591a\u8be6\u60c5\uff0c\u8bf7\u53c2\u9605 Lake.LeanConfig.platformIndependent
\u7684\u6587\u6863\u5b57\u7b26\u4e32\u3002\u9ed8\u8ba4\u503c\u4e3a none
\u3002 precompileModules
: \u662f\u5426\u5c06\u6bcf\u4e2a\u6a21\u5757\u7f16\u8bd1\u4e3a\u672c\u5730\u5171\u4eab\u5e93\u6587\u4ef6\uff0c\u8be5\u6587\u4ef6\u5728\u6a21\u5757\u5bfc\u5165\u65f6\u52a0\u8f7d\u3002\u8fd9\u52a0\u5feb\u4e86\u5143\u7a0b\u5e8f\u7684\u8bc4\u4f30\uff0c\u5e76\u5141\u8bb8\u89e3\u91ca\u5668\u8fd0\u884c\u5e26\u6709 @[extern]
\u6807\u8bb0\u7684\u51fd\u6570\u3002\u9ed8\u8ba4\u503c\u4e3a false
\u3002 moreServerOptions
: \u4f20\u9012\u7ed9\u7531 lake serve
\u542f\u52a8\u7684 Lean \u8bed\u8a00\u670d\u52a1\u5668\uff08\u5373 lean --server
\uff09\u7684\u9644\u52a0\u9009\u9879\u6570\u7ec4\u3002 moreGlobalServerArgs
: \u4f20\u9012\u7ed9 lean --server
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\uff0c\u8fd9\u4e9b\u53c2\u6570\u9002\u7528\u4e8e\u6b64\u5305\u53ca\u540c\u4e00\u670d\u52a1\u5668\u4f1a\u8bdd\u4e2d\u7684\u5176\u4ed6\u4efb\u4f55\u5185\u5bb9\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 go-to-definition \u5728\u540c\u4e00\u4f1a\u8bdd\u4e2d\u6d4f\u89c8\u5176\u4ed6\u5305\u65f6\uff09\u3002 buildType
: \u5305\u4e2d\u76ee\u6807\u7684 BuildType
\uff08\u53c2\u89c1 CMAKE_BUILD_TYPE
\uff09\u3002\u53ef\u4ee5\u4e3a debug
\u3001relWithDebInfo
\u3001minSizeRel
\u6216 release
\u5176\u4e2d\u4e4b\u4e00\u3002\u9ed8\u8ba4\u503c\u4e3a release
\u3002 leanOptions
: \u4f20\u9012\u7ed9\u7531 lake serve
\u542f\u52a8\u7684 Lean \u8bed\u8a00\u670d\u52a1\u5668\uff08\u5373 lean --server
\uff09\u548c\u5728\u7f16\u8bd1 Lean \u6e90\u6587\u4ef6\u65f6\u4f20\u9012\u7ed9 lean
\u7684\u9644\u52a0\u9009\u9879\u3002 moreLeanArgs
: \u7f16\u8bd1 Lean \u6e90\u6587\u4ef6\u65f6\u4f20\u9012\u7ed9 lean
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\u3002 weakLeanArgs
: \u7f16\u8bd1 Lean \u6e90\u6587\u4ef6\u65f6\u4f20\u9012\u7ed9 lean
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\u3002\u4e0e moreLeanArgs
\u4e0d\u540c\u7684\u662f\uff0c\u8fd9\u4e9b\u53c2\u6570\u4e0d\u4f1a\u5f71\u54cd\u6784\u5efa\u7ed3\u679c\u7684 trace\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728\u4e0d\u89e6\u53d1\u91cd\u6784\u7684\u60c5\u51b5\u4e0b\u66f4\u6539\u3002\u5728 moreLeanArgs
\u4e4b\u524d\u4f20\u9012\u3002 moreLeancArgs
: \u7f16\u8bd1\u7531 lean
\u751f\u6210\u7684 C \u6e90\u6587\u4ef6\u65f6\u4f20\u9012\u7ed9 leanc
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\u3002Lake \u5df2\u7ecf\u6839\u636e buildType
\u4f20\u9012\u4e86\u4e00\u4e9b\u6807\u5fd7\uff0c\u4f46\u4f60\u53ef\u4ee5\u901a\u8fc7\u6dfb\u52a0 -O0
\u548c -UNDEBUG
\u4e4b\u7c7b\u7684\u53c2\u6570\u6765\u66f4\u6539\u5b83\u3002 weakLeancArgs
: \u7f16\u8bd1\u7531 lean
\u751f\u6210\u7684 C \u6e90\u6587\u4ef6\u65f6\u4f20\u9012\u7ed9 leanc
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\u3002\u4e0e moreLeancArgs
\u4e0d\u540c\u7684\u662f\uff0c\u8fd9\u4e9b\u53c2\u6570\u4e0d\u4f1a\u5f71\u54cd\u6784\u5efa\u7ed3\u679c\u7684 trace\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728\u4e0d\u89e6\u53d1\u91cd\u5efa\u7684\u60c5\u51b5\u4e0b\u66f4\u6539\u3002\u5728 moreLeancArgs
\u4e4b\u524d\u4f20\u9012\u3002 moreLinkArgs
: \u94fe\u63a5\u65f6\uff08\u4f8b\u5982\uff0c\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u6216\u5171\u4eab\u5e93\uff09\u4f20\u9012\u7ed9 leanc
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\u3002\u8fd9\u4e9b\u53c2\u6570\u5c06\u4f4d\u4e8e extern_lib
\u76ee\u6807\u7684\u8def\u5f84\u4e4b\u540e\u3002 weakLinkArgs
: \u94fe\u63a5\u65f6\uff08\u4f8b\u5982\uff0c\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u6216\u5171\u4eab\u5e93\uff09\u4f20\u9012\u7ed9 leanc
\u7684\u9644\u52a0\u53c2\u6570\u6570\u7ec4\u3002\u4e0e moreLinkArgs
\u4e0d\u540c\u7684\u662f\uff0c\u8fd9\u4e9b\u53c2\u6570\u4e0d\u4f1a\u5f71\u54cd\u6784\u5efa\u7ed3\u679c\u7684 trace\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728\u4e0d\u89e6\u53d1\u91cd\u5efa\u7684\u60c5\u51b5\u4e0b\u66f4\u6539\u3002\u5728 moreLinkArgs
\u4e4b\u524d\u4f20\u9012\u3002 extraDepTargets
: \u5305\u5e94\u59cb\u7ec8\u6700\u5148\u6784\u5efa\u7684\u76ee\u6807\u540d\u79f0\u6570\u7ec4\u3002 "},{"location":"references/lake-doc/#_6","title":"\u6d4b\u8bd5\u4e0e\u68c0\u67e5","text":"CLI \u547d\u4ee4 lake test
\u548c lake lint
\u4f7f\u7528\u7531\u5de5\u4f5c\u7a7a\u95f4\u7684\u6839\u5305\u914d\u7f6e\u7684\u5b9a\u4e49\u6765\u6267\u884c\u6d4b\u8bd5\u548c\u68c0\u67e5\uff08\u8fd9\u79f0\u4e3a\u6d4b\u8bd5\u6216\u68c0\u67e5 driver\uff09\u3002\u5728 Lean \u914d\u7f6e\u6587\u4ef6\u4e2d\uff0c\u53ef\u4ee5\u901a\u8fc7\u5c06 @[test_driver]
\u6216 @[lint_driver]
\u5e94\u7528\u4e8e script
\u3001lean_exe
\u6216 lean_lib
\u6765\u6307\u5b9a\u8fd9\u4e9b\u5b9a\u4e49\u3002\u4e5f\u53ef\u4ee5\u901a\u8fc7\u5305\u4e2d\u7684\u4ee5\u4e0b\u9009\u9879\uff08\u4ee5 Lean \u6216 TOML \u683c\u5f0f\uff09\u8fdb\u884c\u914d\u7f6e\u3002
testDriver
: \u9a71\u52a8 lake test
\u7684\u811a\u672c\u3001\u53ef\u6267\u884c\u6587\u4ef6\u6216\u5e93\u7684\u540d\u79f0\u3002 testDriverArgs
: \u4f20\u9012\u7ed9\u5305\u7684\u6d4b\u8bd5\u9a71\u52a8\u7a0b\u5e8f\u7684\u53c2\u6570\u6570\u7ec4\u3002 lintDriver
: lake lint
\u4f7f\u7528\u7684\u811a\u672c\u6216\u53ef\u6267\u884c\u6587\u4ef6\u7684\u540d\u79f0\u3002\u5e93\u4e0d\u80fd\u7528\u4f5c\u68c0\u67e5\u9a71\u52a8\u7a0b\u5e8f\u3002 lintDriverArgs
: \u4f20\u9012\u7ed9\u5305\u7684\u68c0\u67e5\u9a71\u52a8\u7a0b\u5e8f\u7684\u53c2\u6570\u6570\u7ec4\u3002 \u4f60\u53ef\u4ee5\u4f7f\u7528\u8bed\u6cd5 <pkg>/<name>
\u5c06\u4f9d\u8d56\u9879\u4e2d\u7684\u5b9a\u4e49\u6307\u5b9a\u4e3a\u5305\u7684\u6d4b\u8bd5\u6216\u68c0\u67e5\u9a71\u52a8\u7a0b\u5e8f\u3002\u53ef\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u5c06\u88ab\u6784\u5efa\u7136\u540e\u8fd0\u884c\uff0c\u811a\u672c\u9a71\u52a8\u7a0b\u5e8f\u5c06\u4ec5\u8fd0\u884c\uff0c\u800c\u5e93\u9a71\u52a8\u7a0b\u5e8f\u5c06\u4ec5\u6784\u5efa\u3002\u811a\u672c\u6216\u53ef\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u4f1a\u8fd0\u884c\u5305\u914d\u7f6e\u7684\u4efb\u4f55\u53c2\u6570\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 testDriverArgs
\uff09\uff0c\u7136\u540e\u662f CLI \u4e2d\u6307\u5b9a\u7684\u4efb\u4f55\u53c2\u6570\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 lake lint -- <args>...
\uff09\u3002
"},{"location":"references/lake-doc/#_7","title":"\u4e91\u53d1\u5e03","text":"\u8fd9\u4e9b\u9009\u9879\u4e3a\u5305\u5b9a\u4e49\u4e91\u53d1\u5e03\u3002\u8be6\u7ec6\u4fe1\u606f\u53c2\u89c1GitHub \u53d1\u5e03\u6784\u5efa\u90e8\u5206\u3002
releaseRepo
: \u4e0a\u4f20\u548c\u4e0b\u8f7d\u6b64\u5305\u53d1\u5e03\u7248\u672c\u7684 GitHub \u4ed3\u5e93 URL\u3002\u5982\u679c\u4e3a none
\uff08\u9ed8\u8ba4\uff09\uff0c\u5219\u4e0b\u8f7d\u65f6\uff0cLake \u4f7f\u7528\u5305\u7684\u4e0b\u8f7d URL\uff08\u5982\u679c\u662f\u4f9d\u8d56\u9879\uff09\uff0c\u4e0a\u4f20\u65f6\u4f7f\u7528 gh
\u7684\u9ed8\u8ba4 URL\u3002 buildArchive
: GitHub \u4e91\u53d1\u5e03\u7684\u6784\u5efa\u5f52\u6863\u540d\u79f0\u3002\u9ed8\u8ba4\u4e3a {(pkg-)name}-{System.Platform.target}.tar.gz
\u3002 preferReleaseBuild
: \u5f53\u6b64\u5305\u7528\u4f5c\u4f9d\u8d56\u9879\u65f6\uff0c\u662f\u5426\u4f18\u5148\u4e0b\u8f7d\u9884\u6784\u5efa\u53d1\u5e03\uff08\u4ece GitHub\uff09\uff0c\u800c\u4e0d\u662f\u4ece\u6e90\u7801\u6784\u5efa\u6b64\u5305\u3002 "},{"location":"references/lake-doc/#_8","title":"\u8bbe\u5b9a\u6784\u5efa\u76ee\u6807","text":"\u4e00\u4e2a Lake \u5305\u53ef\u80fd\u6709\u8bb8\u591a\u7684\u6784\u5efa\u76ee\u6807\uff0c\u6bd4\u5982\u4e0d\u540c\u7684 Lean \u5e93\u548c\u8bf8\u591a\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u3002\u4e0d\u8bba\u6570\u91cf\u591a\u5c11\uff0c\u4f60\u603b\u53ef\u4ee5\u5728 @[default_target]
\u540e\u58f0\u660e\u5b83\u4eec\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u7528 lake build
\u8f7b\u677e\u6784\u5efa\u3002
"},{"location":"references/lake-doc/#lean","title":"Lean \u5e93","text":"Lean \u5e93\u76ee\u6807\u5b9a\u4e49\u4e86\u53ef\u4f9b import
\u7684 Lean \u6a21\u5757\u4ee5\u53ca\u5b83\u4eec\u7684\u6784\u5efa\u65b9\u5f0f\u3002
\u8bed\u6cd5
lean_lib \u00abtarget-name\u00bb where\n -- \u914d\u7f6e\u9009\u9879\u4ece\u8fd9\u91cc\u5f00\u59cb\n
[[lean_lib]]\nname = \"\u00abtarget-name\u00bb\"\n# \u66f4\u591a\u914d\u7f6e\u9009\u9879\u4ece\u8fd9\u91cc\u5f00\u59cb\n
\u914d\u7f6e\u9009\u9879
srcDir
: \u5305\u76ee\u5f55\u4e0b\u7684\u5b50\u76ee\u5f55\uff0c\u5305\u542b\u5e93\u7684\u6e90\u6587\u4ef6\u3002\u9ed8\u8ba4\u503c\u4e3a\u5305\u7684 srcDir
\u3002\uff08\u8fd9\u5c06\u4f5c\u4e3a -R
\u9009\u9879\u4f20\u9012\u7ed9 lean
\u3002\uff09 roots
: \u5e93\u7684\u6839\u6a21\u5757\u540d\u6570\u7ec4\u3002\u8fd9\u4e9b\u6839\u6a21\u5757\u7684\u5b50\u6a21\u5757\uff08\u4f8b\u5982\uff0cLib
\u7684 Lib.Foo
\uff09\u88ab\u89c6\u4e3a\u5e93\u7684\u4e00\u90e8\u5206\u3002\u9ed8\u8ba4\u503c\u4e3a\u76ee\u6807\u540d\u7684\u5355\u4e00\u6839\u3002 globs
: \u6784\u5efa\u5e93\u7684\u6a21\u5757 glob \u6570\u7ec4\u3002\u672f\u8bed glob
\u6765\u6e90\u4e8e Unix \u7684 \u6587\u4ef6 glob\uff08\u4f8b\u5982\uff0cfoo/*
\uff09\u3002\u5b50\u6a21\u5757 glob \u6784\u5efa\u6a21\u5757\u76ee\u5f55\u4e2d\u7684\u6bcf\u4e2a Lean \u6e90\u6587\u4ef6\uff08\u5373\uff0c Glob.submodules `Foo
\u57fa\u672c\u4e0a\u7b49\u540c\u4e8e\u7406\u8bba\u4e0a\u7684 import Foo.*
\uff09\u3002glob \u6587\u4ef6\u7684\u672c\u5730\u5bfc\u5165\uff08\u5373\u5de5\u4f5c\u533a\u7684\u5176\u4ed6\u6a21\u5757\uff09\u4e5f\u4f1a\u9012\u5f52\u6784\u5efa\u3002\u9ed8\u8ba4\u503c\u4e3a\u5e93\u4e2d\u6bcf\u4e2a roots
\u7684 Glob.one
\u3002 libName
: \u5e93\u7684\u5b57\u7b26\u4e32\u540d\u79f0\u3002\u7528\u4f5c\u5176\u9759\u6001\u548c\u52a8\u6001\u4e8c\u8fdb\u5236\u6587\u4ef6\u540d\u7684\u57fa\u7840\u3002\u9ed8\u8ba4\u503c\u4e3a\u76ee\u6807\u540d\u79f0\u3002 extraDepTargets
: \u5728\u5e93\u6a21\u5757\u4e4b\u524d\u6784\u5efa\u7684 \u76ee\u6807 \u540d\u79f0\u6570\u7ec4\u3002 defaultFacets
: \u5e93\u7684 facets \u6570\u7ec4\uff0c\u7528\u4e8e\u5728 lake build
\u4e2d\u6784\u5efa\u5e93\u3002\u4f8b\u5982\uff0c\u5c06\u5176\u8bbe\u7f6e\u4e3a #[LeanLib.sharedLib]
\u5c06\u6784\u5efa\u5171\u4eab\u5e93 facet\u3002 nativeFacets
: \u4e00\u4e2a\u51fd\u6570 (shouldExport : Bool) \u2192 Array
\uff0c\u786e\u5b9a\u6784\u5efa\u5e76\u7ec4\u5408\u5230\u5e93\u7684\u9759\u6001\u548c\u5171\u4eab\u5e93\u4e2d\u7684 \u6a21\u5757 facets\u3002\u5982\u679c shouldExport
\u4e3a\u771f\uff0c\u6a21\u5757 facets \u5e94\u5bfc\u51fa\u7528\u6237\u53ef\u80fd\u671f\u671b\u5728\u5e93\u4e2d\u67e5\u627e\u7684\u4efb\u4f55\u7b26\u53f7\u3002\u4f8b\u5982\uff0cLean \u89e3\u91ca\u5668\u5c06\u4f7f\u7528\u94fe\u63a5\u5e93\u4e2d\u7684\u5bfc\u51fa\u7b26\u53f7\u3002\u9ed8\u8ba4\u503c\u4e3a Module.oExportFacet
\u7684\u5355\u4f8b\uff08\u5982\u679c shouldExport
\uff09\u6216 Module.oFacet
\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u4ece Lean \u6e90\u6587\u4ef6\u7f16\u8bd1\u7684\u76ee\u6807\u6587\u4ef6\uff0c\u53ef\u80fd\u5305\u542b\u5bfc\u51fa\u7684 Lean \u7b26\u53f7\u3002 platformIndependent
\u3001precompileModules
\u3001buildType
\u3001leanOptions
\u3001<more|weak><Lean|Leanc|Link>Args
\u3001moreServerOptions
\uff1a\u589e\u5f3a\u5305\u7684\u76f8\u5e94\u914d\u7f6e\u9009\u9879\u3002\u5e93\u7684\u53c2\u6570\u7d27\u968f\u5176\u540e\uff0c\u5982\u679c\u5e93\u6216\u5305\u90fd\u9884\u7f16\u8bd1\uff0c\u5219\u6a21\u5757\u4f1a\u88ab\u9884\u7f16\u8bd1\uff0cplatformIndependent
\u5728 none
\u60c5\u51b5\u4e0b\u4f1a\u56de\u9000\u5230\u5305\uff0c\u5e76\u4e14\u6784\u5efa\u7c7b\u578b\u662f\u4e24\u8005\u4e2d\u7684\u6700\u4f4e\u503c\uff08debug
\u662f\u6700\u4f4e\u7684\uff0c\u800c release
\u662f\u6700\u9ad8\u7684\uff09\u3002 "},{"location":"references/lake-doc/#_9","title":"\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6","text":"\u4e00\u4e2a Lean \u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u76ee\u6807\u4ece\u5e26\u6709 main
\u51fd\u6570\u7684 Lean \u6a21\u5757\u6587\u4ef6\u6784\u5efa\u51fa\u53ef\u6267\u884c\u6587\u4ef6\u3002
\u8bed\u6cd5
lean_exe \u00abtarget-name\u00bb where\n -- \u914d\u7f6e\u9009\u9879\u4ece\u8fd9\u91cc\u5f00\u59cb\n
[[lean_exe]]\nname = \"\u00abtarget-name\u00bb\"\n# \u66f4\u591a\u914d\u7f6e\u9009\u9879\u4ece\u8fd9\u91cc\u5f00\u59cb\n
\u914d\u7f6e\u9009\u9879
srcDir
: \u5305\u76ee\u5f55\u4e0b\u7684\u5b50\u76ee\u5f55\uff0c\u5305\u542b\u53ef\u6267\u884c\u6587\u4ef6\u7684\u6e90\u6587\u4ef6\u3002\u9ed8\u8ba4\u503c\u4e3a\u5305\u7684 srcDir
\u3002\uff08\u8fd9\u5c06\u4f5c\u4e3a -R
\u9009\u9879\u4f20\u9012\u7ed9 lean
\u3002\uff09 root
: \u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u7684\u6839\u6a21\u5757\u540d\u3002\u5e94\u5305\u542b\u4e00\u4e2a main
\u5b9a\u4e49\uff0c\u5b83\u5c06\u4f5c\u4e3a\u7a0b\u5e8f\u7684\u5165\u53e3\u70b9\u3002\u901a\u8fc7\u9012\u5f52\u6784\u5efa\u5176\u672c\u5730\u5bfc\u5165\uff08\u5373\u5de5\u4f5c\u533a\u7684\u5176\u4ed6\u6a21\u5757\uff09\u6765\u6784\u5efa\u6839\u3002\u9ed8\u8ba4\u503c\u4e3a\u76ee\u6807\u540d\u79f0\u3002 exeName
: \u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u7684\u5b57\u7b26\u4e32\u540d\u79f0\u3002\u9ed8\u8ba4\u503c\u4e3a\u76ee\u6807\u540d\u79f0\uff0c\u4e14\u5176\u4e2d\u7684 .
\u66ff\u6362\u4e3a -
\u3002 extraDepTargets
: \u5728\u53ef\u6267\u884c\u6587\u4ef6\u6a21\u5757\u4e4b\u524d\u6784\u5efa\u7684 \u76ee\u6807 \u540d\u79f0\u6570\u7ec4\u3002 nativeFacets
: \u4e00\u4e2a\u51fd\u6570 (shouldExport : Bool) \u2192 Array
\uff0c\u786e\u5b9a\u5c06\u54ea\u4e9b \u6a21\u5757 facets \u6784\u5efa\u5e76\u94fe\u63a5\u5230\u53ef\u6267\u884c\u6587\u4ef6\u4e2d\u3002\u5982\u679c shouldExport
\u4e3a\u771f\uff0c\u6a21\u5757 facets \u5e94\u5bfc\u51fa\u7528\u6237\u53ef\u80fd\u671f\u671b\u5728\u5e93\u4e2d\u67e5\u627e\u7684\u4efb\u4f55\u7b26\u53f7\u3002\u4f8b\u5982\uff0cLean \u89e3\u91ca\u5668\u5c06\u4f7f\u7528\u94fe\u63a5\u5e93\u4e2d\u7684\u5bfc\u51fa\u7b26\u53f7\u3002\u9ed8\u8ba4\u503c\u4e3a Module.oExportFacet
\u7684\u5355\u4f8b\uff08\u5982\u679c shouldExport
\uff09\u6216 Module.oFacet
\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u4ece Lean \u6e90\u6587\u4ef6\u7f16\u8bd1\u7684\u76ee\u6807\u6587\u4ef6\uff0c\u53ef\u80fd\u5305\u542b\u5bfc\u51fa\u7684 Lean \u7b26\u53f7\u3002 supportInterpreter
: \u662f\u5426\u5c06\u53ef\u6267\u884c\u6587\u4ef6\u4e2d\u7684\u7b26\u53f7\u66b4\u9732\u7ed9 Lean \u89e3\u91ca\u5668\u3002\u8fd9\u5141\u8bb8\u53ef\u6267\u884c\u6587\u4ef6\u89e3\u91ca Lean \u6587\u4ef6\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 Lean.Elab.runFrontend
\uff09\u3002\u5728\u5b9e\u73b0\u65b9\u9762\uff0c\u5728 Windows \u4e0a\uff0cLean \u5171\u4eab\u5e93\u94fe\u63a5\u5230\u53ef\u6267\u884c\u6587\u4ef6\uff0c\u5176\u4ed6\u7cfb\u7edf\u4e0a\uff0c\u53ef\u6267\u884c\u6587\u4ef6\u4f7f\u7528 -rdynamic
\u8fdb\u884c\u94fe\u63a5\u3002\u8fd9\u4f1a\u589e\u52a0 Linux \u4e0a\u4e8c\u8fdb\u5236\u6587\u4ef6\u7684\u5927\u5c0f\uff0c\u5728 Windows \u4e0a\uff0c\u9700\u8981 libInit_shared.dll
\u548c libleanshared.dll
\u4e0e\u53ef\u6267\u884c\u6587\u4ef6\u5171\u540c\u5b9a\u4f4d\u6216\u4f5c\u4e3a PATH
\u7684\u4e00\u90e8\u5206\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 lake exe
\uff09\u3002\u56e0\u6b64\uff0c\u6b64\u529f\u80fd\u5e94\u4ec5\u5728\u5fc5\u8981\u65f6\u542f\u7528\u3002\u9ed8\u8ba4\u503c\u4e3a false
\u3002 platformIndependent
\u3001precompileModules
\u3001buildType
\u3001leanOptions
\u3001<more|weak><Lean|Leanc|Link>Args
\u3001moreServerOptions
\uff1a\u589e\u52a0\u5305\u7684\u76f8\u5e94\u914d\u7f6e\u9009\u9879\u3002\u53ef\u6267\u884c\u6587\u4ef6\u7684\u53c2\u6570\u5728\u5e93\u53c2\u6570\u4e4b\u540e\uff0c\u5982\u679c\u5e93\u6216\u5305\u90fd\u9884\u7f16\u8bd1\uff0c\u5219\u6a21\u5757\u4f1a\u88ab\u9884\u7f16\u8bd1\uff0cplatformIndependent
\u5728 none
\u60c5\u51b5\u4e0b\u4f1a\u56de\u9000\u5230\u5305\uff0c\u5e76\u4e14\u6784\u5efa\u7c7b\u578b\u662f\u4e24\u8005\u4e2d\u7684\u6700\u4f4e\u503c\uff08debug
\u662f\u6700\u4f4e\u7684\uff0c\u800c release
\u662f\u6700\u9ad8\u7684\uff09\u3002 "},{"location":"references/lake-doc/#_10","title":"\u5916\u90e8\u5e93","text":"\u5916\u90e8\u5e93\u76ee\u6807\u662f\u4e00\u4e2a\u975e Lean \u7684**\u9759\u6001**\u5e93\uff0c\u5c06\u94fe\u63a5\u5230\u5305\u53ca\u5176\u4f9d\u8d56\u9879\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\uff08\u4f8b\u5982\uff0c\u5b83\u4eec\u7684\u5171\u4eab\u5e93\u548c\u53ef\u6267\u884c\u6587\u4ef6\uff09\u3002
\u91cd\u8981: \u4e3a\u4e86\u5728 precompileModules
\u5f00\u542f\u65f6\u5916\u90e8\u5e93\u6b63\u786e\u94fe\u63a5\uff0c\u7531 extern_lib
\u76ee\u6807\u751f\u6210\u7684\u9759\u6001\u5e93\u5fc5\u987b\u9075\u5faa\u5e73\u53f0\u7684\u5e93\u547d\u540d\u7ea6\u5b9a\uff08\u5373\u5728 Windows \u4e0a\u547d\u540d\u4e3a foo.a
\uff0c\u5728 Unix \u4e0a\u547d\u540d\u4e3a libfoo.a
\uff09\u3002\u4e3a\u4e86\u7b80\u5316\u6b64\u64cd\u4f5c\uff0c\u53ef\u4ee5\u4f7f\u7528 Lake.nameToStaticLib
\u5b9e\u7528\u51fd\u6570\u5c06\u5e93\u540d\u79f0\u8f6c\u6362\u4e3a\u9002\u5408\u5e73\u53f0\u7684\u6b63\u786e\u6587\u4ef6\u540d\u79f0\u3002
\u8bed\u6cd5
extern_lib \u00abtarget-name\u00bb (pkg : NPackage _package.name) :=\n -- \u751f\u6210\u9759\u6001\u5e93\u7684\u6784\u5efa\u51fd\u6570\n
\u8be5\u58f0\u660e\u672c\u8d28\u4e0a\u662f\u56f4\u7ed5 System.FilePath
\u76ee\u6807 \u7684\u5305\u88c5\u3002\u7c7b\u4f3c\u4e8e\u8fd9\u6837\u7684\u76ee\u6807\uff0cpkg
\u53c2\u6570\u53ca\u5176\u7c7b\u578b\u8bf4\u660e\u662f\u53ef\u9009\u7684\uff0c\u4e3b\u4f53\u5e94\u4e3a\u7c7b\u578b FetchM (BuildJob System.FilePath)
\u7684\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u6784\u5efa\u9759\u6001\u5e93\u3002pkg
\u53c2\u6570\u7684\u7c7b\u578b\u4e3a NPackage _package.name
\uff0c\u4ee5\u786e\u51ff\u5730\u8868\u660e\u8fd9\u662f\u5b9a\u4e49\u5916\u90e8\u5e93\u7684\u5305\u3002
"},{"location":"references/lake-doc/#_11","title":"\u81ea\u5b9a\u4e49\u76ee\u6807","text":"\u53ef\u4ee5\u901a\u8fc7 lake build <target-name>
\u6784\u5efa\u7684\u4efb\u610f\u76ee\u6807\u3002
\u8bed\u6cd5
target \u00abtarget-name\u00bb (pkg : NPackage _package.name) : \u03b1 :=\n -- \u751f\u6210\u4e00\u4e2a `BuildJob \u03b1` \u7684\u6784\u5efa\u51fd\u6570\n
pkg
\u53c2\u6570\u53ca\u5176\u7c7b\u578b\u8bf4\u660e\u662f\u53ef\u9009\u7684\uff0c\u4e3b\u4f53\u5e94\u4e3a\u7c7b\u578b FetchM (BuildJob \u03b1)
\u7684\u8868\u8fbe\u5f0f\u3002pkg
\u53c2\u6570\u7684\u7c7b\u578b\u4e3a NPackage _package.name
\uff0c\u4ee5\u786e\u51ff\u5730\u8868\u660e\u8fd9\u662f\u5b9a\u4e49\u8be5\u76ee\u6807\u7684\u5305\u3002
"},{"location":"references/lake-doc/#facet","title":"\u5b9a\u4e49\u65b0 facet","text":"Lake \u5305\u4e5f\u53ef\u4ee5\u4e3a\u5305\u3001\u6a21\u5757\u548c\u5e93\u5b9a\u4e49\u65b0\u7684 facet\u3002\u5b9a\u4e49\u540e\uff0c\u65b0 facet\uff08\u4f8b\u5982 facet
\uff09\u53ef\u4ee5\u5728\u5176\u7c7b\u578b\u7684\u4efb\u4f55\u5f53\u524d\u6216\u672a\u6765\u5bf9\u8c61\u4e0a\u6784\u5efa\uff08\u4f8b\u5982\uff0c\u901a\u8fc7 lake build pkg:facet
\u8fdb\u884c\u5305 facet \u7684\u6784\u5efa\uff09\u3002\u6a21\u5757 facet \u4e5f\u53ef\u4ee5\u63d0\u4f9b\u7ed9 LeanLib.nativeFacets
\u4ee5\u4fbf\u5728\u751f\u6210\u5171\u4eab\u5e93\u65f6\u7531 Lake \u81ea\u52a8\u6784\u5efa\u548c\u4f7f\u7528\u3002
\u8bed\u6cd5
package_facet \u00abfacet-name\u00bb (pkg : Package) : \u03b1 :=\n -- \u751f\u6210\u4e00\u4e2a `BuildJob \u03b1` \u7684\u6784\u5efa\u51fd\u6570\n\nmodule_facet \u00abfacet-name\u00bb (mod : Module) : \u03b1 :=\n -- \u751f\u6210\u4e00\u4e2a `BuildJob \u03b1` \u7684\u6784\u5efa\u51fd\u6570\n\nlibrary_facet \u00abfacet-name\u00bb (lib : LeanLib) : \u03b1 :=\n -- \u751f\u6210\u4e00\u4e2a `BuildJob \u03b1` \u7684\u6784\u5efa\u51fd\u6570\n
\u5728\u8fd9\u4e9b\u5b9a\u4e49\u4e2d\uff0c\u76ee\u6807\u53c2\u6570\u53ca\u5176\u7c7b\u578b\u8bf4\u660e\u662f\u53ef\u9009\u7684\uff0c\u4e3b\u4f53\u5e94\u4e3a\u7c7b\u578b FetchM (BuildJob \u03b1)
\u7684\u8868\u8fbe\u5f0f\u3002
"},{"location":"references/lake-doc/#_12","title":"\u6dfb\u52a0\u4f9d\u8d56","text":"Lake \u5305\u53ef\u6dfb\u52a0\u4f9d\u8d56\u3002\u4f9d\u8d56\u662f\u5f53\u524d\u5305\u4e3a\u4e86\u8fd0\u884c\u6240\u9700\u8981\u7684\u5176\u4ed6 Lake \u5305\u3002\u5b83\u4eec\u53ef\u4ee5\u76f4\u63a5\u6765\u81ea\u672c\u5730\u6587\u4ef6\u5939\uff08\u5982\u5305\u7684\u5b50\u76ee\u5f55\uff09\uff0c\u4e5f\u53ef\u4ee5\u6765\u81ea\u8fdc\u7a0b Git \u4ed3\u5e93\u3002\u4f8b\u5982\uff0c\u4f60\u53ef\u4ee5\u8fd9\u6837\u6dfb\u52a0 mathlib \u4f9d\u8d56\uff1a
package hello\n\nrequire \"leanprover-community\" / \"mathlib\"\n
\u4e0b\u6b21\u8fd0\u884c lake build
\uff08\u6216\u662f\u7528 VSCode \u4e00\u7c7b\u7684\u7f16\u8f91\u5668\u5237\u65b0\u4f9d\u8d56\uff09\u65f6\u5c06\u4f1a\u514b\u9686\u5e76\u6784\u5efa mathlib \u4ed3\u5e93\u3002\u514b\u9686\u7684\u7279\u5b9a\u7248\u672c\u7684\u4fe1\u606f\u5c06\u5b58\u5165 lake-manifest.json
\u4ee5\u786e\u4fdd\u53ef\u590d\u73b0\u6027\uff08\u5373\u4fdd\u8bc1\u672a\u6765\u7684\u6784\u5efa\u4f7f\u7528\u540c\u4e00\u7248\u672c\u7684 mathlib\uff09\u3002\u5728\u8fd9\u4e4b\u540e\u5982\u679c\u60f3\u8981\u66f4\u65b0 mathlib
\uff0c\u4f60\u9700\u8981\u4f7f\u7528 lake update
\u2014\u2014 \u5176\u5b83\u7684\u547d\u4ee4\u90fd\u5c06\u4e0d\u4f1a\u66f4\u65b0\u5df2\u89e3\u6790\u7684\u4f9d\u8d56\u3002
\u5bf9\u4e8e\u4f9d\u8d56 mathlib
\u7684\u5b9a\u7406\u8bc1\u660e\u5305\uff0c\u4f60\u4e5f\u53ef\u4ee5\u7528 lake new <package-name> math
\u76f4\u63a5\u521b\u5efa\u5e26\u6709 mathlib \u4f9d\u8d56\u7684\u5305\u914d\u7f6e\uff08\u4e14\u65e0\u4e8c\u8fdb\u5236\u53ef\u6267\u884c\u6587\u4ef6\u76ee\u6807\uff09\u3002
\u6ce8\u610f\uff1a \u5bf9\u4e8e mathlib \u800c\u8a00\uff0c\u5728\u6dfb\u52a0\u6216\u5347\u7ea7\u5176\u4f5c\u4e3a\u4f9d\u8d56\u540e\uff0c\u4f60\u8fd8\u9700\u8981\u5728 lake build
\u4e4b\u524d\u4f7f\u7528 lake exe cache get
\u3002\u5426\u5219\u6784\u5efa\u5c06\u4ece\u96f6\u5f00\u59cb\uff08\u8017\u65f6\u6570\u5c0f\u65f6\uff09\u3002\u53c2\u9605 mathlib wiki \u9875\u9762 \u83b7\u53d6\u66f4\u591a\u4fe1\u606f\u3002
"},{"location":"references/lake-doc/#lean-require","title":"Lean require
","text":"Lean \u7684 Lake \u914d\u7f6e\u6587\u4ef6\u4e2d require
\u547d\u4ee4\u7684\u57fa\u672c\u8bed\u6cd5\u5982\u4e0b\uff1a
require [\"<scope>\" /] <pkg-name> [@ <version>]\n [from <source>] [with <options>]\n
from
\u4ece\u53e5\u544a\u77e5 Lake \u4f9d\u8d56\u7684\u5730\u5740\u3002\u6ca1\u6709 from
\u4ece\u53e5\uff0cLake \u5c06\u4ece\u9ed8\u8ba4\u6ce8\u518c\u8868\uff08\u4f8b\u5982 Reservoir\uff09\u4e2d\u67e5\u627e\u5305\uff0c\u5e76\u4f7f\u7528\u83b7\u5f97\u7684\u4fe1\u606f\u4e0b\u8f7d\u6307\u5b9a version
\u7684\u5305\u3002\u53ef\u9009\u7684 scope
\u7528\u6765\u6d88\u9664\u540c\u540d\u5305\u7684\u6b67\u4e49\u3002\u5728 Reservoir \u4e2d\uff0cscope \u90e8\u5206\u662f\u5305\u7684\u6240\u6709\u8005\uff08\u4f8b\u5982\uff0c@leanprover/doc-gen4 \u4e2d\u7684 leanprover
\uff09\u3002
with
\u5b50\u53e5\u6307\u5b9a\u7528\u4e8e\u914d\u7f6e\u4f9d\u8d56\u9879\u7684 Lake \u9009\u9879\u7684 NameMap String
\u3002\u8fd9\u76f8\u5f53\u4e8e\u5728\u547d\u4ee4\u884c\u4e2d\u5c06 -K
\u9009\u9879\u4f20\u9012\u7ed9\u4f9d\u8d56\u9879\u3002
"},{"location":"references/lake-doc/#_13","title":"\u53d7\u652f\u6301\u7684\u6e90","text":"\u5728 from
\u5b50\u53e5\u4e2d\uff0cLake \u652f\u6301\u4e0b\u5217\u4f9d\u8d56\u6e90\u3002
"},{"location":"references/lake-doc/#_14","title":"\u8def\u5f84\u4f9d\u8d56","text":"from <path>\n
Lake \u5c06\u4ece path
\u76ee\u5f55\uff08\u76f8\u5bf9\u4e8e\u6240\u4f9d\u8d56\u5305\u7684\u76ee\u5f55\uff09\u4e2d\u52a0\u8f7d\u5305\u3002
"},{"location":"references/lake-doc/#git","title":"Git \u4f9d\u8d56","text":"from git <url> [@ <rev>] [/ <subDir>]\n
Lake \u4ece\u56fa\u5b9a\u7684 url
\u4e2d\u514b\u9686 Git \u4ed3\u5e93\uff0c\u5e76 checkout \u5230\u6307\u5b9a\u7684 rev
\u3002\u5176\u4e2d rev
\u53ef\u4ee5\u662f commit hash\u3001branch \u6216 tag\u3002\u5982\u679c\u90fd\u6ca1\u6709\u6307\u5b9a\uff0cLake \u5c06\u4f7f\u7528\u9ed8\u8ba4\u7684 master
\u5206\u652f\u3002checkout \u4e4b\u540e\uff0cLake \u5c06\u4ece\u5b50\u76ee\u5f55 subDir
\u4e2d\u52a0\u8f7d\u5305\uff08\u5982\u679c\u672a\u6307\u5b9a\u5b50\u76ee\u5f55\uff0c\u5219\u4ece\u4ed3\u5e93\u6839\u76ee\u5f55\u52a0\u8f7d\uff09\u3002
"},{"location":"references/lake-doc/#toml-require","title":"TOML require
","text":"\u8981\u5728 TOML \u914d\u7f6e\u6587\u4ef6\u4e2d require
\u4e00\u4e2a\u5305\uff0c\u5176\u7b49\u4ef7\u8bed\u6cd5\u5982\u4e0b\uff1a
# A Reservoir dependency\n[[require]]\nname = \"<pkg-name>\"\nscope = \"<scope>\"\nversion = \"<version>\"\noptions = {<options>}\n\n# A path dependency\n[[require]]\nname = \"<pkg-name>\"\npath = \"<path>\"\n\n# A Git dependency\n[[require]]\nname = \"<pkg-name>\"\ngit = \"<url>\"\nrev = \"<rev>\"\nsubDir = \"<subDir>\"\n
"},{"location":"references/lake-doc/#github","title":"GitHub \u53d1\u5e03\u6784\u5efa","text":"Lake \u652f\u6301\u5c06\u6784\u5efa\u4ea7\u7269\uff08\u5373\u5df2\u5f52\u6863\u7684\u6784\u5efa\u76ee\u5f55\uff09\u4e0a\u4f20\u5230 GitHub \u53d1\u5e03\u7248\u672c\uff0c\u6216\u4ece\u4e2d\u4e0b\u8f7d\u3002\u8fd9\u4f7f\u5f97\u7ec8\u7aef\u7528\u6237\u53ef\u4ee5\u4ece\u4e91\u7aef\u83b7\u53d6\u9884\u6784\u5efa\u7684\u4ea7\u7269\uff0c\u800c\u65e0\u9700\u81ea\u5df1\u4ece\u6e90\u7801\u91cd\u5efa\u5305\u3002
"},{"location":"references/lake-doc/#_15","title":"\u4e0b\u8f7d","text":"\u8981\u4e0b\u8f7d\u4ea7\u7269\uff0c\u7528\u6237\u5e94\u914d\u7f6e\u5305\u7684 \u9009\u9879releaseRepo?
\u548c buildArchive?
\uff0c\u6307\u5411\u6258\u7ba1\u53d1\u5e03\u7684 GitHub \u4ed3\u5e93\u53ca\u5176\u4e2d\u7684\u6b63\u786e\u4ea7\u7269\u540d\u79f0\uff08\u5982\u679c\u9ed8\u8ba4\u8bbe\u7f6e\u4e0d\u591f\uff09\u3002\u7136\u540e\uff0c\u8bbe\u7f6e preferReleaseBuild := true
\u4ee5\u544a\u77e5 Lake \u83b7\u53d6\u5e76\u89e3\u538b\u5b83\u4f5c\u4e3a\u989d\u5916\u7684\u5305\u4f9d\u8d56\u9879\u3002
Lake \u4ec5\u5728\u5176\u6807\u51c6\u6784\u5efa\u8fc7\u7a0b\u4e2d\u624d\u4f1a\u83b7\u53d6\u53d1\u5e03\u6784\u5efa\uff0c\u5982\u679c\u9700\u8981\u7684\u5305\u662f\u4f9d\u8d56\u9879\uff08\u56e0\u4e3a\u6839\u5305\u901a\u5e38\u4f1a\u88ab\u4fee\u6539\uff0c\u56e0\u6b64\u4e0d\u5e38\u4e0e\u6b64\u65b9\u6848\u517c\u5bb9\uff09\u3002\u7136\u800c\uff0c\u5982\u679c\u5e0c\u671b\u83b7\u53d6\u6839\u5305\u7684\u53d1\u5e03\uff08\u4f8b\u5982\uff0c\u5728\u514b\u9686\u53d1\u5e03\u7684\u6e90\u7801\u540e\u4f46\u5728\u7f16\u8f91\u4e4b\u524d\uff09\uff0c\u53ef\u4ee5\u901a\u8fc7 lake build :release
\u624b\u52a8\u6267\u884c\u6b64\u64cd\u4f5c\u3002
Lake \u5185\u90e8\u4f7f\u7528 curl
\u4e0b\u8f7d\u53d1\u5e03\uff0c\u5e76\u4f7f\u7528 tar
\u89e3\u538b\u7f29\u5b83\uff0c\u56e0\u6b64\u7ec8\u7aef\u7528\u6237\u5fc5\u987b\u5b89\u88c5\u8fd9\u4e24\u79cd\u5de5\u5177\u624d\u80fd\u4f7f\u7528\u6b64\u529f\u80fd\u3002\u5982\u679c Lake \u7531\u4e8e\u4efb\u4f55\u539f\u56e0\u65e0\u6cd5\u83b7\u53d6\u53d1\u5e03\uff0c\u5b83\u5c06\u8f6c\u800c\u4ece\u6e90\u7801\u6784\u5efa\u3002\u53e6\u5916\u8bf7\u6ce8\u610f\uff0c\u6b64\u673a\u5236\u5728\u6280\u672f\u4e0a\u4e0d\u4ec5\u9650\u4e8e GitHub\uff0c\u4efb\u4f55\u4f7f\u7528\u76f8\u540c URL \u65b9\u6848\u7684 Git \u4e3b\u673a\u4e5f\u53ef\u4ee5\u4f7f\u7528\u3002
"},{"location":"references/lake-doc/#_16","title":"\u4e0a\u4f20","text":"\u8981\u5c06\u6784\u5efa\u7684\u5305\u4f5c\u4e3a\u4ea7\u7269\u4e0a\u4f20\u5230 GitHub \u53d1\u5e03\uff0cLake \u63d0\u4f9b\u4e86\u4e00\u4e2a\u4fbf\u6377\u7684\u7b80\u5199\u547d\u4ee4 lake upload <tag>
\u3002\u6b64\u547d\u4ee4\u4f7f\u7528 tar
\u5c06\u5305\u7684\u6784\u5efa\u76ee\u5f55\u6253\u5305\u6210\u6863\u6848\uff0c\u5e76\u4f7f\u7528 gh release upload
\u5c06\u5176\u9644\u52a0\u5230 tag
\u5bf9\u5e94\u7684\u9884\u5148\u5b58\u5728\u7684 GitHub \u53d1\u5e03\u7248\u672c\u4e2d\u3002\u56e0\u6b64\uff0c\u4e3a\u4e86\u4f7f\u7528\u5b83\uff0c\u5305\u4e0a\u4f20\u8005\uff08\u4f46\u4e0d\u662f\u4e0b\u8f7d\u8005\uff09\u9700\u8981\u5b89\u88c5 gh
\uff0c\u5373 GitHub CLI\uff0c\u5e76\u5c06\u5176\u6dfb\u52a0\u5230 PATH
\u3002
"},{"location":"references/lake-doc/#_17","title":"\u7f16\u5199\u53ca\u8fd0\u884c\u811a\u672c","text":"\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e5f\u53ef\u80fd\u5305\u542b scripts
\u58f0\u660e\u3002\u811a\u672c\u662f\u4efb\u610f\u7684 (args : List String) \u2192 ScriptM UInt32
\u7c7b\u578b\u7684\u5b9a\u4e49\uff0c\u53ef\u4ee5\u901a\u8fc7 lake script run
\u6765\u8fd0\u884c\u3002\u4f8b\u5982\u4ee5\u4e0b\u7684 lakefile.lean
\uff1a
import Lake\nopen Lake DSL\n\npackage scripts\n\n/--\nDisplay a greeting\n\nUSAGE:\n lake run greet [name]\n\nGreet the entity with the given name. Otherwise, greet the whole world.\n-/\nscript greet (args) do\n if h : 0 < args.length then\n IO.println s!\"Hello, {args[0]'h}!\"\n else\n IO.println \"Hello, world!\"\n return 0\n
\u811a\u672c greet
\u53ef\u4ee5\u8fd9\u6837\u8fd0\u884c\uff1a
$ lake script run greet\nHello, world!\n$ lake script run greet me\nHello, me!\n
\u4f60\u53ef\u4ee5\u7528 lake script doc
\u8f93\u51fa\u4e00\u4e2a\u811a\u672c\u7684 docstring\uff1a
$ lake script doc greet\nDisplay a greeting\n\nUSAGE:\n lake run greet [name]\n\nGreet the entity with the given name. Otherwise, greet the whole world.\n
"},{"location":"references/lake-doc/#lake_2","title":"\u4ece\u6e90\u7801\u6784\u5efa\u5e76\u8fd0\u884c Lake","text":"\u5982\u679c\u4f60\u5df2\u7ecf\u5b89\u88c5\u4e86\u5e26\u6709 lake
\u7684 Lean\uff0c\u53ef\u4ee5\u76f4\u63a5\u7528 lake build
\u6784\u5efa\u4e00\u4e2a\u65b0\u7684 lake
\u3002
\u6216\u8005\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u5df2\u9884\u6253\u5305\u7684 build.sh
\u811a\u672c\u6765\u6784\u5efa Lake\u3002\u5b83\u5c06\u53c2\u6570\u4f20\u9012\u7ed9 make
\u547d\u4ee4\u3002\u6240\u4ee5\uff0c\u5982\u679c\u4f60\u7684\u5904\u7406\u5668\u652f\u6301\u591a\u6838\u5fc3\uff0c\u53ef\u4ee5\u4f7f\u7528 -jX
\u9009\u9879\u6307\u5b9a\u5e0c\u671b\u5e76\u884c\u8fd0\u884c\u7684\u6784\u5efa\u4efb\u52a1\u6570\u3002\u4f8b\u5982\uff1a
$ ./build.sh -j4\n
\u6784\u5efa\u540e\uff0clake
\u4e8c\u8fdb\u5236\u6587\u4ef6\u5c06\u4f4d\u4e8e .lake/build/bin/lake
\u4e2d\uff0c\u800c\u5e93\u7684 .olean
\u6587\u4ef6\u5c06\u4f4d\u4e8e .lake/build/lib
\u4e0b\u3002
"},{"location":"references/lake-doc/#nix-flakes","title":"\u4f7f\u7528 Nix Flakes \u6784\u5efa","text":"Lake \u662f Lean 4 flake \u7684\u4e00\u90e8\u5206\uff0c\u5728\u4ed3\u5e93\u6839\u76ee\u5f55\u4e0b\u6784\u5efa\u3002
"},{"location":"references/lake-doc/#lake_3","title":"\u589e\u5f3a Lake \u7684\u641c\u7d22\u8def\u5f84","text":"lake
\u53ef\u6267\u884c\u6587\u4ef6\u9700\u8981\u77e5\u9053\u5728\u5305\u914d\u7f6e\u6587\u4ef6\u4e2d\u4f7f\u7528\u7684\u6a21\u5757\u7684 Lean \u5e93\u6587\u4ef6\uff08\u4f8b\u5982 .olean
, .ilean
\uff09\u5728\u54ea\u91cc\uff08\u4ee5\u53ca\u7f16\u8f91\u5668\u4e2d go-to-definition \u652f\u6301\u7684\u6e90\u6587\u4ef6\uff09\u3002Lake \u5c06\u57fa\u4e8e\u81ea\u8eab\u53ef\u6267\u884c\u6587\u4ef6\u548c lean
\u7684\u4f4d\u7f6e\u667a\u80fd\u5730\u8bbe\u7f6e\u521d\u59cb\u641c\u7d22\u8def\u5f84\u3002
\u5177\u4f53\u800c\u8a00\uff0c\u5982\u679c Lake \u4e0e lean
\u4f4d\u4e8e\u540c\u4e00\u4f4d\u7f6e\uff08\u5373\u4e0e lake
\u5728\u540c\u4e00\u76ee\u5f55\u4e0b\u6709 lean
\u53ef\u6267\u884c\u6587\u4ef6\uff09\uff0c\u5b83\u5c06\u5047\u5b9a\u5b83\u662f\u4e0e Lean \u4e00\u8d77\u5b89\u88c5\u7684\uff0c\u5e76\u4e14 Lean \u548c Lake \u4f4d\u4e8e\u5176\u5171\u4eab\u7684 sysroot \u4e0b\u3002\u5177\u4f53\u6765\u8bf4\uff0c\u5b83\u4eec\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\u4f4d\u4e8e <sysroot>/bin
\uff0c\u5b83\u4eec\u7684 Lean \u5e93\u6587\u4ef6\u4f4d\u4e8e <sysroot>/lib/lean
\uff0cLean \u7684\u6e90\u6587\u4ef6\u4f4d\u4e8e <sysroot>/src/lean
\uff0c\u800c Lake \u7684\u6e90\u6587\u4ef6\u4f4d\u4e8e <sysroot>/src/lean/lake
\u3002\u5426\u5219\uff0c\u5b83\u5c06\u8fd0\u884c lean --print-prefix
\u4ee5\u627e\u5230 Lean \u7684 sysroot\uff0c\u5e76\u5047\u5b9a Lean \u7684\u6587\u4ef6\u5982\u524d\u6240\u8ff0\uff0c\u800c lake
\u4f4d\u4e8e <lake-home>/.lake/build/bin/lake
\uff0c\u5176 Lean \u5e93\u6587\u4ef6\u4f4d\u4e8e <lake-home>/.lake/build/lib
\uff0c\u5176\u6e90\u6587\u4ef6\u76f4\u63a5\u4f4d\u4e8e <lake-home>
\u3002
\u53ef\u4ee5\u901a\u8fc7\u5728 LEAN_PATH
\u73af\u5883\u53d8\u91cf\u4e2d\u5305\u542b\u5176\u4ed6 Lean \u5e93\u76ee\u5f55\uff08\u4ee5\u53ca\u5728 LEAN_SRC_PATH
\u4e2d\u7684\u6e90\u6587\u4ef6\u76ee\u5f55\uff09\u6765\u589e\u5f3a\u6b64\u641c\u7d22\u8def\u5f84\u3002\u8fd9\u5141\u8bb8\u7528\u6237\u5728 Lean \u7684\u6587\u4ef6\uff08\u6216 Lake \u672c\u8eab\uff09\u4f4d\u4e8e\u975e\u6807\u51c6\u4f4d\u7f6e\u65f6\u66f4\u6b63 Lake \u7684\u641c\u7d22\u8def\u5f84\u3002\u7136\u800c\uff0c\u8fd9\u4e9b\u76ee\u5f55\u4e0d\u4f1a\u4f18\u5148\u4e8e\u521d\u59cb\u641c\u7d22\u8def\u5f84\u3002\u8fd9\u5728\u5f00\u53d1\u671f\u95f4\u5f88\u91cd\u8981\uff0c\u56e0\u4e3a\u8fd9\u53ef\u4ee5\u9632\u6b62\u7528\u4e8e\u6784\u5efa Lake \u7684 Lake \u7248\u672c\u4f7f\u7528\u6b63\u5728\u6784\u5efa\u7684 Lake \u7248\u672c\u7684 Lean \u5e93\uff08\u800c\u4e0d\u662f\u5b83\u81ea\u5df1\u7684\uff09\u6765\u8be6\u7ec6\u8bf4\u660e Lake \u7684 lakefile.lean
\uff08\u8fd9\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5404\u79cd\u9519\u8bef\uff09\u3002
"},{"location":"tutorial/elan-lake/","title":"Lean \u5de5\u5177\u94fe\u4f7f\u7528\u6307\u5357","text":"\u4e0a\u7bc7\u5b89\u88c5 Lean4 \u63d0\u5230\u4e86 Lean \u9879\u76ee\u5f00\u53d1\u7684\u4e09\u4ef6\u5957\uff1a\u7248\u672c\u7ba1\u7406\u5668 elan + \u5305\u7ba1\u7406\u5668\u548c\u6784\u5efa\u5de5\u5177 lake + \u8bed\u8a00\u672c\u8eab\u7684\u6838\u5fc3\u7ec4\u4ef6 lean\u3002\u4e0b\u8fb9\u5206\u522b\u4ecb\u7ecd\u8fd9\u4e09\u4e2a\u5de5\u5177\u7684\u57fa\u672c\u7528\u6cd5\u3002
\u8fd9\u7c7b\u8bbe\u8ba1\u4e0e\u5176\u4ed6\u7f16\u7a0b\u8bed\u8a00\u7c7b\u4f3c\uff0c\u5982 Rust\uff08rustup + cargo + rustc\uff09\u6216 Node.js\uff08nvm + npm + node\uff09\u3002
"},{"location":"tutorial/elan-lake/#elan","title":"elan \u5e38\u7528\u529f\u80fd","text":"elan \u662f Lean \u7248\u672c\u7ba1\u7406\u5668\uff0c\u7528\u4e8e\u5b89\u88c5\u3001\u7ba1\u7406\u548c\u5207\u6362\u4e0d\u540c\u7248\u672c\u7684 Lean\u3002
\u7248\u672c\u7ba1\u7406\uff1a
elan --version # \u8f93\u51fa\u7248\u672c\u53f7\u6765\u6d4b\u8bd5\u5b89\u88c5\u662f\u5426\u6210\u529f\nelan self update # \u66f4\u65b0 elan\nelan show # \u663e\u793a\u5df2\u5b89\u88c5\u7684 Lean \u7248\u672c\n\n# \u4e0b\u8f7d\u6307\u5b9a Lean \u7248\u672c\uff0c\u6240\u6709\u7248\u672c\u53ef\u89c1 https://github.com/leanprover/lean4/releases\nelan install leanprover/lean4:v4.10.0\n\n# \u4e0b\u8f7d\u6700\u65b0\u7a33\u5b9a\u7248\u672c stable\nelan default leanprover/lean4:stable \n\n# \u5207\u6362\u9ed8\u8ba4\u7684 Lean \u7248\u672c\n# \u5207\u6362\u5230 leanprover/lean4:v4.11.0-rc1 \nelan default leanprover/lean4:v4.11.0-rc1 \n\n# \u8bbe\u7f6e\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u4f7f\u7528\u7684 Lean \u7248\u672c\nelan override set leanprover/lean4:stable\n# info: info: override toolchain for 'xxx' set to 'leanprover/lean4:stable'\n
\u6307\u5b9a\u7248\u672c\u8fd0\u884c lake
\u6216 lean
\u547d\u4ee4\uff1a
lake --version # \u4f7f\u7528 elan \u9ed8\u8ba4\u7248\u672c\n# \u4f7f\u7528\u6307\u5b9a\u7248\u672c\nelan run leanprover/lean4:v4.10.0 lake --version\nelan run leanprover/lean4:v4.10.0 lean --version\n# \u521b\u5efa\u6307\u5b9a\u7248\u672c\u7684\u9879\u76ee\nelan run leanprover/lean4:v4.10.0 lake new package\n
elan \u914d\u7f6e\u8bb0\u5f55\u53ef\u4ee5\u5728 ~/.elan/settings.toml
\u67e5\u770b\u3002
\u5177\u4f53\u5730\uff0cWindows \u4e0b\u7684 elan \u7ba1\u7406\u76ee\u5f55\u4e3a %USERPROFILE%\\.elan\\bin
\uff0cLinux/Mac \u4e0b\u7684\u7ba1\u7406\u76ee\u5f55\u4e3a $HOME/.elan
\uff0c\u5185\u5bb9\u5f62\u5982
\u276f tree .elan -L 2\n.elan\n\u251c\u2500\u2500 bin\n\u2502 \u251c\u2500\u2500 elan\n\u2502 \u251c\u2500\u2500 lake\n\u2502 \u251c\u2500\u2500 lean\n\u2502 \u251c\u2500\u2500 leanc\n\u2502 \u251c\u2500\u2500 leanchecker\n\u2502 \u251c\u2500\u2500 leanmake\n\u2502 \u2514\u2500\u2500 leanpkg\n\u251c\u2500\u2500 env\n\u251c\u2500\u2500 settings.toml\n\u251c\u2500\u2500 tmp\n\u251c\u2500\u2500 toolchains\n\u2502 \u2514\u2500\u2500 stable\n\u2514\u2500\u2500 update-hashes\n \u2514\u2500\u2500 stable\n
\u6587\u4ef6\u8bf4\u660e\uff1a
toolchains
\u5b58\u653e\u4e0b\u8f7d\u7684\u5404\u4e2a Lean \u7248\u672c settings.toml
\u662f elan \u7684\u914d\u7f6e\u6587\u4ef6\u3002 bin
\u5b58\u653e\u5e38\u7528\u7684\u4e8c\u8fdb\u5236\u6587\u4ef6\uff0c\u6bd4\u5982 lake
\u3002 "},{"location":"tutorial/elan-lake/#lake","title":"Lake \u57fa\u672c\u7528\u6cd5","text":"lake \u5168\u79f0 Lean Make\uff0c\u662f Lean 4 \u7684\u5305\u7ba1\u7406\u5668\uff0c\u7528\u4e8e\u521b\u5efa Lean \u9879\u76ee\uff0c\u6784\u5efa Lean \u5305\u548c\u7f16\u8bd1 Lean \u53ef\u6267\u884c\u6587\u4ef6\u3002
\u672c\u8282\u4ecb\u7ecd lake
\u7684\u57fa\u672c\u7528\u6cd5\uff0cLean \u51fd\u6570\u5f0f\u7f16\u7a0b\u4e5f\u63d0\u4f9b\u4e86\u521b\u5efa Lean \u9879\u76ee\u7684\u4f8b\u5b50\uff0c\u800c\u66f4\u5168\u9762\u7684\u53c2\u6570\u4ecb\u7ecd\u53ef\u53c2\u8003 lake \u6587\u6863\u3002
\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\uff08your_project_name
\u66ff\u6362\u4e3a\u4f60\u81ea\u5df1\u8d77\u7684\u540d\u5b57\uff09
lake new your_project_name\n\n# \u6216\u8005\u624b\u52a8\u521b\u5efa\u4e00\u4e2a\u65b0\u6587\u4ef6\u5939\u5e76\u5728\u539f\u5730\u5efa\u7acb\u9879\u76ee\nmkdir your_folder_name && cd your_folder_name && lake init your_project_name\n
\u4ee5\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a your_project_name
\u7684\u7a7a\u767d\u65b0\u9879\u76ee\u3002\u8fd9\u4e2a\u9879\u76ee\u7684\u5185\u5bb9\u5f62\u5982
your_project_name\n\u251c\u2500\u2500 YourProjectName\n\u2502 \u2514\u2500\u2500 Basic.lean\n\u251c\u2500\u2500 lakefile.lean\n\u251c\u2500\u2500 lean-toolchain\n\u251c\u2500\u2500 Main.lean\n\u251c\u2500\u2500 YourProjectName.lean\n\u2514\u2500\u2500 ...\n
\u5176\u4e2d lakefile.lean
\u662f\u5f53\u524d\u9879\u76ee\u7684\u914d\u7f6e\u6587\u4ef6\uff0clean-toolchain
\u662f\u5f53\u524d\u9879\u76ee\u4f7f\u7528\u7684 Lean \u7248\u672c\u3002
\u521d\u6b21\u8ba9 Lean Server \u8fd0\u884c\u8be5\u9879\u76ee\u65f6\u4f1a\u6dfb\u52a0
\u251c\u2500\u2500 .lake\n \u251c\u2500\u2500 lakefile.olean.trace\n \u2514\u2500\u2500 ...\n\u251c\u2500\u2500 lake-manifest.json\n
\u5982\u679c\u4f60\u60f3\u5728\u8fd9\u4e2a\u73b0\u6709\u7684\u5de5\u7a0b\u4e2d\u5f15\u7528 Mathlib4\uff0c\u4f60\u9700\u8981\u5728 lakefile.lean
\u6587\u4ef6\u5c3e\u4e2d\u52a0\u5165
require mathlib from git\n \"https://github.com/leanprover-community/mathlib4\"\n
\u4fdd\u5b58\u6587\u4ef6\u540e VS code \u4f1a\u63d0\u793a \"Restart Lean\"\uff0c\u70b9\u4e0d\u70b9\u90fd\u6ca1\u5173\u7cfb\u3002
\u4e0b\u9762\u8981\u4e0b\u8f7d Mathlib\uff0c\u6ce8\u610f\u8ba9\u7ec8\u7aef\u8def\u5f84\u5728\u4f60\u7684\u9879\u76ee\u6587\u4ef6\u5939\u4e0b\u3002\u5982\u679c\u4f60\u7684\u7f51\u7edc\u60c5\u51b5\u597d\uff0c\u90a3\u4e48\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c
curl -L https://raw.githubusercontent.com/leanprover-community/mathlib4/master/lean-toolchain -o lean-toolchain\nlake update\n
\u4fdd\u5b58\u8fd0\u884c\u7f13\u5b58\u4f1a\u8ba9\u6bcf\u6b21\u7f16\u8bd1\u8282\u7701\u4e00\u4e24\u4e2a\u5c0f\u65f6\uff0c\u4f46\u5b83\u5f53\u7136\u4e5f\u4e0d\u662f\u5fc5\u987b\u7684\uff1a
lake exe cache get\n
\u5426\u5219\uff08\u4f1a\u76f8\u5f53\u8270\u96be\uff09\uff0c\u53c2\u8003\u8fd9\u4e2a\u89e3\u51b3\u65b9\u6848\u3002\uff08\u4e0d\u4fdd\u8bc1\u8be5\u53c2\u8003\u65b9\u6848\u7684\u53ef\u9760\u6027\uff09
\u5982\u679c\u4f60\u770b\u5230\u7ec8\u7aef\u4e2d\u663e\u793a\u4e86\u7c7b\u4f3c\u5982\u4e0b\u7684\u63d0\u793a\uff1a
Decompressing 1234 file(s)\nunpacked in 12345 ms\n
\u540c\u65f6\u4f60\u7684\u9879\u76ee\u6587\u4ef6\u5939\u4e2d\u51fa\u73b0\u4e86 .lake\\packages
\u6587\u4ef6\u5939\uff0c\u90a3\u4e48\u8bc1\u660e\u4f60\u5b89\u88c5 Mathlib \u6210\u529f\u4e86\uff0c\u6b64\u65f6 \"Restart Lean\" \u5373\u53ef\u4f7f\u7528\u3002\u6ce8\u610f\uff1a\u4f60\u8981\u5728\u9879\u76ee\u6240\u5728\u7684\u76ee\u5f55\u4e2d\u8fd0\u884c VS code\uff0c\u624d\u80fd\u8ba9 Lean \u4f7f\u7528Mathlib\u3002
\u8fd9\u91cc\u63d0\u4f9b\u4e00\u4e2a\u5b9e\u4f8b\u6765\u6d4b\u8bd5\u4f60\u7684\u5b89\u88c5\uff1a
import Mathlib.Data.Real.Basic\nexample (a b : \u211d) : a * b = b * a := by\n rw [mul_comm a b]\n
\u5982\u679c\u4f60\u7684 Lean infoview \u6ca1\u6709\u4efb\u4f55\u62a5\u9519\uff0c\u5e76\u4e14\u5149\u6807\u653e\u5728\u6587\u4ef6\u6700\u540e\u4e00\u884c\u65f6\u4f1a\u63d0\u793a \"No goals\"\uff0c\u8bc1\u660e\u4f60\u7684 Mathlib \u5df2\u7ecf\u6b63\u786e\u5b89\u88c5\u4e86\u3002
\u5982\u679c\u4f60\u60f3\u66f4\u65b0 Mathlib\uff0c\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c
curl -L https://raw.githubusercontent.com/leanprover-community/mathlib4/master/lean-toolchain -o lean-toolchain\nlake update\nlake exe cache get\n
\u5173\u4e8e Mathlib \u7684\u66f4\u591a\u5185\u5bb9\u8bf7\u53c2\u8003 Mathlib Wiki
lake \u7684\u5176\u4ed6\u5e38\u7528\u529f\u80fd\uff1a
# \u6784\u5efa\u9879\u76ee\u53ef\u6267\u884c\u6587\u4ef6\nlake build\n# \u8fd0\u884c\nlake exec hello # Hello, world!\n# \u6e05\u7406\u6784\u5efa\u6587\u4ef6\nlake clean\n# \u66f4\u65b0\u4f9d\u8d56\nlake update\n# \u8fd0\u884c lakefile.lean \u7684\u811a\u672c\nlake run <script>\n
"},{"location":"tutorial/elan-lake/#lean_1","title":"lean","text":"lean\uff1a\u8bed\u8a00\u672c\u8eab\u7684\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u4e0d\u9700\u8981\u76f4\u63a5\u4e0e lean
\u4ea4\u4e92\u3002
\u8fd9\u91cc\u4ecb\u7ecd\u5e38\u89c1\u7684\u4e24\u4e2a\u64cd\u4f5c\uff1a\u8fd0\u884c Lean \u811a\u672c\uff0c\u4ee5\u53ca\u9a8c\u8bc1 Lean \u4ee3\u7801\u3002
\u6267\u884c Lean \u811a\u672c\uff0c\u5165\u53e3\u4e3a main
\u51fd\u6570\uff1a
-- hello.lean\ndef main : IO Unit := IO.println s!\"Version: {Lean.versionString}\"\n
\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\uff1a
elan default leanprover/lean4:v4.11.0-rc1\nlean --run hello.lean\n# Version: 4.11.0-rc1\nelan run leanprover/lean4:v4.10.0 lean --run hello.lean\n# Version: 4.10.0\n
\u9a8c\u8bc1 Lean \u4ee3\u7801\uff1a
-- proof.lean\ntheorem my_first_theorem : 1 + 1 = 2 := by\n simp\n\ntheorem my_false_theorem : 1 + 1 = 1 := by\n simp\n\ntheorem my_syntax_error_themore 1 + 1 = 2 := by\n simp\n
\u5728\u7ec8\u7aef\u4e2d\u8fd0\u884c\uff1alean proof.lean
\uff0c\u8fd4\u56de\u9519\u8bef\u4fe1\u606f\uff1a
hello.lean:5:40: error: unsolved goals\n\u22a2 False\nhello.lean:8:31: error: unexpected token; expected ':'\n
"},{"location":"tutorial/lean-dojo/","title":"LeanDojo | \u4e3a Lean \u5b9a\u7406\u8bc1\u660e\u5668\u642d\u5efa\u6865\u6881","text":""},{"location":"tutorial/lean-dojo/#_1","title":"\u7b80\u4ecb","text":"LeanDojo \u662f\u4e00\u4e2a\u4e3a Lean \u5b9a\u7406\u8bc1\u660e\u5668\u8bbe\u8ba1\u7684 Python \u5e93\uff0c\u652f\u6301 Lean 3 \u548c Lean 4 \u7248\u672c\uff0c\u5176\u5728\u89e3\u6790 Lean \u6587\u4ef6\u53ca\u4e0e\u73af\u5883\u4ea4\u4e92\u65b9\u9762\u6709\u5f88\u9ad8\u7684\u5b9e\u7528\u6027\u3002\u9879\u76ee\u63d0\u4f9b\u4ee5\u4e0b\u4e24\u5927\u529f\u80fd\uff1a
\u6570\u636e\u63d0\u53d6\uff1a\u4ece Lean \u5b58\u50a8\u5e93\u4e2d\u63d0\u53d6\u8bc1\u660e\u72b6\u6001\u3001\u7b56\u7565\u3001\u524d\u63d0\u7b49\u5173\u952e\u4fe1\u606f\u3002 \u73af\u5883\u4ea4\u4e92\uff1a\u5141\u8bb8\u7528\u6237\u4ee5\u7f16\u7a0b\u65b9\u5f0f\u4e0e Lean \u73af\u5883\u8fdb\u884c\u4ea4\u4e92\u3002
LeanDojo \u6309\u7167 \u4ed3\u5e93=>\u6587\u4ef6=>\u5b9a\u7406
\u7684\u5c42\u6b21\u7ed3\u6784\u6765\u89e3\u6790\u6587\u4ef6\uff0c\u56f4\u7ed5 LeanGitRepo
\u5bf9\u8c61\u8fdb\u884c\u64cd\u4f5c\uff1a
"},{"location":"tutorial/lean-dojo/#_2","title":"\u76f8\u5173\u94fe\u63a5","text":" \u9879\u76ee\u6587\u6863\uff1aLeanDojo: Machine Learning for Theorem Proving in Lean \u9879\u76ee\u4ed3\u5e93\uff1alean-dojo/LeanDojo \u793e\u533a\u5e16\u5b50\uff1aReleasing LeanDojo "},{"location":"tutorial/lean-dojo/#_3","title":"\u57fa\u672c\u793a\u4f8b","text":"\u6211\u4eec\u5b98\u65b9\u793a\u4f8b\u4ed3\u5e93\uff1ayangky11/lean4-example \u6765\u6f14\u793a\u6570\u636e\u63d0\u53d6\u548c\u73af\u5883\u4ea4\u4e92\u7684\u8fc7\u7a0b\u3002\u8fd9\u662f\u4e00\u4e2a\u7b80\u6d01\u7684 Lean \u5305\uff0c\u6587\u4ef6\u7ed3\u6784\u5982\u4e0b\uff1a
lean4-example/\n\u251c\u2500\u2500 lakefile.lean\n\u251c\u2500\u2500 lake-manifest.json\n\u251c\u2500\u2500 Lean4Example.lean\n\u251c\u2500\u2500 lean-toolchain\n\u251c\u2500\u2500 LICENSE\n\u2514\u2500\u2500 README.md\n
\u5176\u4e2d\uff0cLean4Example.lean
\u6587\u4ef6\u7684\u5185\u5bb9\uff1a
open Nat (add_assoc add_comm)\n\ntheorem hello_world (a b c : Nat)\n : a + b + c = a + c + b := by\n rw [add_assoc, add_comm b, \u2190add_assoc]\n\ntheorem foo (a : Nat) : a + 1 = Nat.succ a := by rfl\n
\u4ece Nat
\u547d\u540d\u7a7a\u95f4\u5bfc\u5165\u4e86 add_assoc
\u548c add_comm
\u4e24\u4e2a\u5f15\u7406\uff0c\u7136\u540e\u5b9a\u4e49\u4e86\u4e24\u4e2a\u5b9a\u7406\u3002
"},{"location":"tutorial/lean-dojo/#_4","title":"\u73af\u5883\u51c6\u5907","text":"\u5b89\u88c5\u4f9d\u8d56\uff0c\u6d4b\u8bd5\u7528 Python 3.10 \u7248\u672c\uff1a
pip install lean-dojo\n
"},{"location":"tutorial/lean-dojo/#_5","title":"\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf","text":"\u73af\u5883\u53d8\u91cf\u53ea\u5728\u9996\u6b21 import lean_dojo
\u65f6\u751f\u6548\uff0c\u56e0\u6b64\u5148\u8bbe\u7f6e\uff1a
import os\n\n# \u8bbe\u7f6e GitHub token \u4ee5\u907f\u514d\u8bf7\u6c42\u9891\u7387\u9650\u5236\nos.environ['GITHUB_ACCESS_TOKEN'] = 'gho_xxx'\n# \u914d\u7f6e\u7ebf\u7a0b\u6570\u4ee5\u52a0\u5feb `trace` \u7684\u8fd0\u884c\u901f\u5ea6\nos.environ['NUM_PROCS'] = '64'\n# \u8bbe\u7f6e\u4e34\u65f6\u76ee\u5f55\u4ee5\u4fbf\u89c2\u5bdf `trace` \u9636\u6bb5\u751f\u6210\u7684\u6587\u4ef6\nos.environ['TMP_DIR'] = 'temp_dir'\n# \u53d6\u6d88\u8fdc\u7a0b\u7f13\u5b58\u4e0b\u8f7d\uff0c\u5728\u672c\u5730\u8fdb\u884c\u6784\u5efa\nos.environ['DISABLE_REMOTE_CACHE'] = 'true'\n
"},{"location":"tutorial/lean-dojo/#_6","title":"\u4ed3\u5e93\u5bf9\u8c61","text":"\u73af\u5883\u4ea4\u4e92\u548c\u6570\u636e\u63d0\u53d6\u90fd\u662f\u56f4\u7ed5 LeanGitRepo
\u5bf9\u8c61\u5c55\u5f00\u7684\u3002
\u9996\u5148\u5bfc\u5165 LeanGitRepo
\u7c7b
from lean_dojo import LeanGitRepo\n
\u521d\u59cb\u5316\u4ed3\u5e93\u5bf9\u8c61\uff0c\u53ef\u4f7f\u7528 commit hash \u6216 main \u5206\u652f\uff1a
repo = LeanGitRepo(\"https://github.com/PatrickMassot/GlimpseOfLean\", \"8d73d32d90ec2315616ad8e720754eeacfb96af6\")\n
\u67e5\u770b\u4ed3\u5e93\u5bf9\u8c61\u7684\u57fa\u672c\u5c5e\u6027\uff1a
print(\"repo.url\", repo.url)\nprint(\"repo.commit\", repo.commit)\nprint(\"repo.repo\", repo.repo)\nprint(repo.get_config(\"lean-toolchain\"))\n
\u8f93\u51fa\u7ed3\u679c\uff1a
repo.url https://github.com/PatrickMassot/GlimpseOfLean\nrepo.commit 8d73d32d90ec2315616ad8e720754eeacfb96af6\nrepo.repo Repository(full_name=\"PatrickMassot/GlimpseOfLean\")\n{'content': 'leanprover/lean4:v4.8.0-rc2\\n'}\n
\u6b64\u5916\uff0c\u4ece 2.1.0 \u7248\u672c\u5f00\u59cb\uff0cLeanDojo \u652f\u6301\u8ffd\u8e2a\u672c\u5730\u4ed3\u5e93\uff1a
repo = LeanGitRepo(\"<local_path>\", \"<commit_hash>\")\nrepo = LeanGitRepo.from_path(\"<local_path>\")\n
"},{"location":"tutorial/lean-dojo/#trace","title":"Trace \u64cd\u4f5c","text":"\u5bf9\u4ed3\u5e93\u8fdb\u884c trace \u64cd\u4f5c\uff1a
from lean_dojo import trace\n\nrepo = LeanGitRepo(\"https://github.com/yangky11/lean4-example\", \"04e29174a45eefaccb49b835a372aa762321194e\")\ntrace(repo, dst_dir=\"traced_lean4-example\", build_deps=False)\n
trace
\u4e3b\u8981\u6267\u884c\u4ee5\u4e0b\u6b65\u9aa4\uff1a
\u514b\u9686\u4ed3\u5e93\u5230 TMP_DIR
\u76ee\u5f55\uff0c\u5e76\u6267\u884c lake build
\u8fdb\u884c\u6784\u5efa\u3002 \u83b7\u53d6\u4ed3\u5e93\u7684 Lean4 \u7248\u672c\uff0c\u5c06\u5bf9\u5e94\u7248\u672c\u7684 Lean4 \u6587\u4ef6\u590d\u5236\u5230 .lake/packages
\u76ee\u5f55\u3002 \u6570\u636e\u63d0\u53d6\uff1a\u5c06 ExtractData.lean
\u811a\u672c\u62f7\u8d1d\u5230\u4ed3\u5e93\uff0c\u6267\u884c lake env lean --run ExtractData.lean
\u547d\u4ee4\uff0c\u63d0\u53d6 AST \u6811\u3001\u72b6\u6001\u548c\u5b9a\u7406\u7b49\u4fe1\u606f\uff0c\u968f\u540e\u5220\u9664 ExtractData.lean
\u6587\u4ef6\u3002 \u73af\u5883\u4ea4\u4e92\uff1a\u5c06 Lean4Repl.lean
\u811a\u672c\u62f7\u8d1d\u5230\u4ed3\u5e93\uff0c\u5e76\u66f4\u65b0 lakefile
\u4ee5\u5305\u542b\u4f9d\u8d56\u4fe1\u606f\uff0c\u6267\u884c lake build Lean4Repl
\u547d\u4ee4\u8fdb\u884c\u6784\u5efa\u3002 \u83b7\u53d6\u4ed3\u5e93\u4fe1\u606f\uff0c\u5e76\u66f4\u65b0 .cache/leandojo
\u76ee\u5f55\u4e0b\u7684\u7f13\u5b58\u3002 \u6b64\u5916\uff0cExtractData.lean
\u548c Lean4Repl.lean
\u6587\u4ef6\u662f\u6574\u4e2a\u9879\u76ee\u7684\u6838\u5fc3\u3002\u5982\u679c\u53ea\u5173\u5fc3\u73af\u5883\u4ea4\u4e92\u95ee\u9898\uff0c\u53ef\u4ee5\u91cd\u70b9\u5173\u6ce8 Lean4Repl.lean
\u6587\u4ef6\u3002
"},{"location":"tutorial/lean-dojo/#_7","title":"\u6570\u636e\u63d0\u53d6","text":"\u63d0\u53d6\u7684\u6587\u4ef6\u4f4d\u4e8e .lake/build
\u76ee\u5f55\uff1a
.lake\n\u251c\u2500\u2500 build\n\u2502 \u251c\u2500\u2500 ir\n\u2502 \u2502 \u251c\u2500\u2500 Lean4Example.ast.json\n\u2502 \u2502 \u251c\u2500\u2500 Lean4Example.c\n\u2502 \u2502 \u251c\u2500\u2500 Lean4Example.c.hash\n\u2502 \u2502 \u251c\u2500\u2500 Lean4Example.dep_paths\n\u2502 \u2502 \u2514\u2500\u2500 Lean4Example.trace.xml\n\u2502 \u2514\u2500\u2500 lib\n\u2502 \u251c\u2500\u2500 Lean4Example.ilean\n\u2502 \u251c\u2500\u2500 Lean4Example.ilean.hash\n\u2502 \u251c\u2500\u2500 Lean4Example.olean\n\u2502 \u251c\u2500\u2500 Lean4Example.olean.hash\n\u2502 \u2514\u2500\u2500 Lean4Example.trace\n\u251c\u2500\u2500 lakefile.olean\n\u251c\u2500\u2500 lakefile.olean.trace\n\u2514\u2500\u2500 packages\n \u2514\u2500\u2500 lean4\n \u251c\u2500\u2500 bin\n \u251c\u2500\u2500 include\n \u251c\u2500\u2500 lib\n \u251c\u2500\u2500 LICENSE\n \u251c\u2500\u2500 LICENSES\n \u251c\u2500\u2500 share\n \u2514\u2500\u2500 src\n
\u8fd9\u91cc\u6709\u4e24\u7c7b\u6bd4\u8f83\u91cd\u8981\u7684\u6587\u4ef6\uff1a
.ast.json
\uff1a\u5305\u542b\u5e26\u6709\u8bed\u4e49\u4fe1\u606f\u7684\u6ce8\u91ca\uff0c\u4f8b\u5982\u7b56\u7565\u72b6\u6001\u548c\u540d\u79f0\u3002 .trace.xml
\uff1a\u7ed3\u6784\u5316\u5904\u7406\u540e\u7684\u53e5\u6cd5\u548c\u8bed\u4e49\u4fe1\u606f\u3002 \u9879\u76ee\u6309 \u4ed3\u5e93 => \u6587\u4ef6 => \u5b9a\u7406
\u7684\u5c42\u6b21\u7ed3\u6784\u751f\u6210\u6587\u4ef6\u3002\u793a\u4f8b\u4e2d\u7684\u4f8b\u5b50\u6bd4\u8f83\u7b80\u5355\uff0c\u4ec5\u5305\u542b\u4e00\u4e2a\u6587\u4ef6\u3002
"},{"location":"tutorial/lean-dojo/#_8","title":"\u73af\u5883\u4ea4\u4e92","text":"\u793a\u4f8b\u4ed3\u5e93\u4e2d\u5305\u542b\u4e24\u4e2a\u5b9a\u7406\u3002\u4ee5 hello_world
\u5b9a\u7406\u4e3a\u4f8b\uff0c\u5c55\u793a\u5982\u4f55\u4f7f\u7528 Dojo
\u7c7b\u8fdb\u884c\u73af\u5883\u4ea4\u4e92\u3002
theorem hello_world (a b c : Nat)\n : a + b + c = a + c + b := by\n rw [add_assoc, add_comm b, \u2190add_assoc]\n
\u9996\u5148\u5bfc\u5165 Dojo
\u7c7b\u548c Theorem
\u7c7b\uff1a
from lean_dojo import Theorem, Dojo\n
\u83b7\u53d6\u5b9a\u7406\u5bf9\u8c61\uff0c\u4ece Lean4Example.lean
\u6587\u4ef6\u4e2d\u63d0\u53d6 hello_world
\u5b9a\u7406\uff1a
theorem = Theorem(repo, \"Lean4Example.lean\", \"hello_world\")\n
\u83b7\u53d6\u521d\u59cb\u72b6\u6001\uff1a
dojo, state_0 = Dojo(theorem).__enter__()\nprint(state_0)\n# TacticState(pp='a b c : Nat\\n\u22a2 a + b + c = a + c + b', id=0, message=None)\nprint(state_0.pp)\n# a b c : Nat\n# \u22a2 a + b + c = a + c + b\n
\u5bf9\u521d\u59cb\u72b6\u6001 state_0
\u6267\u884c\u7b56\u7565\uff0c\u5e76\u83b7\u53d6\u66f4\u65b0\u540e\u7684\u72b6\u6001\uff1a
state_1 = dojo.run_tac(state_0, \"rw [add_assoc]\")\nprint(state_1.pp)\n# a b c : Nat\n# \u22a2 a + (b + c) = a + c + b\n
\u7ee7\u7eed\u5bf9\u72b6\u6001 state_1
\u6267\u884c\u7b56\u7565\uff0c\u5e76\u83b7\u53d6\u6700\u7ec8\u72b6\u6001\uff1a
print(dojo.run_tac(state_1, \"sorry\"))\n# ProofGivenUp()\ndojo.run_tac(state_1, \"rw [add_comm b, \u2190add_assoc]\")\n# ProofFinished(tactic_state_id=4, message='')\n
"},{"location":"tutorial/lean-dojo/#_9","title":"\u5c0f\u7ed3","text":"\u4ee5\u4e0a\uff0c\u6f14\u793a\u4e86\u7528 LeanDojo \u8fdb\u884c\u6570\u636e\u63d0\u53d6\u548c\u73af\u5883\u4ea4\u4e92\u3002\u5982\u679c\u5bf9\u5173\u952e\u5b9e\u73b0\u7ec6\u8282\u611f\u5174\u8da3\uff0c\u53ef\u4ee5\u8fdb\u4e00\u6b65\u9605\u8bfb\u4e24\u4e2a\u6838\u5fc3\u6587\u4ef6\uff1a
ExtractData.lean Lean4Repl.lean "},{"location":"tutorial/lean4-jupyter/","title":"Lean4 Juptyer | TODO","text":"\u57fa\u4e8e REPL \u7684 Jupyter Kernel\u3002
\u9879\u76ee\u5730\u5740\uff1ahttps://github.com/utensil/lean4_jupyter "},{"location":"tutorial/pantograph/","title":"Pantograph \uff5c TODO","text":"Links:
Lean \u9879\u76ee\u5730\u5740\uff1ahttps://github.com/lenianiva/Pantograph Python \u5c01\u88c5\uff1ahttps://github.com/lenianiva/PyPantograph "},{"location":"tutorial/repl/","title":"Lean4 REPL","text":""},{"location":"tutorial/repl/#_1","title":"\u9879\u76ee\u6982\u8981","text":"REPL (Read-Eval-Print Loop) \u662f\u4e00\u4e2a\u4ea4\u4e92\u5f0f\u7f16\u7a0b\u73af\u5883\uff0c\u5141\u8bb8\u7528\u6237\u8f93\u5165\u547d\u4ee4\uff0c\u6267\u884c\u5e76\u67e5\u770b\u7ed3\u679c\u3002Lean 4 REPL \u57fa\u4e8e JSON \u901a\u4fe1\uff0c\u652f\u6301\u4e09\u79cd\u5de5\u4f5c\u6a21\u5f0f\u3002
"},{"location":"tutorial/repl/#command-mode","title":"\u547d\u4ee4\u6a21\u5f0f (Command Mode)","text":"\u5728\u547d\u4ee4\u6a21\u5f0f\u4e0b\uff0c\u53ef\u4ee5\u53d1\u9001\u5b8c\u6574\u7684 Lean \u547d\u4ee4\uff08\u5982\u58f0\u660e\u3001\u5b9a\u4e49\u7b49\uff09\u5230 REPL\uff0c\u6bd4\u5982\uff1a
{ \"cmd\": \"def f := 2\" }\n
"},{"location":"tutorial/repl/#file-mode","title":"\u6587\u4ef6\u6a21\u5f0f (File Mode)","text":"\u6587\u4ef6\u6a21\u5f0f\u662f\u547d\u4ee4\u6a21\u5f0f\u7684\u7b80\u5355\u5c01\u88c5\uff0c\u5141\u8bb8\u76f4\u63a5\u8bfb\u53d6\u548c\u6267\u884c\u6574\u4e2a Lean \u6587\u4ef6\u7684\u5185\u5bb9\u3002\u4f8b\u5982\uff1a
{ \"path\": \"test/file.lean\", \"allTactics\": true }\n
"},{"location":"tutorial/repl/#tactic-mode","title":"\u7b56\u7565\u6a21\u5f0f (Tactic Mode)","text":"\u7b56\u7565\u6a21\u5f0f\u5141\u8bb8\u4f7f\u7528 Lean \u7684\u8bc1\u660e\u7b56\u7565\uff08tactics\uff09\u6765\u4ea4\u4e92\u5f0f\u5730\u6784\u5efa\u8bc1\u660e\u3002\u8fd9\u4e2a\u6a21\u5f0f\u901a\u5e38\u4ece\u4e00\u4e2a\u5305\u542b sorry
\u7684\u547d\u4ee4\u5f00\u59cb\uff0c\u7136\u540e\u9010\u6b65\u5b8c\u6210\u8bc1\u660e\u3002
"},{"location":"tutorial/repl/#_2","title":"\u5b89\u88c5\u4e0e\u57fa\u672c\u4f7f\u7528","text":""},{"location":"tutorial/repl/#_3","title":"\u5b89\u88c5","text":"\u9996\u5148\uff0c\u514b\u9686\u5e76\u6784\u5efa REPL \u9879\u76ee\uff1a
git clone https://github.com/leanprover-community/repl\ncd repl\nlake update -R && lake build\n
\u7279\u522b\u6ce8\u610f\uff0cREPL \u7684\u7248\u672c\u9700\u8981\u4e0e\u76ee\u6807 Lean \u4ee3\u7801\u7684\u7248\u672c\u4fdd\u6301\u4e00\u81f4\u3002
"},{"location":"tutorial/repl/#_4","title":"\u57fa\u672c\u4f7f\u7528","text":"\u8fdb\u5165\u4ed3\u5e93\uff0c\u901a\u8fc7 lake exe repl
\u542f\u52a8\u4ea4\u4e92\u5f0f\u7ec8\u7aef\uff0c\u8f93\u5165 JSON \u5757\uff0c\u83b7\u53d6\u76f8\u5e94\u7684\u8f93\u51fa\u3002
\u6b64\u5916\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u6807\u51c6\u8f93\u5165\u8f93\u51fa\u6d41\u8fdb\u884c\u901a\u4fe1\uff0c\u6bd4\u5982\uff1a
echo '{ \"cmd\": \"def f := 2\" }' | lake exe repl\n
"},{"location":"tutorial/repl/#repl","title":"REPL \u547d\u4ee4\u6a21\u5f0f","text":"\u4e0b\u8fb9\uff0c\u6211\u4eec\u8be6\u7ec6\u4ecb\u7ecd REPL \u7684\u4e09\u79cd\u6a21\u5f0f\uff0c\u4ee5\u53ca Pickle \u7279\u6027\u3002\u5148\u4ece\u6700\u57fa\u7840\u7684 \u547d\u4ee4\u6a21\u5f0f \u5f00\u59cb\u3002
"},{"location":"tutorial/repl/#_5","title":"\u72b6\u6001\u8ddf\u8e2a","text":"REPL \u7684\u547d\u4ee4\u6a21\u5f0f\u901a\u8fc7 env
\u5b57\u6bb5\u8ddf\u8e2a\u73af\u5883\u72b6\u6001\uff0c\u6bcf\u6b21\u6267\u884c cmd
\u547d\u4ee4\u540e\u4f1a\u8fd4\u56de\u4e00\u4e2a\u65b0\u7684\u73af\u5883\u7f16\u53f7\u3002\u8fd9\u79cd\u673a\u5236\u6709\u5f88\u591a\u597d\u5904\uff1a
\u72b6\u6001\u8ffd\u8e2a\uff1a\u5141\u8bb8\u5728\u4e00\u4e2a\u4ea4\u4e92\u7ec8\u7aef\u4e2d\u542f\u7528\u591a\u4e2a\u73af\u5883\uff0c\u6bd4\u5982 import
\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u6bcf\u4e2a\u547d\u4ee4\u6267\u884c\u540e\u90fd\u4f1a\u751f\u6210\u65b0\u7684\u73af\u5883\u7f16\u53f7 \u73af\u5883\u9009\u62e9\uff1a\u5141\u8bb8\u901a\u8fc7\u6307\u5b9a env
\u503c\u56de\u6eaf\u5230\u4e4b\u524d\u7684\u72b6\u6001\uff0c\u5728\u8be5\u73af\u5883\u7684\u57fa\u7840\u4e0a\u6267\u884c\u65b0\u547d\u4ee4 \u73af\u5883\u9694\u79bb\uff1a\u4e0d\u540c\u73af\u5883\u7684\u53d8\u91cf\u76f8\u4e92\u72ec\u7acb "},{"location":"tutorial/repl/#_6","title":"\u793a\u4f8b\u89e3\u6790","text":"\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u5177\u4f53\u793a\u4f8b\u6765\u7406\u89e3\u547d\u4ee4\u6a21\u5f0f\u7684\u5de5\u4f5c\u65b9\u5f0f\uff1a
# \u547d\u4ee4\u5e8f\u5217\n{\"cmd\": \"def f1 := 37\"} # \u547d\u4ee4 1\n{\"cmd\": \"def f2 := 37\", \"env\":0} # \u547d\u4ee4 2\n{\"cmd\": \"def f3 := f1 + f2\", \"env\": 1 } # \u547d\u4ee4 3\n{\"cmd\": \"def f3 := f1 + f2\", \"env\": 1 } # \u547d\u4ee4 4\n{\"cmd\": \"def f3 := f1 + f2\", \"env\": 2 } # \u547d\u4ee4 5\n
\u73af\u5883\u53d8\u5316\u8fc7\u7a0b\uff1a
\u5b9a\u4e49 f1 := 37
\uff0c\u521b\u5efa\u65b0\u73af\u5883 env 0 \u57fa\u4e8e env 0 \u6dfb\u52a0\u5b9a\u4e49 f2 := 37
\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 1 \u57fa\u4e8e env 1 \u6dfb\u52a0\u5b9a\u4e49 f3 := f1 + f2
\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 2 \u57fa\u4e8e env 1 \u6267\u884c\u76f8\u540c\u64cd\u4f5c\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 3 \u57fa\u4e8e env 2 \u91cd\u65b0\u5b9a\u4e49 f3
\uff0c\u62a5\u9519\uff1a'f3' has already been declared
\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 4 "},{"location":"tutorial/repl/#repl_1","title":"REPL \u7b56\u7565\u6a21\u5f0f","text":"\u7b56\u7565\u6a21\u5f0f\uff08Tactic Mode\uff09\u662f REPL \u7684\u6838\u5fc3\u529f\u80fd\uff0c\u7528\u4e8e\u4ea4\u4e92\u5f0f\u8bc1\u660e\u6784\u5efa\u3002
\u7b56\u7565\u6a21\u5f0f\u6709\u4ee5\u4e0b\u7279\u6027\uff1a
\u72b6\u6001\u521b\u5efa\uff1a\u4f7f\u7528 sorry
\u521b\u5efa\u8bc1\u660e\u5360\u4f4d\u7b26\uff0c \u72b6\u6001\u8ffd\u8e2a\uff1a\u901a\u8fc7 proofState
\u6807\u8bc6\u72b6\u6001\u7d22\u5f15\uff0c\u6bcf\u4e2a sorry
\u6309\u987a\u5e8f\u751f\u6210 proofState
\uff0c\u7b56\u7565\u4f5c\u7528\u4e5f\u4f1a\u4ea7\u751f\u65b0\u7684\u8bc1\u660e\u72b6\u6001 \u591a\u76ee\u6807\u5904\u7406\uff1a\u652f\u6301 pick \u6307\u5b9a\u76ee\u6807\u6765\u8fdb\u884c\u4e0b\u4e00\u6b65\u8bc1\u660e \u7075\u6d3b\u6027\uff1a\u652f\u6301\u5404\u79cd\u8bc1\u660e\u7b56\u7565\uff0c\u5305\u62ec have, calc
\u7b49\uff0c\u4e14\u5141\u8bb8\u5206\u6b65\u6784\u5efa\u590d\u6742\u8bc1\u660e "},{"location":"tutorial/repl/#_7","title":"\u793a\u4f8b\u89e3\u6790","text":"\u4e3a\u5c55\u793a\u65b9\u4fbf\uff0c\u6211\u4eec\u5c06\u8f93\u51fa\u7ed3\u679c\u62fc\u63a5\u5230\u5bf9\u5e94\u8f93\u5165\u884c\u540e\u8fb9\uff1a
# \u6b65\u9aa41\uff1a\u521b\u5efa\u5b9a\u7406\n{\"cmd\" : \"def f (x : Unit) : Nat := by sorry\"}\n# \u8fd4\u56de proofState 0\uff0c\u5e76\u5f97\u5230 env 0\n{\"sorries\":\n [{\"proofState\": 0,\n \"pos\": {\"line\": 1, \"column\": 29},\n \"goal\": \"x : Unit\\n\u22a2 Nat\",\n \"endPos\": {\"line\": 1, \"column\": 34}}],\n \"messages\":\n [{\"severity\": \"warning\",\n \"pos\": {\"line\": 1, \"column\": 4},\n \"endPos\": {\"line\": 1, \"column\": 5},\n \"data\": \"declaration uses 'sorry'\"}],\n \"env\": 0}\n\n# \u6b65\u9aa42\uff1a\u5e94\u7528\u7b2c\u4e00\u4e2a\u7b56\u7565\n{\"tactic\": \"apply Int.natAbs\", \"proofState\": 0}\n# \u751f\u6210\u65b0\u7684\u8bc1\u660e\u72b6\u6001 proofState 1\n{\"proofState\": 1, \"goals\": [\"x : Unit\\n\u22a2 Int\"]}\n\n# \u6b65\u9aa43\uff1a\u5b8c\u6210\u8bc1\u660e\n{\"tactic\": \"exact 0\", \"proofState\": 1}\n# \u7a7a\u76ee\u6807\u5217\u8868\u8868\u793a\u8bc1\u660e\u5b8c\u6210\n{\"proofState\": 2, \"goals\": []}\n
"},{"location":"tutorial/repl/#have","title":"\u590d\u6742\u793a\u4f8b\uff1a\u4f7f\u7528 have \u7b56\u7565","text":"# \u521b\u5efa\u5e26\u6709\u4e2d\u95f4\u6b65\u9aa4\u7684\u5b9a\u7406\n{\"cmd\": \"theorem foo (x : Int) : x = x := by\\n have h : x = 1 := by sorry\"}\n\n# \u7ed3\u679c\uff1a\n# 1. \u629b\u51fa\u9519\u8bef\uff1a\u53ea\u653e\u4e86\u4e00\u5904 sorry\uff0c\u5b58\u5728\u672a\u89e3\u51b3\u7684\u76ee\u6807\n# 2. \u8fd4\u56de proofState 0\uff0c\u7531 have \u7684 sorry \u4ea7\u751f\n{\"sorries\":\n [{\"proofState\": 0,\n \"pos\": {\"line\": 2, \"column\": 23},\n \"goal\": \"x : Int\\n\u22a2 x = 1\",\n \"endPos\": {\"line\": 2, \"column\": 28}}],\n \"messages\":\n [{\"severity\": \"error\",\n \"pos\": {\"line\": 1, \"column\": 33},\n \"endPos\": {\"line\": 2, \"column\": 28},\n \"data\": \"unsolved goals\\nx : Int\\nh : x = 1\\n\u22a2 x = x\"}],\n \"env\": 0}\n\n# \u4f7f\u7528 have \u7b56\u7565\n{\"proofState\" : 0, \"tactic\": \"have h : x = 1 := by sorry\"}\n# \u7ed3\u679c\uff1a\n# 1. have \u5f15\u5165\u4e86\u65b0\u7684\u76ee\u6807 proofState 1\n# 2. proofState 0 \u5728\u6267\u884c have \u540e\u53d8\u4e3a proofState 2\n{\"sorries\": [{\"proofState\": 1, \"goal\": \"x : Int\\n\u22a2 x = 1\"}],\n \"proofState\": 2,\n \"goals\": [\"x : Int\\nh : x = 1\\n\u22a2 x = 1\"]}\n
"},{"location":"tutorial/repl/#repl_2","title":"REPL \u6587\u4ef6\u6a21\u5f0f","text":"\u6587\u4ef6\u6a21\u5f0f\u662f REPL \u63d0\u4f9b\u7684\u4e00\u4e2a\u7b80\u5355\u4f46\u5b9e\u7528\u7684\u529f\u80fd\uff0c\u5b83\u5141\u8bb8\u76f4\u63a5\u8bfb\u53d6\u548c\u6267\u884c Lean \u6e90\u6587\u4ef6\u3002
"},{"location":"tutorial/repl/#_8","title":"\u7528\u6cd5\u793a\u4f8b","text":"\u5047\u8bbe test/file.lean
\u5305\u542b\u4ee5\u4e0b\u5185\u5bb9\uff1a
def f : Nat := 37\ndef g := 2\ntheorem h : f + g = 39 := by exact rfl\n
\u5c06 allTactics
\u53c2\u6570\u8bbe\u7f6e\u4e3a true
\uff0c\u83b7\u53d6\u66f4\u8be6\u7ec6\u7684\u8bc1\u660e\u8fc7\u7a0b\u548c\u72b6\u6001\uff1a
echo '{\"path\": \"/path/to/file.lean\", \"allTactics\": true}' | lake exe repl\n
\u6267\u884c\u540e\u4f1a\u5f97\u5230\u7c7b\u4f3c\u7684\u8f93\u51fa\uff1a
{\"tactics\":\n [{\"tactic\": \"exact rfl\",\n \"proofState\": 0,\n \"pos\": {\"line\": 3, \"column\": 29},\n \"goals\": \"\u22a2 f + g = 39\",\n \"endPos\": {\"line\": 3, \"column\": 38}}],\n \"env\": 0}\n
\u6548\u679c\u7b49\u540c\u4e8e\u5c06\u6587\u4ef6\u5185\u5bb9\u901a\u8fc7 cmd
\u547d\u4ee4\u6267\u884c\uff0c\u5373\uff1a
echo '{\"cmd\" : \"def f : Nat := 37\\\\ndef g := 2\\\\ntheorem h : f + g = 39 := by exact rfl\", \"allTactics\": true}' | lake exe repl\n
"},{"location":"tutorial/repl/#pickle","title":"Pickle \u7279\u6027","text":"Pickle \u7279\u6027\u5141\u8bb8\u6211\u4eec\u5c06\u73af\u5883\u72b6\u6001\uff08env\uff09\u6216\u8bc1\u660e\u72b6\u6001\uff08proofState\uff09\u4fdd\u5b58\u5230\u6587\u4ef6\u4e2d\uff0c\u5e76\u5728\u9700\u8981\u65f6\u91cd\u65b0\u52a0\u8f7d\u3002
\u4f7f\u7528\u573a\u666f\uff1aREPL \u662f\u4ee5 Json \u6570\u636e\u5f62\u5f0f\u4ea4\u4e92\u7684\uff0c\u5982\u679c\u6211\u4eec\u60f3\u8fd8\u539f\u5f53\u524d\u7684\u8bc1\u660e\u72b6\u6001\u6216\u73af\u5883\uff0c\u9700\u8981\u91cd\u65b0\u6267\u884c\u6240\u6709\u547d\u4ee4\u3002\u5bf9\u4e8e\u590d\u6742\u7684\u8bc1\u660e\u8fc7\u7a0b\uff0c\u91cd\u590d\u6267\u884c\u4f1a\u5f88\u8017\u65f6\u3002\u6b64\u5916\uff0c\u5728\u591a\u673a\u534f\u4f5c\u65f6\uff0c\u6211\u4eec\u4e5f\u9700\u8981\u5171\u4eab\u8bc1\u660e\u72b6\u6001\u3002
"},{"location":"tutorial/repl/#pickle_1","title":"Pickle \u7684\u57fa\u672c\u64cd\u4f5c","text":"Pickle \u7684\u57fa\u672c\u64cd\u4f5c\uff1a
\u4fdd\u5b58\u73af\u5883/\u72b6\u6001\uff08pickleTo\uff09 \u52a0\u8f7d\u72b6\u6001\uff08unpickleProofStateFrom\uff09 \u52a0\u8f7d\u73af\u5883\uff08unpickleEnvFrom\uff09 "},{"location":"tutorial/repl/#_9","title":"\u793a\u4f8b\u5206\u6790","text":"\u770b\u4e00\u4e2a\u5b9e\u9645\u7684\u4f8b\u5b50\uff1a
# 1. \u5bfc\u5165\u57fa\u7840\u5e93\n{\"cmd\" : \"import Mathlib\"}\n\n# 2. \u521b\u5efa\u5b9a\u7406\n{\"cmd\": \"theorem simple \\n (a : \u211d):\\n a^((1:\u211d)/2 * 2) = a := by sorry\", \"env\":0}\n\n# 3. \u4fdd\u5b58\u8bc1\u660e\u72b6\u6001\n{\"pickleTo\": \"test.olean\", \"proofState\": 0}\n\n# 4. \u52a0\u8f7d\u8bc1\u660e\u72b6\u6001\n{\"unpickleProofStateFrom\": \"test.olean\"}\n\n# 5. \u7ee7\u7eed\u8bc1\u660e\n{\"tactic\": \"ring_nf\", \"proofState\": 1}\n{\"tactic\": \"simp\", \"proofState\": 2}\n
"},{"location":"tutorial/repl/#mathlib","title":"\u914d\u7f6e Mathlib \u4f9d\u8d56","text":"REPL \u672c\u8eab\u4e0d\u4f9d\u8d56 Mathlib\uff0c\u4f46\u6211\u4eec\u53ef\u80fd\u9700\u8981\u5904\u7406\u5305\u542b Mathlib \u4f9d\u8d56\u7684\u9879\u76ee\u3002\u4ee5 Lean 4.14.0 \u7248\u672c\u4e3a\u4f8b\uff0c\u6709\u4e24\u79cd\u89e3\u51b3\u65b9\u5f0f\uff1a
\u65b9\u5f0f\u4e00\uff1a\u76f4\u63a5\u6dfb\u52a0 Mathlib \u4f9d\u8d56
\u5728 REPL \u9879\u76ee\u7684 lakefile.toml
\u4e2d\u6dfb\u52a0\u4f9d\u8d56\uff1a [[require]]\nname = \"mathlib\"\ngit = \"https://github.com/leanprover-community/mathlib4\"\nrev = \"4bbdccd9c5f862bf90ff12f0a9e2c8be032b9a84\"\n
\u66f4\u65b0\u5e76\u6784\u5efa\uff1a lake update -R && lake exe cache get && lake build\n
\u4f7f\u7528\u793a\u4f8b\uff1a echo '{ \"cmd\": \"import Mathlib\" }' | lake exe repl\n
\u65b9\u5f0f\u4e8c\uff1a\u4f7f\u7528 lake env
\u5728\u5305\u542b Mathlib \u4f9d\u8d56\u7684\u9879\u76ee\u4e2d\uff0c\u4f7f\u7528 lake env
\u6307\u5411 REPL \u53ef\u6267\u884c\u6587\u4ef6\uff1a
echo '{ \"cmd\": \"import Mathlib\" }' | lake env /path/to/repl/.lake/build/bin/repl\n
"},{"location":"tutorial/repl/#_10","title":"\u66f4\u591a\u793a\u4f8b","text":"\u6700\u540e\uff0c\u9644\u4e0a REPL \u6d4b\u8bd5\u4ee3\u7801\u63d0\u4f9b\u7684\u793a\u4f8b\uff0c\u4e3a\u5c55\u793a\u65b9\u4fbf\uff0c\u6211\u4eec\u5c06\u8f93\u51fa\u7ed3\u679c\u62fc\u63a5\u5230\u5bf9\u5e94\u7684\u8f93\u5165\u884c\u540e\u8fb9\u3002
"},{"location":"tutorial/repl/#_11","title":"\u57fa\u7840\u793a\u4f8b\uff1a\u68c0\u67e5\u53d8\u91cf\u5b9a\u4e49","text":"# \u8f93\u5165\u547d\u4ee4\u548c\u5bf9\u5e94\u8f93\u51fa\n{\"cmd\": \"def f := 2\"} # \u5b9a\u4e49 f\n{\"env\": 0}\n\n{\"cmd\": \"#check f\", \"env\": 0} # \u68c0\u67e5 f \u7684\u7c7b\u578b\n{\"messages\": [{\"data\": \"f : Nat\"}...]} # f \u7684\u7c7b\u578b\u662f Nat\n\n{\"cmd\": \"#check g\", \"env\": 1} # \u68c0\u67e5\u672a\u5b9a\u4e49\u7684 g\n{\"messages\": [{\"data\": \"unknown identifier 'g'\"}...]} # \u62a5\u9519\uff1a\u672a\u77e5\u6807\u8bc6\u7b26\n
\u4f7f\u7528 #check
\u547d\u4ee4\u68c0\u67e5\u53d8\u91cf\u7684\u7c7b\u578b\uff0c\u4ee5\u53ca\u5904\u7406\u672a\u5b9a\u4e49\u53d8\u91cf\u7684\u9519\u8bef\u60c5\u51b5\u3002
"},{"location":"tutorial/repl/#by_cases","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 by_cases \u5206\u7c7b\u8ba8\u8bba","text":"# \u5b9a\u4e49\u5e26\u6709 sorry \u7684\u5b9a\u7406\n{\"cmd\": \"theorem foo (x : Int) : x = x := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"x : Int\\n\u22a2 x = x\"}...]}\n\n# \u4f7f\u7528 by_cases \u7b56\u7565\u5206\u7c7b\u8ba8\u8bba\n{\"proofState\" : 0, \"tactic\": \"by_cases h : x < 0\"}\n{\"proofState\": 1, \"goals\": [\n \"case pos\\nx : Int\\nh : x < 0\\n\u22a2 x = x\",\n \"case neg\\nx : Int\\nh : \u00acx < 0\\n\u22a2 x = x\"]}\n\n# \u5904\u7406\u6b63\u4f8b\n{\"proofState\" : 1, \"tactic\": \"case pos => rfl\"}\n{\"proofState\": 2, \"goals\": [\"case neg...\"]}\n\n# \u4f7f\u7528 sorry \u5b8c\u6210\u6240\u6709\u5269\u4f59\u76ee\u6807\n{\"proofState\" : 1, \"tactic\": \"all_goals sorry\"}\n{\"proofState\": 5, \"goals\": []}\n
\u4f7f\u7528 by_cases
\u7b56\u7565\u8fdb\u884c\u5206\u7c7b\u8ba8\u8bba\uff0c\u5e76\u901a\u8fc7 all_goals sorry
\u5904\u7406\u5269\u4f59\u8bc1\u660e\u76ee\u6807\u3002
"},{"location":"tutorial/repl/#_12","title":"\u53d8\u91cf\u58f0\u660e\u4e0e\u590d\u6742\u5b9a\u7406","text":"# \u58f0\u660e\u53d8\u91cf\n{\"cmd\": \"variable (x y : Nat)\"}\n{\"cmd\": \"variable (f : Nat \u2192 Nat)\", \"env\": 0}\n\n# \u5b9a\u4e49\u590d\u6742\u5b9a\u7406\n{\"cmd\": \"theorem problem (h0 : f 5 = 3) (h1 : f (4 * x * y) = 2 * y * (f (x + y) + f (x - y))) :\n \u2203 (k : Nat), f 2015 = k := by\\n sorry\", \"env\": 1}\n
\u58f0\u660e\u53d8\u91cf\u548c\u51fd\u6570\u53d8\u91cf\uff0c\u5e76\u6784\u5efa\u5305\u542b\u8fd9\u4e9b\u53d8\u91cf\u7684\u590d\u6742\u5b9a\u7406\u3002\u6ce8\u610f\u5230\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\u7684\u9519\u8bef\u63d0\u793a\u8868\u660e\u9700\u8981\u6b63\u786e\u5904\u7406\u53d8\u91cf\u4f5c\u7528\u57df\u3002
"},{"location":"tutorial/repl/#_13","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528\u5404\u79cd\u7b56\u7565\u7ec4\u5408","text":"# \u8bbe\u7f6e simp \u8ffd\u8e2a\u5e76\u5b9a\u4e49\u793a\u4f8b\n{\"cmd\": \"set_option trace.Meta.Tactic.simp true\\nexample {x : Int} (h0 : x > 0) : False := by sorry\"}\n\n# \u5c1d\u8bd5\u4e0d\u540c\u7b56\u7565\n{\"tactic\": \"have h : x > 0 := by sorry\", \"proofState\": 0} # \u5f15\u5165\u65b0\u5047\u8bbe\n{\"tactic\": \"exact h0\", \"proofState\": 1} # \u4f7f\u7528 exact\n{\"tactic\": \"assumption\", \"proofState\": 1} # \u4f7f\u7528 assumption\n{\"tactic\": \"simp only [of_eq_true (eq_true h0)]\", \"proofState\": 1} # simp \u5e26\u914d\u7f6e\n{\"tactic\": \"{ simp [h0] }\", \"proofState\": 1} # \u5c40\u90e8 simp\n# ... \u5176\u4ed6\u7b56\u7565\u5c1d\u8bd5\n
\u591a\u79cd\u8bc1\u660e\u7b56\u7565\u7684\u4f7f\u7528\u65b9\u5f0f\uff0c\u5305\u62ec have
\u3001exact
\u3001assumption
\u548c\u5e26\u4e0d\u540c\u914d\u7f6e\u7684 simp
\u3002
\u6ce8\uff1a\u4e3a\u7b80\u6d01\u8d77\u89c1\uff0c\u7701\u7565\u4e86\u90e8\u5206\u8f93\u51fa\u4fe1\u606f\u3002
"},{"location":"tutorial/repl/#have_1","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 have \u5f15\u5165\u4e2d\u95f4\u53d8\u91cf","text":"# \u4f7f\u7528 have \u5f15\u5165\u4e2d\u95f4\u53d8\u91cf\u5e76\u5b8c\u6210\u5b9a\u4e49\n{\"cmd\": \"def f : Nat := by have t := 37; exact t\", \"allTactics\": true}\n{\"proofState\": 0, \"goals\": [\"t : Nat\\n\u22a2 Nat\"]} # \u5f15\u5165 t \u540e\u7684\u72b6\u6001\n{\"proofState\": 1, \"goals\": []} # exact t \u5b8c\u6210\u8bc1\u660e\n
\u4f7f\u7528 have
\u5f15\u5165\u4e2d\u95f4\u53d8\u91cf\uff0c\u5e76\u7528 exact
\u5b8c\u6210\u5b9a\u4e49\uff0callTactics
\u53c2\u6570\u5141\u8bb8\u8ffd\u8e2a\u7b56\u7565\u6267\u884c\u8fc7\u7a0b\u3002
"},{"location":"tutorial/repl/#lake","title":"\u5305\u7ba1\u7406\u793a\u4f8b\uff1a\u5bfc\u5165 Lake","text":"# \u5bfc\u5165 Lake \u5305\u5e76\u6253\u5f00 DSL \u547d\u540d\u7a7a\u95f4\n{\"cmd\": \"import Lake open Lake DSL\\npackage REPL\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n
\u5bfc\u5165\u548c\u4f7f\u7528 Lake \u5305\u7ba1\u7406\u7cfb\u7edf\uff0c\u8fd9\u662f Lean 4 \u7684\u6807\u51c6\u5305\u7ba1\u7406\u5668\u3002
"},{"location":"tutorial/repl/#sorry","title":"\u7b80\u5355\u793a\u4f8b\uff1a\u57fa\u7840\u5b9a\u4e49\u4e2d\u7684 sorry","text":"# \u4f7f\u7528 sorry \u5b9a\u4e49\u51fd\u6570\n{\"cmd\": \"def f : Nat := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 \u25fe\"}...]}\n
\u6700\u57fa\u672c\u7684 sorry \u5360\u4f4d\u7b26\u4f7f\u7528\u65b9\u5f0f\uff0c\u5176\u4e2d \u22a2 \u25fe
\u8868\u793a\u9700\u8981\u8bc1\u660e\u4e00\u4e2a\u503c\uff08\u800c\u4e0d\u662f\u547d\u9898\uff09\u3002
"},{"location":"tutorial/repl/#_14","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u6784\u9020\u51fd\u6570\u5e94\u7528","text":"# \u7b80\u5355\u6784\u9020\u51fd\u6570\u5e94\u7528\n{\"cmd\": \"def f : Nat := by apply Nat.succ\"}\n{\"messages\": [{\"data\": \"unused variable `h`\"...}]}\n\n# \u4f7f\u7528 by_cases \u7684\u6761\u4ef6\u5206\u652f\n{\"cmd\": \"def f (x : Bool) : Nat := by\\n by_cases x\\n { apply Nat.succ }\"}\n
\u4f7f\u7528 apply
\u7b56\u7565\u5e94\u7528\u6784\u9020\u51fd\u6570\uff0c\u4ee5\u53ca\u5728 by_cases
\u5206\u652f\u4e2d\u4f7f\u7528\u6784\u9020\u51fd\u6570\u3002
"},{"location":"tutorial/repl/#have_2","title":"\u7b56\u7565\u793a\u4f8b\uff1ahave \u5f15\u5165\u4e2d\u95f4\u547d\u9898","text":"# \u521b\u5efa\u5e26\u6709\u591a\u4e2a sorry \u7684\u793a\u4f8b\n{\"cmd\" : \"example : True := by\\n have h : set Nat := by sorry\\n sorry\"}\n{\"sorries\": [\n {\"proofState\": 0, \"goal\": \"x : Int\\n\u22a2 x = x\"}...], # \u7b2c\u4e00\u4e2a sorry\n \"messages\": [{\"data\": \"declaration uses 'sorry'\"}...]}\n\n# have \u8bed\u53e5\u4ea7\u751f\u65b0\u7684\u8bc1\u660e\u72b6\u6001\n{\"sorries\": [{\"proofState\": 1, \"goal\": \"x : Int\\n\u22a2 x = 1\"}],\n \"proofState\": 2,\n \"goals\": [\"x : Int\\nh : x = 1\\n\u22a2 x = x\"]}\n
\u4f7f\u7528 have
\u7b56\u7565\u5f15\u5165\u4e2d\u95f4\u547d\u9898\uff0c\u8fd9\u4f1a\u4ea7\u751f\u4e24\u4e2a\u8bc1\u660e\u76ee\u6807\uff1a\u4e00\u4e2a\u7528\u4e8e\u8bc1\u660e\u5f15\u5165\u7684\u547d\u9898\uff0c\u53e6\u4e00\u4e2a\u7528\u4e8e\u5b8c\u6210\u4e3b\u8981\u8bc1\u660e\u3002
"},{"location":"tutorial/repl/#rfl","title":"\u57fa\u7840\u793a\u4f8b\uff1a\u4f7f\u7528 rfl \u68c0\u67e5\u76f8\u7b49\u6027","text":"# \u5b9a\u4e49\u6570\u503c\n{\"cmd\": \"def f := 37\"}\n{\"env\": 0}\n\n# \u4f7f\u7528 rfl \u68c0\u67e5\u76f8\u7b49\u6027\n{\"cmd\": \"#check (rfl : f = 37)\", \"env\": 0}\n# \u547d\u4ee4\u6267\u884c\u6210\u529f\uff0c\u65e0\u8f93\u51fa\u8868\u793a\u7c7b\u578b\u68c0\u67e5\u901a\u8fc7\n
\u4f7f\u7528 rfl
\uff08reflexivity\uff09\u8bc1\u660e\u7b80\u5355\u7684\u76f8\u7b49\u6027\uff0c\u5e76\u901a\u8fc7 #check
\u9a8c\u8bc1\u3002
"},{"location":"tutorial/repl/#_15","title":"\u793a\u4f8b\uff1a\u4f7f\u7528\u4e0b\u5212\u7ebf\u5360\u4f4d\u7b26","text":"# \u4f7f\u7528\u4e0b\u5212\u7ebf\u4f5c\u4e3a\u5360\u4f4d\u7b26\u5b9a\u4e49\u51fd\u6570\n{\"cmd\": \"def f : Nat := _\"}\n{\"messages\": [{\"data\": \"constructor List.cons...\"}...]}\n
\u4f7f\u7528\u4e0b\u5212\u7ebf\uff08_
\uff09\u4f5c\u4e3a\u5360\u4f4d\u7b26\u6765\u5b9a\u4e49\u51fd\u6570\uff0cREPL \u4f1a\u663e\u793a\u53ef\u80fd\u7684\u6784\u9020\u5668\u4fe1\u606f\u3002
"},{"location":"tutorial/repl/#_16","title":"\u57fa\u7840\u793a\u4f8b\uff1a\u5b9a\u4e49\u6570\u503c\u7c7b\u578b","text":"# \u4f7f\u7528 sorry \u5b9a\u4e49\u81ea\u7136\u6570\n{\"cmd\": \"def f : Nat := sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n
\u4f7f\u7528 sorry
\u4e3a\u81ea\u7136\u6570\u7c7b\u578b\u521b\u5efa\u4e00\u4e2a\u5360\u4f4d\u5b9a\u4e49\u3002
"},{"location":"tutorial/repl/#_17","title":"\u6253\u5370\u793a\u4f8b\uff1a\u67e5\u770b\u5b9a\u4e49\u548c\u8bbe\u7f6e\u9009\u9879","text":"# \u6253\u5370 List.cons \u5b9a\u4e49\n{\"cmd\": \"#print List.cons\"}\n{\"env\": 0}\n\n# \u542f\u7528\u6253\u5370universe\u5c42\u7ea7\n{\"cmd\": \"set_option pp.universes true\"}\n{\"env\": 1}\n\n# \u518d\u6b21\u6253\u5370 List.cons\uff0c\u8fd9\u6b21\u4f1a\u663e\u793auniverse\u4fe1\u606f\n{\"cmd\": \"#print List.cons\", \"env\": 1}\n{\"env\": 2}\n
\u4f7f\u7528 #print
\u547d\u4ee4\u67e5\u770b\u5b9a\u4e49\uff0c\u4ee5\u53ca\u901a\u8fc7 set_option
\u63a7\u5236\u8f93\u51fa\u683c\u5f0f\u3002
"},{"location":"tutorial/repl/#natabs","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 natAbs \u6784\u9020\u81ea\u7136\u6570","text":"# \u5b9a\u4e49\u8fd4\u56de\u81ea\u7136\u6570\u7684\u51fd\u6570\n{\"cmd\" : \"def f (x : Unit) : Nat := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"x : Unit\\n\u22a2 Nat\"}...]}\n\n# \u4f7f\u7528 Int.natAbs \u5c06\u6574\u6570\u8f6c\u6362\u4e3a\u81ea\u7136\u6570\n{\"tactic\": \"apply Int.natAbs\", \"proofState\": 0}\n{\"proofState\": 1, \"goals\": [\"x : Unit\\n\u22a2 Int\"]}\n\n# \u63d0\u4f9b\u5177\u4f53\u6574\u6570\u503c\n{\"tactic\": \"exact -37\", \"proofState\": 1}\n{\"proofState\": 2, \"goals\": []}\n
\u901a\u8fc7 Int.natAbs
\u5c06\u6574\u6570\u8f6c\u6362\u4e3a\u81ea\u7136\u6570\u6765\u6784\u9020 Nat
\u7c7b\u578b\u7684\u503c\u3002
"},{"location":"tutorial/repl/#_18","title":"\u9519\u8bef\u793a\u4f8b\uff1a\u9519\u8bef\u7684\u6784\u9020\u5668\u4f7f\u7528","text":"# \u5c1d\u8bd5\u4f7f\u7528 constructor \u6784\u9020 Nat\n{\"cmd\": \"def f (h : Int) : Nat := by constructor\", \"infotree\": \"substantive\"}\n{\"messages\": [{\"data\": \"don't know how to synthesize placeholder\\ncontext:\\n\u22a2 Nat\"}...]}\n
\u9519\u8bef\u4f7f\u7528 constructor
\u7b56\u7565\u7684\u60c5\u51b5\uff1a\u4e0d\u80fd\u76f4\u63a5\u7528\u6784\u9020\u5668\u6784\u9020 Nat
\u7c7b\u578b\u3002
"},{"location":"tutorial/repl/#_19","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u9519\u8bef\u5904\u7406\u6f14\u793a","text":"# \u5b9a\u4e49\u5b9a\u7406\n{\"cmd\": \"theorem my_theorem (x : Nat) : x = x := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"x : Int\\n\u22a2 x = x\"}...]}\n\n# \u5c1d\u8bd5\u4f7f\u7528\u672a\u5b9a\u4e49\u7684\u524d\u63d0\n{\"tactic\": \"exact my_fake_premise\", \"proofState\": 0}\n{\"messages\": [{\"severity\": \"error\", \"data\": \"unknown identifier 'my_fake_premise'\"}...]}\n
\u5728\u4f7f\u7528\u672a\u5b9a\u4e49\u53d8\u91cf\u65f6 REPL \u7684\u9519\u8bef\u5904\u7406\u673a\u5236\u3002
"},{"location":"tutorial/repl/#sorry_1","title":"\u793a\u4f8b\uff1a\u591a\u4e2a sorry \u7684\u5904\u7406","text":"# \u4f7f\u7528\u591a\u4e2a sorry \u7684\u793a\u4f8b\n{\"cmd\" : \"example : True := by\\n sorry\\n sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n
\u5728\u540c\u4e00\u4e2a\u8bc1\u660e\u4e2d\u4f7f\u7528\u591a\u4e2a sorry
\uff0cREPL \u4f1a\u4e3a\u6bcf\u4e2a sorry
\u5206\u914d\u72ec\u7acb\u7684 proofState
\u3002
"},{"location":"tutorial/repl/#have_3","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 have \u5f15\u5165\u4e2d\u95f4\u7ed3\u8bba","text":"# \u5b9a\u4e49\u5b9a\u7406\n{\"cmd\": \"theorem foo (x : Int) : x = x := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"x : Int\\n\u22a2 x = x\"}...]}\n\n# \u4f7f\u7528 have \u5f15\u5165\u4e2d\u95f4\u7ed3\u8bba\n{\"proofState\" : 0, \"tactic\": \"have h : x = 1 := sorry\"}\n{\"messages\": [{\"data\": \"unsolved goals...\"}...]}\n
\u4f7f\u7528 have
\u7b56\u7565\u5f15\u5165\u4e2d\u95f4\u7ed3\u8bba\uff0c\u8fd9\u4f1a\u4ea7\u751f\u4e24\u4e2a\u8bc1\u660e\u76ee\u6807\uff1a\u4e00\u4e2a\u662f\u8bc1\u660e\u4e2d\u95f4\u7ed3\u8bba\uff0c\u53e6\u4e00\u4e2a\u662f\u4f7f\u7528\u4e2d\u95f4\u7ed3\u8bba\u8bc1\u660e\u539f\u76ee\u6807\u3002
"},{"location":"tutorial/repl/#_20","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u7b80\u5355\u503c\u5b9a\u4e49","text":"# \u5b9a\u4e49\u5e26\u6709 sorry \u7684\u81ea\u7136\u6570\n{\"cmd\" : \"def f : Nat := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 True\"}...]}\n\n# \u5c1d\u8bd5\u4f7f\u7528 exact \u7b56\u7565\uff08\u9519\u8bef\u793a\u4f8b\uff09\n{\"tactic\": \"exact 42\", \"proofState\": 1}\n{\"messages\": [{\"data\": \"no goals to be solved\"}...]}\n
\u4e00\u4e2a\u7b80\u5355\u7684\u503c\u5b9a\u4e49\uff0c\u4ee5\u53ca\u5f53\u5c1d\u8bd5\u5728\u65e0\u6548\u72b6\u6001\u4e0a\u4f7f\u7528\u7b56\u7565\u65f6\u7684\u9519\u8bef\u5904\u7406\u3002
"},{"location":"tutorial/repl/#_21","title":"\u6587\u4ef6\u6a21\u5f0f\u793a\u4f8b\uff1a\u8bfb\u53d6\u6587\u4ef6\u5e76\u5904\u7406\u9519\u8bef","text":"# \u8bfb\u53d6\u5e76\u6267\u884c Lean \u6587\u4ef6\n{\"path\": \"test/file.lean\", \"allTactics\": true}\n\n# \u8f93\u51fa\u5305\u542b\u9519\u8bef\u4fe1\u606f\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"x : Nat\\n\u22a2 x = x\"}...]}\n{\"proofState\": 1, \"messages\": [\n {\"data\": \"unknown identifier 'my_fake_premise'\"}...]}\n
\u6587\u4ef6\u6a21\u5f0f\u8bfb\u53d6 Lean \u6587\u4ef6\u5e76\u5904\u7406\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u9519\u8bef\uff08\u5982\u672a\u77e5\u6807\u8bc6\u7b26\uff09\u3002
"},{"location":"tutorial/repl/#trace-simp","title":"\u8c03\u8bd5\u793a\u4f8b\uff1a\u4f7f\u7528 trace \u548c simp","text":"# \u5b9a\u4e49\u51fd\u6570\u548c\u7b80\u5316\u89c4\u5219\n{\"cmd\": \"def f := 37\"}\n{\"cmd\": \"@[simp] theorem f_def : f = 37 := by rfl\", \"env\": 0}\n\n# \u542f\u7528 simp \u8ddf\u8e2a\n{\"cmd\": \"set_option trace.Meta.Tactic.simp true\", \"env\": 1}\n\n# \u4f7f\u7528 simp \u8bc1\u660e\n{\"cmd\": \"example : f = 37 := by simp\", \"env\": 2}\n\n# \u4f7f\u7528 trace \u8fdb\u884c\u8c03\u8bd5\n{\"cmd\": \"example : f = 37 := by sorry\", \"env\": 2}\n{\"tactic\": \"trace \\\"37\\\"\", \"proofState\": 0}\n{\"tactic\": \"simp\", \"proofState\": 0}\n\n# \u5728\u8bc1\u660e\u4e2d\u5d4c\u5165 trace\n{\"cmd\": \"example : True := by\\n trace \\\"!\\\"\\n trivial\"}\n
\u4f7f\u7528 trace
\u548c simp
\u8fdb\u884c\u8c03\u8bd5\u548c\u7b80\u5316\u8bc1\u660e\uff0c\u4ee5\u53ca\u8bbe\u7f6e\u8ddf\u8e2a\u9009\u9879\u3002
"},{"location":"tutorial/repl/#sorry_2","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u76f4\u63a5\u4f7f\u7528 sorry","text":"# \u5b9a\u4e49\u5e26\u6709 sorry \u7684\u51fd\u6570\n{\"cmd\": \"def f : Nat := by sorry\"}\n{\"env\": 0}\n\n# \u76f4\u63a5\u4f7f\u7528 sorry \u5b8c\u6210\u8bc1\u660e\n{\"proofState\": 0, \"tactic\": \"sorry\"}\n{\"env\": 2}\n
\u6700\u7b80\u5355\u7684 sorry \u7528\u6cd5\uff1a\u76f4\u63a5\u7528 sorry \u5b8c\u6210\u5b9a\u4e49\u6216\u8bc1\u660e\u3002
"},{"location":"tutorial/repl/#calc","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 calc\uff08\u8ba1\u7b97\u5757\uff09","text":"# \u4f7f\u7528 calc \u5757\u8fdb\u884c\u94fe\u5f0f\u63a8\u5bfc\n{\"cmd\": \"example : 3 = 5 := by calc\\n 3 = 4 := by sorry\\n 4 = 5 := by sorry\", \"allTactics\": true }\n{\"tactics\": [{\"tactic\": \"exact rfl\", \"goals\": \"\u22a2 f + g = 39\"...}]}\n
\u4f7f\u7528 calc
\u8bed\u6cd5\u6784\u5efa\u94fe\u5f0f\u7b49\u5f0f\u63a8\u5bfc\uff0c\u6bcf\u4e00\u6b65\u90fd\u4f7f\u7528 sorry
\u6807\u8bb0\u5f85\u8bc1\u660e\u7684\u6b65\u9aa4\u3002
"},{"location":"tutorial/repl/#_22","title":"\u9519\u8bef\u5904\u7406\u793a\u4f8b\uff1a\u7b56\u7565\u540d\u62fc\u5199\u9519\u8bef","text":"# \u5b9a\u4e49\u5e26\u6709 sorry \u7684\u51fd\u6570\n{\"cmd\" : \"def f : Nat := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n\n# \u9519\u8bef\u7684\u7b56\u7565\u540d\u79f0 (exat \u5e94\u4e3a exact)\n{\"tactic\": \"exat 42\", \"proofState\": 0}\n{\"proofState\": 1, \"goals\": [\"\u22a2 Nat\"]} # \u7b56\u7565\u6267\u884c\u5931\u8d25\uff0c\u76ee\u6807\u4fdd\u6301\u4e0d\u53d8\n
\u5f53\u7b56\u7565\u540d\u79f0\u62fc\u5199\u9519\u8bef\u65f6\uff08exat
\u800c\u4e0d\u662f exact
\uff09\uff0cREPL \u4f1a\u4fdd\u6301\u8bc1\u660e\u72b6\u6001\u4e0d\u53d8\uff0c\u5141\u8bb8\u7ee7\u7eed\u5c1d\u8bd5\u6b63\u786e\u7684\u7b56\u7565\u3002
"},{"location":"tutorial/repl/#_23","title":"\u793a\u4f8b\uff1a\u591a\u4e2a\u5b9a\u7406\u7684\u8fde\u7eed\u5b9a\u4e49","text":"# \u5b9a\u4e49\u7b2c\u4e00\u4e2a\u5b9a\u7406\n{\"cmd\": \"theorem thm1 : 1 = 1 := sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 1 = 1\"}...], \"env\": 0}\n\n# \u5728\u540c\u4e00\u73af\u5883\u4e0b\u5b9a\u4e49\u7b2c\u4e8c\u4e2a\u5b9a\u7406\n{\"cmd\": \"theorem thm2 : 2 = 2 := sorry\", \"env\": 0}\n{\"sorries\": [{\"proofState\": 1, \"goal\": \"\u22a2 2 = 2\"}...], \"env\": 1}\n
\u5728\u540c\u4e00\u73af\u5883\u4e2d\u8fde\u7eed\u5b9a\u4e49\u591a\u4e2a\u5f85\u8bc1\u660e\u7684\u5b9a\u7406\uff0c\u6bcf\u4e2a\u5b9a\u7406\u83b7\u5f97\u72ec\u7acb\u7684 proofState
\u3002
"},{"location":"tutorial/repl/#sorry_3","title":"\u793a\u4f8b\uff1asorry \u5360\u4f4d\u7b26\u7684\u57fa\u672c\u4f7f\u7528","text":"# \u4f7f\u7528 sorry \u5b9a\u4e49\u4e00\u4e2a\u81ea\u7136\u6570\n{\"cmd\": \"def f : Nat := by sorry\", \"env\": 5}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 \u25fe\"}...],\n \"messages\": [{\"data\": \"declaration uses 'sorry'\"}...],\n \"env\": 2}\n
\u4f7f\u7528 sorry
\u4f5c\u4e3a\u5360\u4f4d\u7b26\u6765\u5b9a\u4e49\u4e00\u4e2a\u5c1a\u672a\u5b9e\u73b0\u7684\u81ea\u7136\u6570\u503c\uff0c\u5176\u4e2d \u22a2 \u25fe
\u8868\u793a\u9700\u8981\u63d0\u4f9b\u4e00\u4e2a Nat
\u7c7b\u578b\u7684\u503c\u3002
"},{"location":"tutorial/repl/#_24","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u5b9a\u4e49\u81ea\u7136\u6570\u503c","text":"# \u5b9a\u4e49\u5e26\u8bc1\u660e\u7684\u81ea\u7136\u6570\n{\"cmd\" : \"def f : Nat := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n\n# \u5c1d\u8bd5\u5e94\u7528 Int.natAbs\uff08\u9519\u8bef\u793a\u8303\uff09\n{\"tactic\": \"apply Int.natAbs\", \"proofState\": 0}\n{\"messages\": [{\"data\": \"type expected, got (set Nat...\"}...]}\n\n# \u5f15\u5165\u4e2d\u95f4\u503c\n{\"tactic\": \"have t : Nat := 42\", \"proofState\": 0}\n{\"proofState\": 2...}\n\n# \u4f7f\u7528\u5f15\u5165\u7684\u503c\u5b8c\u6210\u8bc1\u660e\n{\"tactic\": \"exact t\", \"proofState\": 2}\n{\"proofState\": 3, \"goals\": []}\n
\u901a\u8fc7\u5f15\u5165\u5177\u4f53\u503c\uff0842\uff09\u6765\u5b9a\u4e49\u81ea\u7136\u6570\uff0c\u4ee5\u53ca\u5904\u7406\u9519\u8bef\u7b56\u7565\u5e94\u7528\u7684\u60c5\u51b5\u3002
"},{"location":"tutorial/repl/#have_4","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 have \u5f15\u5165\u4e2d\u95f4\u7ed3\u8bba","text":"# \u65b9\u5f0f\u4e00\uff1a\u5728\u5b9a\u7406\u4e2d\u76f4\u63a5\u4f7f\u7528 have\n{\"cmd\": \"theorem foo (x : Int) : x = x := by\\n have h : x = 1 := by sorry\"}\n{\"messages\": [\"unsolved goals\\nx : Int\\nh : x = 1\\n\u22a2 x = x\"...]}\n\n# \u65b9\u5f0f\u4e8c\uff1a\u5206\u6b65\u6267\u884c have\n{\"cmd\": \"theorem foo (x : Int) : x = x := by sorry\"}\n{\"sorries\": [{\"proofState\": 1, \"goal\": \"x : Int\\n\u22a2 x = x\"}...]}\n\n{\"proofState\" : 0, \"tactic\": \"have h : x = 1 := by sorry\"}\n{\"sorries\": [{\"goal\": \"x : Int\\n\u22a2 x = 1\"}],\n \"goals\": [\"x : Int\\nh : x = 1\\n\u22a2 x = 1\"]}\n
\u4e24\u79cd\u4f7f\u7528 have
\u5f15\u5165\u4e2d\u95f4\u7ed3\u8bba\u7684\u65b9\u5f0f\uff0c\u4ee5\u53ca\u5b83\u4eec\u4ea7\u751f\u7684\u8bc1\u660e\u72b6\u6001\u3002
"},{"location":"tutorial/repl/#_25","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u57fa\u672c\u7b56\u7565\u7ec4\u5408","text":"# \u5b9a\u4e49\u51fd\u6570 f\uff0c\u4f7f\u7528\u7b56\u7565\u6a21\u5f0f\n{\"cmd\": \"def f : Nat := by\"}\n{\"tactics\": [\n # \u7b2c\u4e00\u4e2a\u7b56\u7565\uff1a\u5f15\u5165\u4e2d\u95f4\u53d8\u91cf\n {\"tactic\": \"have t := 37\", \"goals\": \"\u22a2 Nat\"...},\n # \u7b2c\u4e8c\u4e2a\u7b56\u7565\uff1a\u4f7f\u7528\u5f15\u5165\u7684\u53d8\u91cf\u5b8c\u6210\u8bc1\u660e\n {\"tactic\": \"exact t\", \"goals\": \"t : Nat\\n\u22a2 Nat\"...}\n]}\n
\u4f7f\u7528 have
\u548c exact
\u7b56\u7565\u7684\u7ec4\u5408\u6765\u6784\u9020\u4e00\u4e2a\u7b80\u5355\u7684\u81ea\u7136\u6570\u5b9a\u4e49\u3002
"},{"location":"tutorial/repl/#pickle_2","title":"Pickle \u6a21\u5f0f","text":""},{"location":"tutorial/repl/#pickle_3","title":"Pickle \u793a\u4f8b\uff1a\u4fdd\u5b58\u548c\u52a0\u8f7d\u73af\u5883","text":"# \u5b9a\u4e49\u5e76\u4fdd\u5b58\u73af\u5883\n{\"cmd\": \"def f := 42\"} # \u5b9a\u4e49 f\n{\"pickleTo\": \"test/a.olean\", \"env\": 0} # \u4fdd\u5b58\u73af\u5883\n\n# \u52a0\u8f7d\u73af\u5883\u5e76\u4f7f\u7528\n{\"unpickleEnvFrom\": \"test/a.olean\"} # \u52a0\u8f7d\n
\u73af\u5883\u7684\u5e8f\u5217\u5316\u64cd\u4f5c\u3002
"},{"location":"tutorial/repl/#pickle_4","title":"Pickle \u793a\u4f8b\uff1a\u4fdd\u5b58\u548c\u52a0\u8f7d\u73af\u5883","text":"# \u5bfc\u5165\u57fa\u7840\u5e93\u5e76\u5b9a\u4e49\u51fd\u6570\n{\"cmd\": \"import Lean\"}\n{\"cmd\": \"def f := 42\", \"env\": 0}\n\n# \u4fdd\u5b58\u73af\u5883\u5230\u6587\u4ef6\n{\"pickleTo\": \"test/b.olean\", \"env\": 1}\n\n# \u4ece\u6587\u4ef6\u52a0\u8f7d\u73af\u5883\n{\"unpickleEnvFrom\": \"test/b.olean\"}\n\n# \u5728\u52a0\u8f7d\u7684\u73af\u5883\u4e2d\u9a8c\u8bc1\u5b9a\u4e49\n{\"cmd\": \"example : f = 42 := by rfl\", \"env\": 2}\n
\u4f7f\u7528 pickleTo
\u548c unpickleEnvFrom
\u547d\u4ee4\u6765\u4fdd\u5b58\u548c\u6062\u590d\u73af\u5883\u72b6\u6001\uff0c\u5e76\u5728\u6062\u590d\u7684\u73af\u5883\u4e2d\u7ee7\u7eed\u5de5\u4f5c\u3002
"},{"location":"tutorial/repl/#pickle_5","title":"Pickle \u793a\u4f8b\uff1a\u4fdd\u5b58\u548c\u52a0\u8f7d\u8bc1\u660e\u72b6\u6001","text":"# \u5bfc\u5165\u57fa\u7840\u5e93\u5e76\u5b9a\u4e49\u5e26 sorry \u7684\u51fd\u6570\n{\"cmd\" : \"import Lean\"}\n{\"cmd\" : \"def f : Nat := by sorry\", \"env\": 0}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n\n# \u4fdd\u5b58\u521d\u59cb\u72b6\u6001\n{\"pickleTo\": \"test/c.olean\", \"proofState\": 0}\n\n# \u52a0\u8f7d\u72b6\u6001\u5e76\u7ee7\u7eed\u8bc1\u660e\n{\"unpickleProofStateFrom\": \"test/c.olean\", \"env\": 0}\n{\"tactic\": \"have t : Nat := 42\", \"proofState\": 2}\n\n# \u4fdd\u5b58\u4e2d\u95f4\u72b6\u6001\n{\"pickleTo\": \"test/d.olean\", \"proofState\": 3}\n\n# \u52a0\u8f7d\u4e2d\u95f4\u72b6\u6001\u5e76\u5b8c\u6210\u8bc1\u660e\n{\"unpickleProofStateFrom\": \"test/d.olean\", \"env\": 0}\n{\"tactic\": \"exact t\", \"proofState\": 5}\n
\u5728\u8bc1\u660e\u8fc7\u7a0b\u4e2d\u4f7f\u7528 pickle \u4fdd\u5b58\u548c\u52a0\u8f7d\u8bc1\u660e\u72b6\u6001\uff0c\u5b9e\u73b0\u8bc1\u660e\u7684\u65ad\u70b9\u7eed\u4f20\u3002
"},{"location":"tutorial/repl/#pickle_6","title":"Pickle \u793a\u4f8b\uff1a\u52a0\u8f7d\u5e76\u7ee7\u7eed\u8bc1\u660e","text":"# \u4ece\u6587\u4ef6\u52a0\u8f7d\u8bc1\u660e\u72b6\u6001\n{\"unpickleProofStateFrom\": \"test/d.olean\"}\n{\"env\": 0}\n\n# \u4f7f\u7528 exact \u5b8c\u6210\u8bc1\u660e\n{\"tactic\": \"exact t\", \"proofState\": 0}\n{\"messages\": [{\"data\": \"f : Nat\"}...]}\n
\u4ece .olean
\u6587\u4ef6\u52a0\u8f7d\u8bc1\u660e\u72b6\u6001\uff0c\u5e76\u7ee7\u7eed\u5b8c\u6210\u8bc1\u660e\u8fc7\u7a0b\u3002
"},{"location":"tutorial/repl/#pickle-open","title":"Pickle \u793a\u4f8b\uff1a\u4f7f\u7528 open \u5bfc\u5165\u5b9a\u4e49","text":"# \u5728\u547d\u540d\u7a7a\u95f4 X \u4e2d\u5b9a\u4e49 Y\n{\"cmd\": \"def X.Y : Nat := 37\"}\n{\"env\": 0}\n\n# \u6253\u5f00\u547d\u540d\u7a7a\u95f4 X\n{\"cmd\": \"open X\", \"env\": 0}\n{\"env\": 1}\n\n# \u76f4\u63a5\u4f7f\u7528 Y\uff08\u65e0\u9700 X.Y\uff09\u9a8c\u8bc1\u503c\n{\"cmd\": \"example : Y = 37 := rfl\", \"env\": 1}\n{\"env\": 2}\n\n# \u4fdd\u5b58\u73af\u5883\u72b6\u6001\n{\"pickleTo\": \"test/e.olean\", \"env\": 1}\n
\u4f7f\u7528\u547d\u540d\u7a7a\u95f4\uff08namespace\uff09\u7ec4\u7ec7\u4ee3\u7801\uff0c\u4ee5\u53ca\u901a\u8fc7 open
\u547d\u4ee4\u7b80\u5316\u8bbf\u95ee\u3002
"},{"location":"tutorial/repl/#pickle_7","title":"Pickle \u793a\u4f8b\uff1a\u52a0\u8f7d\u73af\u5883\u53d8\u91cf","text":"# \u52a0\u8f7d\u5df2\u4fdd\u5b58\u7684\u73af\u5883\n{\"unpickleEnvFrom\": \"test/e.olean\"}\n{\"env\": 0}\n\n# \u5728\u52a0\u8f7d\u7684\u73af\u5883\u4e2d\u4f7f\u7528\u53d8\u91cf\n{\"cmd\": \"example : Y = 37 := rfl\", \"env\": 0}\n{\"env\": 1}\n
\u4ece .olean
\u6587\u4ef6\u52a0\u8f7d\u9884\u5b9a\u4e49\u7684\u73af\u5883\u5e76\u4f7f\u7528\u5176\u4e2d\u7684\u53d8\u91cf\u3002
"},{"location":"tutorial/repl/#unsafe","title":"\u5bfc\u5165\u6a21\u5757\u548c\u4f7f\u7528 unsafe \u793a\u4f8b","text":"# \u5bfc\u5165 Lean \u6838\u5fc3\u5e93\u5e76\u6253\u5f00\u7f16\u8bd1\u5668\u547d\u540d\u7a7a\u95f4\n{\"cmd\": \"import Lean\"}\n{\"cmd\": \"open Lean.Compiler\", \"env\": 0}\n\n# \u4f7f\u7528 unsafe \u5b9a\u4e49\u5305\u542b sorry \u7684\u793a\u4f8b\n{\"cmd\": \"unsafe example : \u25fe := sorry\", \"env\": 1}\n\n# \u4fdd\u5b58\u73af\u5883\u72b6\u6001\n{\"pickleTo\": \"test/f.olean\", \"env\": 1}\n
\u5bfc\u5165\u6a21\u5757\u3001\u4f7f\u7528 unsafe \u5173\u952e\u5b57\uff0c\u4ee5\u53ca\u5c06\u73af\u5883\u72b6\u6001\u4fdd\u5b58\u5230\u6587\u4ef6\u3002\u8f93\u51fa\u4e2d\u5305\u542b\u4e86\u4e00\u4e9b\u7f16\u8bd1\u5668\u7684\u8ffd\u8e2a\u4fe1\u606f\uff08\u4f7f\u7528 traces
\u5b57\u6bb5\uff09\u548c\u91cd\u5199\u89c4\u5219\u7684\u5e94\u7528\u8fc7\u7a0b\u3002
"},{"location":"tutorial/repl/#pickle-unsafe","title":"Pickle \u793a\u4f8b\uff1a\u52a0\u8f7d\u73af\u5883\u5e76\u5b9a\u4e49 unsafe \u793a\u4f8b","text":"# \u4ece\u6587\u4ef6\u52a0\u8f7d\u73af\u5883\n{\"unpickleEnvFrom\": \"test/f.olean\"}\n\n# \u5728\u52a0\u8f7d\u7684\u73af\u5883\u4e2d\u5b9a\u4e49\u4e0d\u5b89\u5168\u793a\u4f8b\n{\"cmd\": \"unsafe example : \u25fe := sorry\", \"env\": 0}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 Nat\"}...]}\n
\u4ece\u6301\u4e45\u5316\u6587\u4ef6\u52a0\u8f7d\u73af\u5883\uff0c\u5e76\u5728\u8be5\u73af\u5883\u4e2d\u5b9a\u4e49\u4e00\u4e2a\u5e26\u6709 unsafe
\u6807\u8bb0\u7684\u793a\u4f8b\u3002
"},{"location":"tutorial/repl/#mathlib_1","title":"Mathlib \u793a\u4f8b","text":"\u4ee5\u4e0b\u793a\u4f8b\u6d89\u53ca Mathlib \u4f9d\u8d56\u3002
"},{"location":"tutorial/repl/#pickle_8","title":"\u6570\u5b66\u5b9a\u7406\u793a\u4f8b\uff1a\u4ee3\u6570\u8fd0\u7b97\u4e0e pickle","text":"# \u5bfc\u5165\u5fc5\u8981\u7684\u5e93\n{\"cmd\": \"import Mathlib\\nopen BigOperators\\nopen Real\\nopen Nat\"}\n{\"env\": 0}\n\n# \u5b9a\u4e49\u6570\u5b66\u5b9a\u7406\n{\"cmd\": \"theorem mathd_algebra_455\\n (x : Nat)\\n (h : 2 * (2 * (2 * (2 * x))) = 48) :\\n x = 3 := by sorry\", \"env\": 0}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"...\"}...]}\n\n# \u4fdd\u5b58\u8bc1\u660e\u72b6\u6001\n{\"pickleTo\": \"test/pickle.olean\", \"proofState\": 0}\n
\u8bbe\u7f6e\u4e00\u4e2a\u5305\u542b\u6570\u5b66\u8fd0\u7b97\u7684\u5b9a\u7406\uff0c\u5e76\u4f7f\u7528 pickle \u4fdd\u5b58\u8bc1\u660e\u72b6\u6001\uff0c\u4ee5\u4fbf\u540e\u7eed\u7ee7\u7eed\u5b8c\u6210\u8bc1\u660e\u3002
"},{"location":"tutorial/repl/#pickle_9","title":"Pickle \u793a\u4f8b\uff1a\u52a0\u8f7d\u5df2\u4fdd\u5b58\u7684\u8bc1\u660e\u72b6\u6001","text":"# \u4ece\u6587\u4ef6\u52a0\u8f7d\u8bc1\u660e\u72b6\u6001\n{\"unpickleProofStateFrom\": \"test/pickle.olean\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"x : Nat\\n\u22a2 x + 1 > x\"}...]}\n\n# \u5e94\u7528\u6570\u503c\u89c4\u8303\u5316\u7b56\u7565\n{\"tactic\": \"norm_num at h\", \"proofState\": 0}\n{\"proofState\": 1, \"goals\": [\n \"case zero\\n\u22a2 0 + 1 > 0\",\n \"case succ\\nx : Nat\\nhx : x + 1 > x\\n\u22a2 x + 1 + 1 > x + 1\"]}\n
\u4ece\u5df2\u4fdd\u5b58\u7684\u8bc1\u660e\u72b6\u6001\u6587\u4ef6\u4e2d\u6062\u590d\uff0c\u5e76\u7ee7\u7eed\u4f7f\u7528 norm_num
\u7b56\u7565\u8fdb\u884c\u6570\u503c\u89c4\u8303\u5316\u3002
"},{"location":"tutorial/repl/#_26","title":"\u590d\u6742\u793a\u4f8b\uff1a\u5b9e\u6570\u5206\u6790\u4e2d\u7684\u6307\u6570\u51fd\u6570\u4f30\u8ba1","text":"# \u5bfc\u5165\u6570\u5b66\u5e93\u5e76\u8bbe\u7f6e\u5e42\u8fd0\u7b97\u7b26\u53f7\n{\"cmd\": \"import Mathlib\\nopen Real\\nlocal macro_rules | `($x ^ $y) => `(HPow.hPow $x $y)\"}\n{\"env\": 0}\n\n# \u8bc1\u660e\u6307\u6570\u51fd\u6570\u7684\u8fd1\u4f3c\u4f30\u8ba1\u5b9a\u7406\n{\"cmd\": \"example {n} {x a b : \u211d} (m : \u2115) (e\u2081 : n + 1 = m) (rm : \u211d) (er : \u2191m = rm) \n (h : |x| \u2264 1) (e : |1 - a| \u2264 b - |x| / rm * ((rm + 1) / rm)) : \n |exp x - expNear n x a| \u2264 |x| ^ n / n.factorial * b := \n by apply Real.exp_approx_end' m e\u2081 rm er h e\", \n \"env\": 0}\n
\u4e00\u4e2a\u5173\u4e8e\u6307\u6570\u51fd\u6570\u8fd1\u4f3c\u4f30\u8ba1\u7684\u590d\u6742\u5b9a\u7406\uff0c\u4f7f\u7528 Real.exp_approx_end'
\u5b8c\u6210\u8bc1\u660e\u3002
"},{"location":"tutorial/repl/#_27","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u6570\u5b66\u5f52\u7eb3\u6cd5","text":"# \u5bfc\u5165\u5fc5\u8981\u7684\u7b56\u7565\u5e93\n{\"cmd\": \"import Mathlib.Tactic.Cases\"}\n{\"env\": 0}\n\n# \u4f7f\u7528\u5f52\u7eb3\u6cd5\u8bc1\u660e\u81ea\u7136\u6570\u6027\u8d28\n{\"cmd\": \"example {x : Nat} : x + 1 > x := by\\n induction' x with x hx\", \"env\": 0}\n{\"sorries\": [{\"proofState\": 0, \n \"goal\": \"x : \u2115\\nh : 2 * (2 * (2 * (2 * x))) = 48\\n\u22a2 x = 3\"}...]}\n
\u4f7f\u7528 induction'
\u7b56\u7565\u5bf9\u81ea\u7136\u6570\u8fdb\u884c\u5f52\u7eb3\u8bc1\u660e\u3002
"},{"location":"tutorial/repl/#_28","title":"\u6570\u8bba\u5b9a\u7406\u793a\u4f8b\uff1a\u4f7f\u7528\u5185\u7f6e\u7b56\u7565","text":"# \u5bfc\u5165\u5fc5\u8981\u7684\u5e93\n{\"cmd\": \"import Mathlib.Algebra.BigOperators.Group.Finset\\n...\"}\n{\"env\": 0}\n\n# GCD \u8ba1\u7b97\u793a\u4f8b\n{\"cmd\": \"theorem mathd_numbertheory_188 : Nat.gcd 180 168 = 12 := by norm_num\"}\n\n# \u8ba1\u7b97\u771f\u56e0\u5b50\u4e4b\u548c\n{\"cmd\": \"theorem mathd_numbertheory_403 : \u2211 k in (Nat.properDivisors 198), k = 270 := by simp...\"}\n\n# \u6570\u5217\u6c42\u548c\u53d6\u6a21\n{\"cmd\": \"theorem mathd_numbertheory_109 : (\u2211 k in Finset.Icc 1 100, v k) % 7 = 4 := by simp_rw...\"}\n
\u4f7f\u7528 Lean \u7684\u5185\u7f6e\u7b56\u7565\uff08norm_num
, simp
\uff09\u6765\u8bc1\u660e\u6570\u8bba\u76f8\u5173\u7684\u5b9a\u7406\uff0c\u5305\u62ec GCD \u8ba1\u7b97\u3001\u56e0\u5b50\u6c42\u548c\u548c\u6a21\u8fd0\u7b97\u3002
"},{"location":"tutorial/repl/#_29","title":"\u793a\u4f8b\uff1a\u5f52\u7eb3\u6cd5\u6846\u67b6","text":"# \u5bfc\u5165\u7b56\u7565\u5e93\n{\"cmd\": \"import Mathlib.Tactic.Cases\"}\n{\"env\": 0}\n\n# \u4f7f\u7528\u5f52\u7eb3\u6cd5\u8bc1\u660e\u81ea\u7136\u6570\u6027\u8d28\n{\"cmd\": \"example {x : Nat} : x + 1 > x := by\\n induction' x with x hx\\n all_goals sorry\", \"env\": 0}\n{\"env\": 0}\n
\u4f7f\u7528 induction'
\u7b56\u7565\u8bbe\u7f6e\u5f52\u7eb3\u8bc1\u660e\u7684\u57fa\u672c\u6846\u67b6\u3002\u867d\u7136\u8fd9\u91cc\u7528 sorry
\u8df3\u8fc7\u4e86\u5177\u4f53\u8bc1\u660e\u6b65\u9aa4\uff0c\u4f46\u5c55\u793a\u4e86\u5f52\u7eb3\u8bc1\u660e\u7684\u57fa\u672c\u7ed3\u6784\u3002
"},{"location":"tutorial/repl/#simpa","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528 simpa \u7b56\u7565","text":"# \u521b\u5efa False \u7684\u793a\u4f8b\u8bc1\u660e\n{\"cmd\": \"example : False := by sorry\"}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 False\"}...]}\n\n# \u4f7f\u7528 simpa \u7b56\u7565\n{\"tactic\": \"simpa using show False by done\", \"proofState\": 0}\n{\"sorries\": [...], \"proofState\": 3, \"goals\": [\n \"case pos\\nx : \u211d\\nh0 : |x| > 1...\",\n \"case neg\\nx : \u211d\\nh0 : |x| > 1...\"]}\n
\u4f7f\u7528 simpa
\u7b56\u7565\u7b80\u5316\u8bc1\u660e\u76ee\u6807\uff0c\u5e76\u901a\u8fc7 show
\u6307\u5b9a\u4e2d\u95f4\u7ed3\u679c\u3002
"},{"location":"tutorial/repl/#_30","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528\u5f52\u7eb3\u6cd5\u8bc1\u660e","text":"# \u5bfc\u5165 Mathlib \u5e76\u5b9a\u4e49\u5b9a\u7406\n{\"cmd\": \"import Mathlib\"}\n{\"env\" : 0, \"cmd\": \"theorem foo (x : Nat) : x = x := by sorry\"}\n\n# \u65b9\u5f0f\u4e00\uff1a\u4f7f\u7528 induction \u540e\u9010\u6b65\u5904\u7406\n{\"proofState\" : 0, \"tactic\": \"induction x\"} # \u5f52\u7eb3\n{\"proofState\" : 1, \"tactic\": \"next => rfl\"} # \u5904\u7406\u4e0b\u4e00\u4e2a\u5206\u652f\n\n# \u65b9\u5f0f\u4e8c\uff1a\u4f7f\u7528 induction with \u6a21\u5f0f\u5339\u914d\u8bed\u6cd5\n{\"proofState\" : 0, \"tactic\": \"induction x with\\n| zero => sorry\\n| succ x => sorry\"}\n
\u4e24\u79cd\u4f7f\u7528\u5f52\u7eb3\u6cd5\u7684\u65b9\u5f0f\uff1a\u9010\u6b65\u5904\u7406\u548c\u6a21\u5f0f\u5339\u914d\u8bed\u6cd5\u3002\u4e24\u79cd\u65b9\u5f0f\u90fd\u4f1a\u751f\u6210\u57fa\u7840\u60c5\u51b5\u548c\u5f52\u7eb3\u6b65\u9aa4\u7684\u8bc1\u660e\u76ee\u6807\u3002
"},{"location":"tutorial/repl/#_31","title":"\u6570\u5b66\u793a\u4f8b\uff1a\u5b9e\u6570\u7edd\u5bf9\u503c\u7684\u8ba8\u8bba","text":"# \u5bfc\u5165\u6570\u5b66\u5e93\u5e76\u6253\u5f00\u5b9e\u6570\u547d\u540d\u7a7a\u95f4\n{\"cmd\": \"import Mathlib\\nopen Real\"}\n\n# \u5b9a\u4e49\u5173\u4e8e\u5b9e\u6570\u7edd\u5bf9\u503c\u7684\u547d\u9898\n{\"cmd\": \"example {x : \u211d} (h0: |x| > 1) : (x < 0) \u2228 (2 * x > 2) := by sorry\", \"env\": 0}\n{\"sorries\": [{\"proofState\": 0, \"goal\": \"\u22a2 False\"}...]}\n\n# \u5c1d\u8bd5\u4f7f\u7528\u591a\u4e2a\u8f85\u52a9\u5f15\u7406\u548c\u5206\u7c7b\u8ba8\u8bba\n{\"tactic\": \"on_goal 1 =>\\n have h1 : x = x := by sorry\\n have h2 : x = x := by sorry\\n by_cases h3 : x < 0\", \"proofState\": 0}\n{\"proofState\": 1, \"messages\": [{\"data\": \"unsolved goals\\n\u22a2 False\"}...]}\n
\u5904\u7406\u6d89\u53ca\u5b9e\u6570\u7edd\u5bf9\u503c\u7684\u547d\u9898\uff0c\u4f7f\u7528 have
\u5f15\u5165\u8f85\u52a9\u5f15\u7406\u548c by_cases
\u8fdb\u884c\u5206\u7c7b\u8ba8\u8bba\uff08\u867d\u7136\u8fd9\u4e2a\u5c1d\u8bd5\u672a\u80fd\u5b8c\u6210\u8bc1\u660e\uff09\u3002
"},{"location":"tutorial/repl/#_32","title":"\u7b56\u7565\u793a\u4f8b\uff1a\u4f7f\u7528\u5f52\u7eb3\u6cd5\u8bc1\u660e","text":"# \u5bfc\u5165\u7b56\u7565\u5e93\n{\"cmd\": \"import Mathlib.Tactic.Cases\"}\n{\"env\": 0}\n\n# \u521b\u5efa\u5173\u4e8e\u81ea\u7136\u6570\u7684\u793a\u4f8b\u5b9a\u7406\n{\"cmd\": \"example {x : Nat} : x + 1 > x := by sorry\", \"env\": 0}\n\n# \u5e94\u7528\u5f52\u7eb3\u6cd5\u7b56\u7565\uff0c\u751f\u6210\u4e24\u4e2a\u5b50\u76ee\u6807\n{\"tactic\": \"induction' x with x hx\", \"proofState\": 0}\n{\"messages\": [{\"data\": \"unsolved goals\\n\n case zero\\n\u22a2 0 + 1 > 0\\n\n case succ\\nx : Nat\\nhx : x + 1 > x\\n\u22a2 x + 1 + 1 > x + 1\"}...]}\n
\u4f7f\u7528 induction'
\u7b56\u7565\u5bf9\u81ea\u7136\u6570\u8fdb\u884c\u5f52\u7eb3\u8bc1\u660e\uff0c\u751f\u6210\u57fa\u7840\u60c5\u51b5\u548c\u5f52\u7eb3\u6b65\u9aa4\u4e24\u4e2a\u5b50\u76ee\u6807\u3002
"},{"location":"tutorial/repl/#_33","title":"\u5bfc\u5165\u793a\u4f8b\uff1a\u4fdd\u5b58\u6570\u5b66\u5e93\u4f9d\u8d56\u73af\u5883","text":"# \u5bfc\u5165\u6570\u5b66\u5e93\u76f8\u5173\u6a21\u5757\n{\"cmd\": \"import Mathlib\\nopen BigOperators\\nopen Real\\nopen Nat\"}\n{\"env\": 0}\n\n# \u4fdd\u5b58\u73af\u5883\u5230\u6587\u4ef6\n{\"pickleTo\": \"test/H20231215.olean\", \"env\": 0}\n
\u5bfc\u5165 Mathlib \u76f8\u5173\u6a21\u5757\u5e76\u5c06\u73af\u5883\u6301\u4e45\u5316\u4fdd\u5b58\uff0c\u8fd9\u5bf9\u4e8e\u9700\u8981\u9891\u7e41\u4f7f\u7528\u6570\u5b66\u5e93\u7684\u8bc1\u660e\u5f88\u6709\u5e2e\u52a9\u3002
"},{"location":"tutorial/repl/#_34","title":"\u6570\u5b66\u8bc1\u660e\u793a\u4f8b\uff1a\u8ba1\u7b97\u590d\u5408\u51fd\u6570","text":"# \u5bfc\u5165\u5fc5\u8981\u7684\u5e93\n{\"cmd\": \"import Mathlib\\nopen Real\\nopen Nat\\nopen BigOperators\"}\n\n# \u5b9a\u4e49\u5b9a\u7406\uff1a\u5173\u4e8e\u590d\u5408\u51fd\u6570 p(q(2)) \u7684\u8ba1\u7b97\n{\"cmd\" : \"theorem mathd_algebra_35\n (p q : \u211d \u2192 \u211d)\n (h\u2080 : \u2200 x, p x = 2 - x^2)\n (h\u2081 : \u2200 x, x \u2260 0 -> q x = 6 / x) :\n p (q 2) = -7 := by sorry\", \"env\": 0}\n\n# \u5c1d\u8bd5\u8bc1\u660e\u6b65\u9aa4\uff08\u672a\u5b8c\u6210\uff09\n{\"tactic\": \"have hQ : \u2200 x, p x = 6 / x\", \"proofState\": 0}\n{\"tactic\": \" intro x\", \"proofState\": 1}\n{\"tactic\": \" calc p x = 6 / x * p x := h\u2080 (x)...\", \"proofState\": 2}\n
\u4e00\u4e2a\u6570\u5b66\u8bc1\u660e\u7684\u5f00\u59cb\uff0c\u6d89\u53ca\u5b9e\u6570\u51fd\u6570\u7684\u590d\u5408\u8ba1\u7b97\uff0c\u5c3d\u7ba1\u8bc1\u660e\u5c1a\u672a\u5b8c\u6210\u3002
"},{"location":"tutorial/repl/#_35","title":"\u793a\u4f8b\uff1a\u4f7f\u7528\u5df2\u4fdd\u5b58\u7684\u73af\u5883\u72b6\u6001","text":"# \u52a0\u8f7d\u4fdd\u5b58\u7684\u73af\u5883\u72b6\u6001\n{\"unpickleEnvFrom\": \"test/H20231215.olean\"}\n{\"env\": 0}\n\n# \u5728\u52a0\u8f7d\u7684\u73af\u5883\u4e2d\u5b9a\u4e49\u65b0\u5b9a\u7406\n{\"cmd\": \"theorem mathd_numbertheory_739 :\\n 9! % 10 = 0 := by sorry\", \"env\": 0}\n{\"env\": 1}\n
\u4f7f\u7528 pickle \u529f\u80fd\u52a0\u8f7d\u9884\u5148\u4fdd\u5b58\u7684\u73af\u5883\u72b6\u6001\uff0c\u5e76\u5728\u5176\u57fa\u7840\u4e0a\u5b9a\u4e49\u65b0\u7684\u5b9a\u7406\u3002
"},{"location":"tutorial/repl/#exact","title":"exact? \u7b56\u7565\u793a\u4f8b\uff1a\u81ea\u52a8\u63a8\u5bfc","text":"# \u5bfc\u5165 Mathlib\n{\"cmd\": \"import Mathlib\"}\n\n# \u6d4b\u8bd5\u7b80\u5355\u5b9a\u7406\uff1a0 < 1\n{\"cmd\": \"theorem test : 0 < 1 := by sorry\", \"env\": 0}\n{\"tactic\": \"exact?\", \"proofState\": 0} # exact? \u81ea\u52a8\u627e\u5230\u8bc1\u660e\n\n# \u6d4b\u8bd5\u4e0d\u53ef\u80fd\u7684\u5b9a\u7406\uff1a3 = 7\n{\"cmd\": \"theorem test : 3 = 7 := by sorry\", \"env\": 0}\n{\"tactic\": \"exact?\", \"proofState\": 2} # exact? \u65e0\u6cd5\u627e\u5230\u8bc1\u660e\n
exact?
\u7b56\u7565\u7684\u81ea\u52a8\u63a8\u5bfc\u80fd\u529b\uff1a\u5bf9\u4e8e\u663e\u7136\u6210\u7acb\u7684\u547d\u9898\u80fd\u81ea\u52a8\u627e\u5230\u8bc1\u660e\uff0c\u5bf9\u4e8e\u660e\u663e\u9519\u8bef\u7684\u547d\u9898\u5219\u65e0\u6cd5\u5b8c\u6210\u8bc1\u660e\u3002
"}]}
\ No newline at end of file
diff --git a/dev/tutorial/elan-lake/index.html b/dev/tutorial/elan-lake/index.html
index 7306fba..4c5b0e4 100644
--- a/dev/tutorial/elan-lake/index.html
+++ b/dev/tutorial/elan-lake/index.html
@@ -1,4 +1,4 @@
- Lean4 工具链 - Lean Prover 中文文档
Lean 工具链使用指南 前边通过安装指南 安装了 Lean 开发的三件套:版本管理器 elan + 包管理器和构建工具 lake + 语言本身的核心组件 lean 。下边分别介绍这三个工具的基本用法。
这种设计与其他编程语言类似,如 Rust(rustup + cargo + rustc)或 Node.js(nvm + npm + node)。
elan 常用功能 elan 是 Lean 版本管理器,用于安装、管理和切换不同版本的 Lean。
版本管理:
elan --version # 输出版本号来测试安装是否成功
+ Lean4 工具链 - Lean Prover 中文文档
Lean 工具链使用指南 上篇 安装 Lean4 提到了 Lean 项目开发的三件套:版本管理器 elan + 包管理器和构建工具 lake + 语言本身的核心组件 lean 。下边分别介绍这三个工具的基本用法。
这类设计与其他编程语言类似,如 Rust(rustup + cargo + rustc)或 Node.js(nvm + npm + node)。
elan 常用功能 elan 是 Lean 版本管理器,用于安装、管理和切换不同版本的 Lean。
版本管理:
elan --version # 输出版本号来测试安装是否成功
elan self update # 更新 elan
elan show # 显示已安装的 Lean 版本
@@ -15,7 +15,7 @@
# 设置在当前目录下使用的 Lean 版本
elan override set leanprover/lean4:stable
# info: info: override toolchain for 'xxx' set to 'leanprover/lean4:stable'
-
指定版本运行 lake
或 lean
命令:
lake --version # 使用 elan 默认版本
+
指定版本运行 lake
或 lean
命令:
lake --version # 使用 elan 默认版本
# 使用指定版本
elan run leanprover/lean4:v4.10.0 lake --version
elan run leanprover/lean4:v4.10.0 lean --version