Amosapientiam

備忘録

C#でC++のcinっぽいの

作った。

class cin {
    private static Queue<string> tokens;
    static cin () {
        string line;
        tokens = new Queue<string> ();
        while ((line = Console.ReadLine ()) != null) {
            foreach (var token in line.Split (' ')) {
                tokens.Enqueue (token);
            }
        }
    }
    public static implicit operator int (cin cin) => int.Parse (cin.tokens.Dequeue ());
    public static implicit operator string (cin cin) => cin.tokens.Dequeue ();

    public void Deconstruct (out cin o1, out cin o2) => (o1, o2) = (this, this);
    public void Deconstruct (out cin o1, out cin o2, out cin o3) =>
        (o1, o2, o3) = (this, this, this);
    public void Deconstruct (out cin o1, out cin o2, out cin o3, out cin o4) =>
        (o1, o2, o3, o4) = (this, this, this, this);
    public void Deconstruct (out cin o1, out cin o2, out cin o3, out cin o4, out cin o5) =>
        (o1, o2, o3, o4, o5) = (this, this, this, this, this);
    public void Deconstruct (out cin o1, out cin o2, out cin o3, out cin o4, out cin o5, out cin o6) =>
        (o1, o2, o3, o4, o5, o6) = (this, this, this, this, this, this);
    public void Deconstruct (out cin o1, out cin o2, out cin o3, out cin o4, out cin o5, out cin o6, out cin o7) =>
        (o1, o2, o3, o4, o5, o6, o7) = (this, this, this, this, this, this, this);
    public void Deconstruct (out cin o1, out cin o2, out cin o3, out cin o4, out cin o5, out cin o6, out cin o7, out cin o8) =>
        (o1, o2, o3, o4, o5, o6, o7, o8) = (this, this, this, this, this, this, this, this);
}

こんな感じに使う。

int N                      = cin;
string name                = cin;
(int A, string str, int B) = cin;

castをabuseすると治安の悪いコードが書ける。

各種ズンドコ節のズンドコ部分の比較

取り急ぎなので間違っていたらごめんなさい><

比較

タイトル 歌手 発表年 ズンドコ部分 備考
海軍小唄 不詳 1945以前 トコズンドコズンドコ 流行歌
街の伊達男 田端義夫 1947年 トコズンドコズンドコ 長調
東京ズンドコ 安城美智子 鈴村一郎 1951年 トコ東京ズンドコズンドコ 海軍小唄に近いメロディ
アキラのズンドコ節 小林旭 1960年 ズン・ズン・ズンドコ ズンドコ部分の後に10小節ほど別メロディが挿入されている
ドリフのズンドコ節 ザ・ドリフターズ 1969年 ズンズンズンズンズンズンドコ ズンドコ部分のほかは海軍小唄にほぼ同じメロディ
零心会のズンドコ節 劇男零心会 1986年 ズンズン・ズンズン・ズンズンドコ ズンドコ部分の後に10小節ほど別メロディ。 サビ最後直前にタメ。
きよしのズンドコ節 氷川きよし 2002年 ズン・ズンズンズンドコ 演歌風の前奏付き
zung zung funky music ORANGE RANGE 2004年 ズンズンファンキーミュージック ラップ調
Zoun-Doko Bushi Les Romanesque 2011年 ズンズンズンズンズンズンドコ フランス語 ドリフのズンドコ節に近い

結論

「ズン・ズンズン・ズンドコ」は少数派! ひょっとしたらきよしのズンドコ節が初出?

モーラの話

この記事は

語学/言語学/人工言語合同 Advent Calendar 2017 - Adventar

の16日目*1の記事です。

 モーラとは何か?

ふゆやすみ いちにちへやで ねてすごす

これは575だろうか?イエス。 では何が5で、何が7で、何が5なのだろうか。我々は一体何を数えて5だの7だの言っているのだろうか。 仮名の数? 本当にそうだろうか。 例えば次の例はどうだろう。

