Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rflの解説について #7

Closed
iehality opened this issue Oct 4, 2023 · 8 comments · Fixed by #8
Closed

rflの解説について #7

iehality opened this issue Oct 4, 2023 · 8 comments · Fixed by #8

Comments

@iehality
Copy link
Contributor

iehality commented Oct 4, 2023

現在の記述 https://lean-ja.github.io/tactic-cheetsheet/rfl.html ではrflは項のdefinitional equalityを証明するもののように書かれていますが, ドキュメント https://leanprover-community.github.io/mathlib4_docs//Mathlib/Tactic/Relation/Rfl.html によるとこれは refl attributeのついた定理を用いて関係の反射性を示すといったほうが正確ではないかと思います。例えば以下のように順序の反射性を証明することが可能です.

example (n : ℕ) : n ≤ n := by rfl
@Seasawher
Copy link
Member

Seasawher commented Oct 4, 2023

ありがとうございます

たしかに @[refl] で登録されたレンマを使用するという情報があった方がいいですね.

また現状で「定義そのまま」になっている一言説明も,「反射性を示す」など反射性という言葉を使った方がよさそうですね.

修正方針に問題ありませんので,よろしければPR を出していただきたいです。

@iehality
Copy link
Contributor Author

iehality commented Oct 5, 2023

私自身も勘違いしていたのですが, Mathlib.Tactic.Relation.Rflを含むMathlibのファイルをimportした場合rflLean.MVarId.rflを参照しますが, そうでないときはLean.MVarId.reflを参照するようです(前者は@[refl]が証明された一般の関係の反射性を証明できますが, 後者は_ = _の等価性のみ証明します).

ringなどMathlib限定のtacticも多く解説されているので, ここではMathlibだけの用法だけでも良い気がしますが, 後者についても触れておくべきでしょうか?

@Seasawher
Copy link
Member

全然知りませんでした.ありがとうございます.

ringなどMathlib限定のtacticも多く解説されているので, ここではMathlibだけの用法だけでも良い気がしますが, 後者についても触れておくべきでしょうか?

確かに Mathlib 依存のタクティクも紹介していますが,Mathlib 等のライブラリに依存するタクティクはそれを明示するというルールで今まで運用してきました.したがって,rfl の Mathlib 依存挙動だけを紹介すると,今度は「Mathlib を import しなくても rfl が使える...?」という混乱を招きそうです.

かといって Mathlib 依存の挙動を無視すると「Mathlib のDocumentの記述と違う!」という混乱を招きます.

両方に触れるしかないと思います.

rfl の挙動が変わることを示す MWE を提供していただけると助かります.

@iehality
Copy link
Contributor Author

iehality commented Oct 5, 2023

参照される関数が不適切だったため前の返信を修正しました.

rflの挙動については, Mathlibをimportした場合例えば以下の証明は両方可能です.

import Mathlib.Data.Nat.Basic

example (n : Nat) : n = n := by rfl

example (n : Nat) : n ≤ n := by rfl

一方importを外すと下の証明にエラーが発生します.

example (n : Nat) : n = n := by rfl

example (n : Nat) : n ≤ n := by rfl -- error
/-
tactic 'rfl' failed, equality expected
  Nat.le n n

n: Nat
⊢ n ≤ n
-/

@Seasawher
Copy link
Member

Seasawher commented Oct 5, 2023

ありがとうございます.Mathlib 側の rfl の方が真に強く,Mathlib なしの rfl で示せることは Mathlib ありでも示せるという認識で相違ないでしょうか?(つまり,import 文を追加することによりコンパイルが通らなくなる現象は起きない)

もしそうであれば,いまある Examples/Rfl.lean に上記の例と import 文を追記して,markdown 側に Mathlib を import することにより示せる命題が増えることに言及する文章を追加するとよさそうです.

ext タクティクも「タクティク使用に必要なライブラリ」と「タクティクで示せる命題を増やすのに必要なライブラリ」が異なっているので,ext の記述に似せて修正するといいかと思いました.

@Seasawher
Copy link
Member

ところで相談なのですが,下記のコードは通らないようです.参照先のタクティクの違いというより,@[refl] がついているレンマのうち必要なものがインポートされているかどうかで,通るかどうかが変わってきているのではないでしょうか…?

import Mathlib.Tactic.Relation.Rfl

example (n : Nat) : n ≤ n := by rfl

@iehality
Copy link
Contributor Author

iehality commented Oct 5, 2023

Mathlib 側の rfl の方が真に強く,Mathlib なしの rfl で示せることは Mathlib ありでも示せるという認識で相違ないでしょうか?(つまり,import 文を追加することによりコンパイルが通らなくなる現象は起きない)

そのように理解しています.

ところで相談なのですが,下記のコードは通らないようです.参照先のタクティクの違いというより,@[refl] がついているレンマのうち必要なものがインポートされているかどうかで,通るかどうかが変わってきているのではないでしょうか…?

extなどと同様に, @[refl]のついた補題がimportに含まれていることは必要だと思います. しかし_ = _でない関係の反射性を示すにはMathlib.Tactic.Relation.Rflが(本質的に)必要だろうと思います.

以下の例は@[refl]の証明も含んだコードですが, importがないと通りません(そもそもrefl attributeがMathlibで定義されているので, 6行目にエラーが発生します).

import Mathlib.Tactic.Relation.Rfl

inductive MyEq {α : Type u} : α → α → Prop
  | refl (a : α) : MyEq a a

attribute [refl] MyEq.refl

example (n : ℕ) : MyEq n n := by rfl

@Seasawher
Copy link
Member

ありがとうございます.そろそろ PR を作ってみます.

@Seasawher Seasawher linked a pull request Oct 5, 2023 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants