Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Examples/Declarative/Infix.lean
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@ scoped infix:60 " ⋄ " => Nat.mul

#guard 2 ⋄ 3 = 6

/- `:` の後に付けている数字はパース優先度で、高いほど結合するタイミングが早くなります。等号 `=` のパース優先度は 50 であることを覚えておくと良いかもしれません。-/
/- `:` の後に付けている数字はパース優先順位で、高いほど結合するタイミングが早くなります。等号 `=` のパース優先順位は 50 であることを覚えておくと良いかもしれません。-/

-- 等号より微妙にパース優先度が高い
-- 等号より微妙にパース優先順位が高い
scoped infix:51 " strong " => Nat.add

-- きちんと 1 + (2 strong 3) = 6 と解釈される。
-- これは、 等号のパース優先度が 51 未満であることを意味する
-- これは、 等号のパース優先順位が 51 未満であることを意味する
#check 1 + 2 strong 3 = 6

-- パース優先度を 50 より小さくすると等号より低くなる
-- パース優先順位を 50 より低くすると等号より低くなる
-- したがってエラーになる
scoped infix:49 " weak " => Nat.add

Expand Down
36 changes: 18 additions & 18 deletions Examples/Declarative/Notation.lean
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ set_option pp.notation false

end

/- ## パース優先度
`notation` で記法を定義するときに、その記法の他の演算子などと比べたパース優先度(parsing precedence)を数値で指定することができます。パース優先度が高い演算子ほど、他の演算子より先に適用されます。言い換えれば、パース優先度を正しく設定することにより、括弧を省略しても意図通りに式が解釈されるようにすることができます。
/- ## パース優先順位
`notation` で記法を定義するときに、その記法の他の演算子などと比べたパース優先順位(parsing precedence)を数値で指定することができます。パース優先順位が高い演算子ほど、他の演算子より先に適用されます。言い換えれば、パース優先順位を正しく設定することにより、括弧を省略しても意図通りに式が解釈されるようにすることができます。
-/

/-- 結合が弱い方。中身は足し算 -/
Expand All @@ -46,7 +46,7 @@ notation:0 a:0 " weak " b:0 => Nat.add a b
notation:70 a:70 " strong " b:70 => Nat.mul a b

example : (3 weak 1 strong 2) = 5 := calc
-- weak と strong のパース優先度は strong の方が高いので、
-- weak と strong のパース優先順位は strong の方が高いので、
-- まず 1 strong 2 が計算されて 2 になり、
_ = (3 weak 2) := rfl
-- その後 3 weak 2 が計算されて 5 になる。
Expand All @@ -56,11 +56,11 @@ example : (2 strong 2 weak 3) = 7 := calc
_ = (4 weak 3) := rfl
_ = 7 := rfl

/- ### プレースホルダのパース優先度
プレースホルダのパース優先度の数字は、「この位置に来る記号は、指定された数字以上のパース優先度を持たなければならない」ことを意味します。下記の例の場合、仮に右結合になるとすると `LXOR` 自身のパース優先度が `60` でしかなくて `61` 以上という制約を満たさないため、右結合になることがありえないことがわかります。
/- ### プレースホルダのパース優先順位
プレースホルダのパース優先順位の数字は、「この位置に来る記号は、指定された数字以上のパース優先順位を持たなければならない」ことを意味します。下記の例の場合、仮に右結合になるとすると `LXOR` 自身のパース優先順位が `60` でしかなくて `61` 以上という制約を満たさないため、右結合になることがありえないことがわかります。
-/

-- 右側のプレースホルダのパース優先度を1だけ大きくした
-- 右側のプレースホルダのパース優先順位を1だけ高くした
notation:60 a:60 " LXOR " b:61 => !a && b

-- 左結合だった場合の値
Expand All @@ -83,13 +83,13 @@ notation:60 a:61 " RXOR " b:60 => a && !b
-- 右結合になることがわかる
#guard true RXOR false RXOR true = true

/- ### パース優先度を省略した場合
パース優先度を省略することもできるのですが、とても意外な挙動になるので推奨できません。なるべく全てのパース優先度を指定してください。-/
/- ### パース優先順位を省略した場合
パース優先順位を省略することもできるのですが、とても意外な挙動になるので推奨できません。なるべく全てのパース優先順位を指定してください。-/