かちゃかちゃと シェルでたたくぜ しゅくしゅくと

これは575であるが、仮名の数は786である。 我々は仮名を数えているわけではなさそうだ。ローマ字で書いて見ると少しはヒントになるかもしれない。

Kachakachato sherudetatakuze shukushukuto

この中に現れる母音の個数を数えると575である。なるほど、我々は母音の個数を数えていたようだ。 あるいは、「ひとつの母音とその母音にくっつく子音」をひとまとまりにして「音節」と呼ぶことにすれば、我々は音節の数を数えているのだとも言える。 この例は以下のように音節に分解できる。

ka.cha.ka.cha.to she.ru.de.ta.ta.ku.ze shu.ku.shu.ku.to

ピリオドが音節の区切りである。 それでは次の例はどうだろうか

にっぽんに はんこぺったん ぺったんこ

nip.pon.ni han.ko.pet.tan pet.tan.ko

これは仮名の数は575である。が、母音数(=音節数)は343しかない。数えやすいように音節への分解の一例をローマ字で示した。 どうやら我々が数えているものは仮名の数でも音節の数でもないらしい。 しかし、上述の諸例は確かに「575」であるはずだ。 声に出してみると、確かに何かが5つ、7つ、また5つ通り過ぎる。 我々は確かに何かを「1単位」と感じており、その個数を数えて5だの7だの言っている。 言語学では、この仮名でも音節でもない感覚上の長さの単位をモーラと呼ぶことにしている。

日本語のモーラ

何がモーラであるか?

どのような物が1モーラであるかを確認することは比較的容易だ。 多くの日本語母語話者はモーラを「数える」ことができるからだ。適当な文章を作ってみて、指を折りながらモーラを「数えて」 ゆき、どこで自分が「1」と指を折ったか確認していけばよい。

実験すると以下のものがモーラを形成することがわかる。

  • (子音 or なし)+(半母音 or なし)+(短母音 or 長母音の前半部分 or 二重母音の前半部分)
  • 撥音「ん」
  • 促音 「っ」
  • 長母音の後半部分「ー」
  • 二重母音の後半部分

ここでいう「二重母音」とは「ai」「oi」など、短母音が2つ連続してひとつの母音になっているものである。 そのまま短母音が2つあるとみなしても良いのだが、アクセントの振る舞いに関する説明などで便利なことが多いので「ニ重母音がひとつある」という捉え方をしたりするのだ。

モーラはどのような性質を持つか?

少なくとも日本語話者にとっての心理的な計測単位であることは間違いない。他にどのような特徴を持つのか?

各モーラの長さは概ね等しい

ここでいう「長さ」とは、そのモーラを撥音するのに要する物理的な継続時間のことである。 実際に音声を分析すれば長さを計測することができる。

アクセントの位置を決定する

日本語のアクセントについてはごく短い補足記事で説明した。

日本語のアクセント核について - Amosapientiam

アクセントは語によると言っても、ある程度の基本パターンは存在する。 日本語の場合「後ろから三番目のモーラ」にアクセントが置かれることが多い。 それを確認するために幾つか例を出したいのだが、言語一般の話として日常語や短い語は不規則な性質を示すことが多い。 また日本語では複合語は特別なアクセント規則に従う。そのため以下では日常での使用頻度が少ない外来語を例とした。

オリエント トリエステ イスタンブール バグダード キルクーク キャロライン エスコート トリオナール パピリウス レキシコン サルマティア ディグナトゥル コンバイン アイネクライネナハトムジーク ...

コンバイン キルクーク などの例から音節ではなくモーラを数えていることがわかるだろう。

英語のモーラ

前節では日本語のモーラに触れた。ところで、モーラ概念は日本語に特有なものだろうか?いや、そうではない。 外語の例として、多くの日本人にとって最も馴染み深い外来語である英語を取り上げてそのモーラについて記述する。

何が何モーラであるか?

以下のものが以下のモーラ数を持つ。

