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

\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

  1. \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
  2. \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

\u8fdb\u884c\u4e2d

\u8ba1\u5212\u8fdb\u884c

"},{"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

\u8ba1\u7b97\u673a\u5bfc\u5411\uff1a

\u5176\u4ed6\u63a8\u8350\uff1a

"},{"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

  1. 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
  2. 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
  3. 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

"},{"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

\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

  1. 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
  2. Title \"My Game\"\uff1a\u8bbe\u7f6e\u6e38\u620f\u7684\u6807\u9898\u3002
  3. Introduction\uff1a\u5728\u4e16\u754c\u9009\u62e9\u754c\u9762\u65c1\u663e\u793a\u7684\u4ecb\u7ecd\u6587\u672c\u3002
  4. 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
  5. 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
  6. 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

"},{"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

"},{"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

\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

  1. \u5b89\u88c5 NPM:

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash\nsource ~/.bashrc\nnvm install 20\n

  2. \u514b\u9686 Lean4web \u4ed3\u5e93:

    sudo apt-get install git\ngit clone --recurse-submodules https://github.com/leanprover-community/lean4web.git\n

  3. \u5b89\u88c5 Bubblewrap \u4ee5\u589e\u5f3a\u5b89\u5168\u6027:

    sudo apt-get install bubblewrap\n

  4. \u56de\u5230\u4ed3\u5e93\u76ee\u5f55\uff0c\u5b89\u88c5\u4f9d\u8d56\u5e76\u7f16\u8bd1:

    cd lean4web\nnpm install\nnpm run build\n

  5. \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

"},{"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

"},{"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

"},{"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

\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

"},{"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

"},{"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

"},{"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

"},{"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

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":""},{"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

  1. \u514b\u9686\u4ed3\u5e93\u5230 TMP_DIR \u76ee\u5f55\uff0c\u5e76\u6267\u884c lake build \u8fdb\u884c\u6784\u5efa\u3002
  2. \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
  3. \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
  4. \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
  5. \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

\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

"},{"location":"tutorial/lean4-jupyter/","title":"Lean4 Juptyer | TODO","text":"

\u57fa\u4e8e REPL \u7684 Jupyter Kernel\u3002

"},{"location":"tutorial/pantograph/","title":"Pantograph \uff5c TODO","text":"

Links:

"},{"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

  1. \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
  2. \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
  3. \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

  1. \u5b9a\u4e49 f1 := 37\uff0c\u521b\u5efa\u65b0\u73af\u5883 env 0
  2. \u57fa\u4e8e env 0 \u6dfb\u52a0\u5b9a\u4e49 f2 := 37\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 1
  3. \u57fa\u4e8e env 1 \u6dfb\u52a0\u5b9a\u4e49 f3 := f1 + f2\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 2
  4. \u57fa\u4e8e env 1 \u6267\u884c\u76f8\u540c\u64cd\u4f5c\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 3
  5. \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

  1. \u72b6\u6001\u521b\u5efa\uff1a\u4f7f\u7528 sorry \u521b\u5efa\u8bc1\u660e\u5360\u4f4d\u7b26\uff0c
  2. \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
  3. \u591a\u76ee\u6807\u5904\u7406\uff1a\u652f\u6301 pick \u6307\u5b9a\u76ee\u6807\u6765\u8fdb\u884c\u4e0b\u4e00\u6b65\u8bc1\u660e
  4. \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

  1. \u4fdd\u5b58\u73af\u5883/\u72b6\u6001\uff08pickleTo\uff09
  2. \u52a0\u8f7d\u72b6\u6001\uff08unpickleProofStateFrom\uff09
  3. \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

  1. \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
  1. \u66f4\u65b0\u5e76\u6784\u5efa\uff1a
lake update -R && lake exe cache get && lake build\n
  1. \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

\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

  1. \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
  2. \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

\u8fdb\u884c\u4e2d

\u8ba1\u5212\u8fdb\u884c

"},{"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

\u8ba1\u7b97\u673a\u5bfc\u5411\uff1a

