File tree 1 file changed +46
-0
lines changed
1 file changed +46
-0
lines changed Original file line number Diff line number Diff line change @@ -57,3 +57,49 @@ example (P : Prop) : P → P := by
57
57
exact h
58
58
59
59
end --#
60
+ /- また、(驚くべきことに)タクティクマクロの中で導入した識別子だけでなく、「参照した」識別子についても Lean が自動的に衝突を回避します。 -/
61
+ section --#
62
+
63
+ /-- exfalso タクティクを真似て自作したタクティク -/
64
+ macro "my_exfalso" : tactic => `(tactic| apply False.elim)
65
+
66
+ namespace Foo
67
+
68
+ /-- `False.elim` とめっちゃよく似た名前の紛らわしい定理 -/
69
+ theorem False.elim : 1 + 1 = 2 := by rfl
70
+
71
+ example (_h : False) : 1 + 1 = 2 := by
72
+ -- 普通に `apply` すると上の紛らわしい定理の方が使われてしまう
73
+ apply False.elim
74
+
75
+ done
76
+
77
+ example (h : False) : 1 + 1 = 2 := by
78
+ -- 実行した環境ではなくて宣言した環境における `False.elim` が使われる。
79
+ -- 紛らわしい方の定理は使われない!
80
+ my_exfalso
81
+
82
+ show False
83
+ contradiction
84
+
85
+ end Foo
86
+
87
+ -- マクロ衛生を保つ機能を無効にする
88
+ set_option hygiene false
89
+
90
+ /-- マクロ衛生が無効になったバージョンの `my_exfalso` -/
91
+ macro "my_exfalso'" : tactic => `(tactic| apply False.elim)
92
+
93
+ namespace Bar
94
+
95
+ /-- `False.elim` とめっちゃよく似た名前の紛らわしい定理 -/
96
+ theorem False.elim : 1 + 1 = 2 := by rfl
97
+
98
+ example (_h : False) : 1 + 1 = 2 := by
99
+ -- 紛らわしい方の `False.elim` が使われてしまう。
100
+ my_exfalso'
101
+
102
+ done
103
+
104
+ end Bar
105
+ end --#
You can’t perform that action at this time.
0 commit comments