種類 モーラ数
音節頭子音群 0
短母音 1
長母音・ニ重母音 2
音節末子音群 1

実際の英単語を例に取る。

単語 音節頭子音群 母音 音節末子音群 合計モーラ数
cat 0(c) 1(a) 1(a) 2
no 0(n) 2(o) 0 2
key 0(k) 2(ey) 0 2
sail 0(s) 2(ai) 1(l) 3
the 0(th) 1(e) 0 1

モーラはどのような性質を持つか?

日本語のモーラとは違い、英語話者にとってモーラは心理的な単位として自覚されていないことが多い。 各モーラが等しい長さを持つとも限らない。では、英語においてモーラを設定することで何が説明できるのか?

最小性制約

英語には /kǽt/, /hάt/ /séd/ という音の並びからなる単語は存在しうる。 (事実、cat. hot, saidという単語が存在している) しかし /kǽ/, /hά/ /sé/という音の列びからなる単語は存在し得ない。なぜか? 母音で終わるのが禁止されている?いや、/vjúː/ , /síː/ などの単語(view, sea)は堂々と母音で終わっている。 モーラの概念を用いると、この音素配列上の制約を以下のように簡潔に表現できる。

  • 英語では強勢を持つ音節は2モーラ以上でなけれなばならない。

造語、略語を作る際にもこの原則に抗うことはできない。 例えばbrother /brʌ́ðər/ の略語・愛称形broは /brʌ́/ ではなく/bróʊ/と発音される。

最大性制約

英語では語末音節を除き、3モーラ以上の音節は避けられることがある。

以下は3モーラの語末音節を持つ語と、その派生語の表である。 母音が規則的に短縮し、該当音節が2モーラに圧縮されていることがわかる。

語末 語中
produce production
prime primitive
pronounce pronunciation
アクセントの位置を決定する

英語には語頭にアクセントを置くゲルマン語由来の語の規則、語末にアクセントを置くフランス語由来の語の規則など、様々な要素が影響しアクセント規則は複雑である。

その中でも「語末から3番めの要素」にアクセントを置くグループがある。 少し複雑だが、以下の手続きによりアクセント位置が決定する。

  • 語末の1音節を除く
  • 語末の1モーラを除く
  • 語末のモーラを含む音節にアクセントを付与する

例を示す。

architect balcony Constantinople destination amalgam veranda

実は、このアクセント位置の決定法はラテン語の単語のアクセント位置の決定法と同じである。

まとめ

モーラの概念について日本語と英語を例に取り説明した。 音素・音節概念などと比べると軽視されがちだが、このように音素配列の制約やアクセント位置の決定に深く関与している。

関連事項

なぜ「後ろから3番目」にアクセントが付与されるのか、英語の第二アクセント、第三アクセント以降はどのように決定されるのかなどは韻脚論によってある程度説明できるので興味のある人は是非調べてみて欲しい。 また、 「後ろから3番め」は「antepenult」でググると検索しやすいかもしれない。

*1:「寝るまでは今日」 -コレチアの古諺

日本語のアクセント核について

日本語は高低アクセントの言語である。単語ごとに音の高さのパターンが決まっており、 「宿題」であれば「低高高高」、「広い」であれば「低高低」のパターンで発音される。

実際には語の中で自由に低/高が現れるわけではなく、0個/あるいは1個のアクセント核の位置によって音の高さのパターンは定まっている。 アクセント核の位置から、語中の各モーラの音の高さのパターンは以下の手続きで決定される。

  • 全てのモーラを「高」にする
  • アクセント核の直後以降全てのモーラを「低」にする
  • 1モーラ目がアクセント核でなかった場合、1モーラ目は「低」とする

リアルワールドを例に取り説明する。リアルワールドのアクセント核は「ワ」である。 まず、全てのモーラが「高」である状態「リアルワールド」が初期状態である。 アクセント核以降は「低」になるので「リアルワールド」となる。 1モーラ目にアクセント核がないので「リアルワールド」となる。