\u5176\u4ed6\u63a8\u8350\uff1a

"},{"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

  1. 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
  2. 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
  3. 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

"},{"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

\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

  1. 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
  2. Title \"My Game\"\uff1a\u8bbe\u7f6e\u6e38\u620f\u7684\u6807\u9898\u3002
  3. Introduction\uff1a\u5728\u4e16\u754c\u9009\u62e9\u754c\u9762\u65c1\u663e\u793a\u7684\u4ecb\u7ecd\u6587\u672c\u3002
  4. 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
  5. 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
  6. 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

"},{"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

"},{"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

\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

  1. \u5b89\u88c5 NPM:

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash\nsource ~/.bashrc\nnvm install 20\n

  2. \u514b\u9686 Lean4web \u4ed3\u5e93:

    sudo apt-get install git\ngit clone --recurse-submodules https://github.com/leanprover-community/lean4web.git\n

  3. \u5b89\u88c5 Bubblewrap \u4ee5\u589e\u5f3a\u5b89\u5168\u6027:

    sudo apt-get install bubblewrap\n

  4. \u56de\u5230\u4ed3\u5e93\u76ee\u5f55\uff0c\u5b89\u88c5\u4f9d\u8d56\u5e76\u7f16\u8bd1:

    cd lean4web\nnpm install\nnpm run build\n

  5. \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

"},{"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

"},{"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

"},{"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

\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

"},{"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

"},{"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

"},{"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

"},{"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

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":""},{"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

  1. \u514b\u9686\u4ed3\u5e93\u5230 TMP_DIR \u76ee\u5f55\uff0c\u5e76\u6267\u884c lake build \u8fdb\u884c\u6784\u5efa\u3002
  2. \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
  3. \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
  4. \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
  5. \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

\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

"},{"location":"tutorial/lean4-jupyter/","title":"Lean4 Juptyer | TODO","text":"

\u57fa\u4e8e REPL \u7684 Jupyter Kernel\u3002

"},{"location":"tutorial/pantograph/","title":"Pantograph \uff5c TODO","text":"

Links:

"},{"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

  1. \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
  2. \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
  3. \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

  1. \u5b9a\u4e49 f1 := 37\uff0c\u521b\u5efa\u65b0\u73af\u5883 env 0
  2. \u57fa\u4e8e env 0 \u6dfb\u52a0\u5b9a\u4e49 f2 := 37\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 1
  3. \u57fa\u4e8e env 1 \u6dfb\u52a0\u5b9a\u4e49 f3 := f1 + f2\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 2
  4. \u57fa\u4e8e env 1 \u6267\u884c\u76f8\u540c\u64cd\u4f5c\uff0c\u5e76\u521b\u5efa\u65b0\u73af\u5883 env 3
  5. \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

  1. \u72b6\u6001\u521b\u5efa\uff1a\u4f7f\u7528 sorry \u521b\u5efa\u8bc1\u660e\u5360\u4f4d\u7b26\uff0c
  2. \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
  3. \u591a\u76ee\u6807\u5904\u7406\uff1a\u652f\u6301 pick \u6307\u5b9a\u76ee\u6807\u6765\u8fdb\u884c\u4e0b\u4e00\u6b65\u8bc1\u660e
  4. \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

  1. \u4fdd\u5b58\u73af\u5883/\u72b6\u6001\uff08pickleTo\uff09
  2. \u52a0\u8f7d\u72b6\u6001\uff08unpickleProofStateFrom\uff09
  3. \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

  1. \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
  1. \u66f4\u65b0\u5e76\u6784\u5efa\uff1a
lake update -R && lake exe cache get && lake build\n
  1. \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 中文文档
Skip to content

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'
-

指定版本运行 lakelean 命令:

lake --version # 使用 elan 默认版本
+

指定版本运行 lakelean 命令:

lake --version # 使用 elan 默认版本
 # 使用指定版本
 elan run leanprover/lean4:v4.10.0 lake --version
 elan run leanprover/lean4:v4.10.0 lean --version