えびちゃんの日記

えびちゃん(競プロ)の日記です。

「任意の」を「全ての」と読み替えさせる風潮に対するお気持ち表明

「任意の」の気持ちがわかっていないまま、そういう文を読まされるのもつらいと思うので書きます。

言葉の意味に関して

「任意の \(x\in S\) に対して \(P(x)\) が成り立つ」と言ったとき、これを「全ての \(x\in S\) に対して \(P(x)\) が成り立つ」と読み替えないとちゃんと解釈できない人がいるようです。「数学における「任意の」は「全ての」という意味」などと教えるのはよくないような気がしています。

「\(S\) から任意に選ぶ」と言ったとき、「\(P(x)\) を成り立たせるように自由に選ぶ」という意味合いはないです。 どちらかというと、「\(P(x)\) が成り立ってほしくない人が \(S\) から自由に選んでも、\(P(x)\) が成り立ってしまう」という方が近いかもしれません。

「全ての」と読み替えたとしても、証明の段階になると「\(x\in S\) を固定する」などといったことをする必要があり、それなら最初から「任意の」の気持ちでいた方が自然なのでは?と思ってしまいます。

また、「任意の \(x\in S\) を選ぶ」などの文脈では「全ての \(x\in S\) を選ぶ」とはできず、うまくいかない気もします。

空の場合に関して

たとえば、「任意の \(x\in S\) について \(x\) が偶数であるとき、\(S\) を偶数集合と呼ぶ*1」としてみます。

\(\{2, 6, 12\}\) を見た初心者は「\(2\) も \(6\) も \(12\) も偶数なので、それは偶数集合であるなあ」となるし、\(\{4, 3\}\) を見た初心者は「\(4\) は偶数だけど \(3\) は偶数ではないからこれは偶数集合ではないなあ」となるでしょう。

このとき、\(\{2, 6, 12\}\) に関しては “偶数集合っぽい根拠” として \(2\) などがあるので安心感がありそうですが、空集合 \(\emptyset = \{\}\) ではそうした根拠っぽい要素がないため、不安になる人もいるような気がします*2

実際には、「任意の \(x\in S\) に対して \(P(x)\) が成り立つ」と言ったとき、「実際に何らかの \(x\in S\) が存在して \(P(x)\) を満たす」という必要はないため、そうした根拠を探す必要はありません。

擬似コードで言えば、次のようなイメージです。

fn for_any(s: Set, p: Predicate) -> bool {
    for x in s {
        if p(x) {
            continue; // ok, do nothing
        }
        return false; // bad element found
    }
    true // no element is bad
}

s が空のときは true になりますね。

あるいは、「任意の \(x\in S\) について \(P(x)\) が成り立つ」の否定は「ある \(x\in S\) が存在して \(P(x)\) が成り立たない(\(\neg P(x)\) が成り立つ*3)」となりますが、空のときは \(\neg P(x)\) が成り立つような要素が(\(S\) が空なので)存在せず、これは偽となります。 否定した命題が偽だったので、元の命題は真であるとわかります。

先の初心者の気持ちに基づく「\(S\) の中にそれっぽい要素がないから、「任意の〜」は偽?」だと辻褄が合わないことがわかりますね。

ところで、vacuous truth という用語があるようです。

別の例

配列 \(a = (a_0, a_1, \dots, a_{n-1})\) に対し、任意の \(1\le i \lt n\) について \(a_{i-1}\lt a_i\) が成り立つなら \(a\) は単調増加であると言う。

このとき、要素が 1 つしかない配列 \(a = (a_0)\) は単調増加と言えるでしょうか?

\(n = 1\) なので、任意の \(1\le i\lt 1\) について \(a_{i-1}\lt a_i\) が成り立つ必要がありますが、そのような \(i\) は存在しない(\(\{i\mid 1\le i\lt 1\} = \emptyset\))ので、これは自明に*4真であり、\(a\) は単調増加と言えます。

\(n = 0\) である空の配列 \( ()\) についても同様です。

英語に関して

「任意の \(x\) に対して〜」の文脈で、英語だと “For any \(x\in S\), \(P(x)\) holds.” とか言ったりします。「どう選んでも満たす」感がある気がします。

一方で、“If any element satisfies the predicate, ...” と言ったとき、「何らかの要素がその述語を満たすなら、」となり、「ある○○が存在して」の意味で any が使われているので注意が必要かもしれません。「どれかしらが満たすなら」感がありそうです。

If の文脈で「任意の要素が」と言いたいときは “If every element satisfies the predicate, ...” とか言える気がします。

イテレータや配列の全ての値が条件を満たす・条件を満たす要素があるか判定する関数が慣例的に all any命名されがちですが、混乱する人もいそうです。 JavaScript では every some命名されており、曖昧じゃなさそう感があります。

「every や each などは個々を意識しており、all は全体として指している」のような話があった気もします。証明の際にも個々を意識して(要素を固定して)いますね。any も前者側だと思います。

関連?

よく「\(0.999\ldots = 1\)」というのが直感に沿わない(\(0.999\ldots \lt 1\) な気がするもん)という話がありますが、これと同様、記法や言葉の定義を知らないまま「任意と言いつつ自由に選べないのは変な気がするもん」と言って「全ての」と言い換えようとするのはよくなさそうな気がします。

定義を知った上でも自分の直感に沿わない場合は、その表現を常用している人がどういう直感を持っているか考えてみるとよいかもしれません。

おまけ

おわり

にゃんい

*1:適当に命名しました。

*2:空集合を \(\phi\) と呼ぶ人に対するお気持ち表明。\(\phi\) と \(\emptyset\) は別の記号です。たとえば「シ」と「ツ」が別の文字なのと同様ですね。

*3:\(\neg P\) は \(P\) の否定を表す。

*4:ここでの「自明」とは「定義から直接的に導かれる」くらいの意味合いであり、「初心者にとっても直感的にわかる」のような意味合いではないので、注意が必要かもしれません。