合拗音「くゎ」「ぐゎ」の発生から消失まで

合拗音(ごうようおん)とは?

「くゎ」「ぐゎ」のこと。

日本語の音システム(拗音編)

直音と拗音の対立

日本語では 「か、さ、た、な」などの音と「きゃ、しゃ、ちゃ、にゃ」などの音の対立がある。 訓令式ローマ字では前者は「ka, sa, ta, na」などと表記されるのに対し、後者は「kya, sya, tya, nya」などのように子音と母音の間に半母音yを挟んで表記する。 伝統的に、前者の「ストレートな」 音は直音と呼ばれ、後者の「まがった」音は拗音と呼ばれる。

開拗音と合拗音

先述のような半母音yが挟まる拗音を開拗音と呼ぶ。 かつての日本語には子音と母音の間に半母音wが挟まった合拗音が「くゎ」「ぐゎ」に限って存在した。

「しゃ」の音を持つ 者 車 斜 射 などの語と 「さ」 の音を持つ 差 左 査 詐 などの語が明確に発音し分けられるように、 「くゎ」と発音された化 花 火 科 瓜 果 華 渦 などの語と、 「か」と発音された下 加 可 歌 仮 価 佳 夏 家 嫁 語にもかつては発音上の明確な区別があった。

合拗音の時代変化

古来の日本語

日本語には元々直音のみがあった。全てのモーラは「あ」のような母音1つからなる音節か、あるいは 「か」のような子音1つ+母音1つからなる音節のどちらかであった。 撥音(ん)や促音(っ)、長音(ー)などの音はなかった。

中古中国語の影響

やがて大陸との交流が盛んになり、日本語は大量の漢語を受容する。漢語には当時の日本語に存在しない音が大量にあった。 *1

隋〜唐代の漢語には kiok(曲) kuat(活) ten(天)などの語を受容する過程で「きょ」のような開拗音、「くゎ」のような合拗音、「ん」を獲得し、 また、一杯(itpuai)などの語を受容する過程で「っ」の音を獲得した。 「えい」「あう」「おう」などの音はやがて融合し長母音へと変化した。

合拗音の衰退

時代が下るにつれて合拗音と直音は混同されるようになり、現代の共通語では二者の区別は消失し全て直音で発音されるようになった。

以下は国語調査委員会による明治38年『音韻調査報告書』に基づき私が作成した地図である。

f:id:yuchiki1000yen:20170818222138j:plain

図から見て取るに、明治後期はちょうど合拗音消失過程の進行期であったようである。 北海道、北東北、北陸、四国、九州、島根*2などでは合拗音が保存されているのに対し、近畿では合拗音と直音の混乱が生じている。南東北、関東、東海道、中国、(島根を除く)では既に二者は合流している。

*1: 漢音#漢音音節表

*2:でこれきさん(@dico_leque)からご指摘があって修正。こんな目立ってるのに見落としてた!!!

古代ローマ人は投げたがり

英単語によく出てくる○jectの語源についての記事です。

jacio: 投げる

“jacio"は「投げる」を意味するラテン語の動詞である。 この動詞は「立てる」「作る」「セットする」「拡散する」「放出する」「据える」「置く」などをも意味する1大変多義な語である。私は古代ローマ人ほど上品ではないので(?)、対象をひっ掴んで遠くにぶん投げるなり置きたい場所にドンと置くようなイメージでついつい括って考えてしまう。 「ぶん投げる」「おっ立てる」「こしらえる」「ぶっ散らかす」「ぶっ放す」「叩きつける」「押さえつける」…などのように。

古代ローマ人はよほどjacioがお気に入りだったようで、この動詞は多くの語に派生し、様々な動作、状態、物などがjacioを使って表現されている。

jactus:投げられた

jactusはjacioの完了分詞であり「投げられた」などの意味を持つ。 カエサルの「賽は投げられた。」は、原語では"Alea jacta est".である。 また、複合語では母音が弱化してxx-jectusなどになる。