/-- パース優先度を全く指定しないで定義した記法。中身はべき乗 -/
/-- パース優先順位を全く指定しないで定義した記法。中身はべき乗 -/
notation a " bad_pow " b => Nat.pow a b

-- bad_pow のパース優先度は weak (優先度0)よりも低い?
-- bad_pow のパース優先順位は weak (優先順位0)よりも低い?
example : (2 bad_pow 1 weak 3) = 16 := calc
_ = (2 bad_pow 4) := rfl
_ = 16 := rfl
Expand All @@ -106,22 +106,22 @@ example : (2 weak 3 bad_pow 1 weak 2) = 29 := calc
_ = (2 weak 27) := rfl
_ = 29 := rfl

/- パース優先度を一部だけ指定しても効果がなく、強制的に右結合扱いになります。-/
/- パース優先順位を一部だけ指定しても効果がなく、強制的に右結合扱いになります。-/

/-- プレースホルダのパース優先度を省略した weak -/
/-- プレースホルダのパース優先順位を省略した weak -/
notation:20 a " bad_weak" b => Nat.add a b

/-- プレースホルダのパース優先度を省略した strong -/
/-- プレースホルダのパース優先順位を省略した strong -/
notation:70 a " bad_strong " b => Nat.mul a b

-- bad_strong の方がパース優先度が高いと思いきや
-- bad_strong の方がパース優先順位が高いと思いきや
-- 右結合になるので bad_weak の方が先に適用されてしまう
example : (2 bad_strong 2 bad_weak 3) = 10 := calc
_ = (2 bad_strong 5) := rfl
_ = 10 := rfl

/- ## 記法の重複問題
`notation` を使って定義した記法のパース優先度が意図通りに反映されないことがあります。-/
`notation` を使って定義した記法のパース優先順位が意図通りに反映されないことがあります。-/
section --#

-- 排他的論理和の記号を定義
Expand All @@ -130,7 +130,7 @@ local notation:60 x:60 " ⊕ " y:61 => xor x y
-- メタ変数を表示させないため
set_option pp.mvars false

-- 等号(パース優先度 50)より優先度が低いという問題でエラーになる
-- 等号(パース優先順位 50)より優先順位が低いという問題でエラーになる
-- 上では60で定義しているのに、なぜ?
#check_failure true ⊕ true = false

Expand All @@ -139,10 +139,10 @@ set_option pp.mvars false

end --#

/- ここでのエラーの原因は、記法が被っていることです。`⊕` という記法は型の直和に対して既に使用されており、直和記法のパース優先度が等号より低いためにエラーが発生していました。-/
/- ここでのエラーの原因は、記法が被っていることです。`⊕` という記法は型の直和に対して既に使用されており、直和記法のパース優先順位が等号より低いためにエラーが発生していました。-/

-- 集合の直和の記号と被っていた。
-- 集合の直和記号は等号よりパース優先度が低いからエラーになっていた
-- 集合の直和記号は等号よりパース優先順位が低いからエラーになっていた
#check Nat ⊕ Fin 2

/- この問題の解決策は、まず第一に括弧を付けることですが、裏技として記法を上書きしてしまうこともできます。-/
Expand Down
6 changes: 3 additions & 3 deletions Examples/Declarative/Syntax.lean
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ syntax "#greet" : command
macro_rules
| `(command| #greet) => `(#eval "Hello, Lean!")

/- ## パース優先度
/- ## パース優先順位
`syntax` コマンドは Lean に新しい構文解析ルールを追加するので、既存の構文と衝突して意図通りに解釈されないことがあります。
-/
section
Expand All @@ -57,10 +57,10 @@ Additional diagnostic information may be available using the `set_option diagnos
#check_failure (1 + 1 = 2 as Nat)

end
/- パース優先度(parsing precedence)を設定することで、どの構文から順に解釈されるかを指定することができ、問題を修正できることがあります。このあたりは [`notation`](./Notation.md) コマンドと同様です。 -/
/- パース優先順位(parsing precedence)を設定することで、どの構文から順に解釈されるかを指定することができ、問題を修正できることがあります。このあたりは [`notation`](./Notation.md) コマンドと同様です。 -/
section

-- 十分低いパース優先度を設定する
-- 十分低いパース優先順位を設定する
local syntax:10 term:10 " = " term:10 " as " term:10 : term

local macro_rules
Expand Down