英語は投げられてばかり

英語はラテン語と、ラテン語の子孫の一つであるフランス語から大量に語を借用しており、それゆえ *ject の形の単語が大量にある。 以下にその一部を示す。 語と意味の対応の他に、その意味がどう導かれるかをこじつける考察するために語の構成も示す。

英単語 意味  構成(括弧内は恣意的)  備考
subject 臣民 sub(下に) ject(据えられた)
subject 主題 sub(下に) ject(据えられた) ギリシャ語のὑποκείμενον(基層, 主題)を訳した語
project 計画, 投影する pro(前に) ject(投げられた)
object 対象 ob(目的として) ject(据えられた)
object 反対する ob(反抗して) ject(ぶっ放す)
reject 断る、拒絶する re(返す) ject(投げられた) 投げ返された
inject 注射する in(中に) ject(ぶちかます)
adjective 形容詞 ad(〜に) ject(据えられた) ギリシャ語のἐπίθετον(付加的な, 形容詞)を訳した語
eject 追い出す ex(外に) ject(ほっぽり出された)
conjecture 予想 con(一緒に) ject(据えられた) 物事に対して自分の考えを結びつける
abject 落ちぶれた ab(奪って) ject(据えられた)
deject がっかりさせる de(離して) ject(据えられた)

ラテン語では xx-jectusは間違いなく形容詞か、あるいは形容詞の名詞用法である。 英語では、xx-jectの品詞は語形からは全くわからない。能動の意味の動詞ですら完了分詞形を経由して輸入されている。 どうしてこうなった…

共変/反変についての走り書き

Covariant(共変)/Contravariant(反変)/Invariant(不変)について、自分用に走り書きした。 うまく説明できずにもにょったり、どれがどれだかわからなくなった時にこれを読みなおす。

記号

 \vdash t : T
項tは型Tを持つ。
 \vdash A \leq B
型Aは 型B の部分型である。もし項tが \vdash t : Aであるならば \vdash t : B でもある。この場合B型の値が要求されているところで、代わりにA型の値を使っても問題ない。

定義

 Op :: Type \rightarrow Typeを型演算子とする。

Opはcovariantである。
 \vdash A \leq Bを満たす任意の型A, Bに対して  \vdash {Op}\ {A} \leq Op\ B
Opはcontravariantである。
 \vdash A \leq Bを満たす任意の型A, Bに対して  \vdash {Op}\ {B} \leq Op\ A
Opはinvariantである。
Opはcovariantでもcontravariantでもない。
Opはbivariantである。
Opはcovariantかつcontravariantである。

Covariant, Contravariantな型演算子の例

 \vdash a_0:A ,  \vdash b_0 : B かつ  \not\vdash b_0 : A,  \vdash A \leq Bとする。 型演算子 Get,  Setを次のように定義する。  Get = T \mapsto (() \rightarrow T)

 Set = T \mapsto (T \rightarrow (){})

このとき、  Get は CovariantであるがContravariantではなく、  Setは ContravariantだがCovariantではない。 すなわち、  \vdash Get\ A \leq Get\ B \vdash Set\ B \leq Set\ Aは言えるが、他は言えない。

例の例

関数  get_A,\ get_B,\ set_A,\ set_B

 \vdash get_A : Get\ A

 \vdash get_B : Get\ B

 \vdash set_A : Set\ A

 \vdash set_B : Set\ B

だとする。

このとき、

 Get\ B\ b = get_A\ ({}(){})
OK
 Get\ A\ a = get_B\ ({}(){})
だめ
 set_A\ (b_0)
だめ
 set_B\ (a_0)
OK

 Get\ B型の項が要求されている箇所に get_Aを渡したり、  Set\ A型の項が要求されている箇所に set_Bを渡したりすることはできるが、  Get\ A型の項が要求されている箇所に get_Bを渡したり、  Set\ B型の項が要求されている箇所に set_Aを渡したりすることはできない。