見出し画像

自然言語における継続

【はじめに】

圏論という数学をかじってます。これはいわゆる関数型のコンピュータ言語と関係があります。数学は得意ではないですが、コンピュータなら何とかわかると思い、そのコンテクストで圏論を勉強しようとしました。すると何やら「継続」という概念が出てきます。Wikipediaで定義を見ると

計算機科学における継続(けいぞく、continuation)とは、プログラムの実行においてある時点において評価されていない残りのプログラム(the rest of the program)を意味するものであり、手続き(procedure)として表現されるものである。

Wikipedia「継続」の項目。アクセス日時:15May2022

いやまあ言っていることはわかるのですが、なんというか、どう使えるかとか、どういう意義があるのかがイマイチわかりませんでした。そこで継続に関する文献を漁ると、

Chris Barker, "Continuations in Natural Language," Fourth ACM-SIGPLAN Continuation Workshop, Venice, Italy, 2004.

というプロシーディングスを見つけました。自然言語(ここでは英語)における継続を説明しているというので、わかりやすいかと思い読んでみると、なるほど理解が進んだ気がします。

本記事ではRef.[1]に基づき、自然言語における継続を、"everyone"という量化の単語において説明します。量化とは、「すべての」や「ある」などの、議論している対象の量を指定することです。"everyone"は「すべての人」なので、量化を含む単語です。

参考文献はRef.[1-3]です。他の形式化も存在すると思いますので、これが唯一の方法ではないことを断っておきます。

【記号の定義】

まず今後使用する記号の説明をします。

登場する文の要素

文の要素はS, NP, VP, Vtが登場します。以下、その説明です:

  • S    : 文(Sentences)
    文全体

  • NP : 名詞句 (Noun Phrase)
    名詞となるひとかたまり。the cameraとかa lionとかSamuelとか。theとかaとかはdeterminerと呼ばれますが、今回は登場しません。

  • VP : 動詞句 (Verb Phrase)
    動詞および(あれば)その目的語。leaveとかswimとかmeet Johnとか。

  • Vt  : 他動詞 (Verb transitive)
    他動詞。getとかtakeとかseeとか。自動詞はVi (Verb intransitive)です。

型は、文の要素がどのような現実の意味と結びつくのかを表します。

  • Sは型t
    tは真理値であり, trueまたはfalseをとります。つまり文章は命題であり、真か偽かを決めることができるということです。

  • NPは型e
    eはentity(個体、実体)です。

  • VPは型e→t
    e→tは、eからtへの「関数」と思えばいいです。ここでeは主語です。すなわちVPは、主語となるNP(型e)を与えると、S(型t)となるものを表します。

  • Vtは型e→(e→t)
    目的語であるNP(型e)を与えると、VP(型e→t)になることを表します。

最後のVtは、NP(目的語、型 e)を与えると、VP: e→tという「関数」を返すもの、と言えます。このような「関数の関数」は高階関数と呼ばれます。

余談ですが、Vtを「主語と目的語を変数とする2変数関数」とみなすことも可能ですが、ここでは高階関数を用いて1変数関数の連続として記述します。このように、多変数関数を、1変数関数の連続として記述することを「カリー化」と言います。

【文の形式化】

以下簡単な例文を用いて、文を形式化します。形式化の方法はいくつかありますが、以下はRef.[1]に従います。

[例1] John left.

Johnという実体を表す文章内の記号をjとし、leftにあたる動詞を表す記号をleftとします。ふつうの文の単語ではなく、記号化されたオブジェクトは太字にします。型はそれぞれe, e→tですが、以下これを

j: e
left: e→t

のように表すことにします。このとき"John left."を

left j

と形式化します。これは「leftjを適用する = left: e→tという"関数"の引数にj:eを入れる」ことで、Sを返すことを示します。

図にすればFig.1のようになります:

Fig.1 "John left."の形式化の図示 (Ref.[1]より)

[例2] John saw Mary.

sawを表す記号をsaw: e→(e→t), Maryを表す記号をm: eとします。このとき"John saw Mary."は

saw m j

と形式化できます。これはe→(e→t)にm:eを適用するとVP: e→tとなり、さらにVP: e→tにj:eを適用することで、S(型t)となることを表します。

図にすればFig.2のようになります:

Fig.2 "John saw Mary."の形式化の図示


【本題: 量化子の形式化】

ここからが本題です。

"Everyone left."という文章を考えます。

ここで質問です:everyoneを記号化したeveryoneの型はなんでしょう?

everyoneの型は何らかの実体eでしょうか?いや、なんだか違います。少なくともjのような固有名詞とは違います。everyoneは誰か一人のことを指し示すのではなく、ある種の人全体のことを指しています。everyoneのかわりに、反対の概念であるno oneを考えると、これが何か実体を指し示すとはもっと思えないでしょう。

どうすればいいでしょうか。

解決策1: (e→t)→t

そこで

everyoneは(e→t)→tという型である(Ref.[3])

と解釈しましょう。このとき形式化された文章は

everyone left 

となります。これはeveryone: (e→t)→tに、left: e→tを適用してS(型t)となることを表します。なるほど、型の整合性が保たれますし、単なるeでもないので、よいように思えます。

しかし、"John saw everyone."という文章を考えると、型に整合性がなくなります。jがeの型なので、(saw everyone)はe→tの型でなくてはなりません。しかし、sawがe→(e→t)なのに対し、everyoneが(e→t)→tだとすると、組み合わせてe→tの型を作ることができません。この困難を図にするとFig.3のようになります:

Fig.3 "John saw everyone."の形式化 (Ref.[1]より)。この方法だと全体の型が整合的にならない。

このように、上記のような形式化だと、everyoneを目的語にした途端に型的に矛盾が起こります。

解決策2: 継続を用いる

そこで継続  (continuation) を用います。

まず、ラムダ計算を導入します。この計算では

$$
\lambda x.P x
$$

と書いたら、「$${x}$$を変数として、$${P}$$を$${x}$$に適用する」という意味です。荒っぽい言い方をすれば、$${\lambda x.P x}$$は"関数" $${f(x)=P x}$$です。

さて、everyone

$$
\lambda P.\forall x.P x
$$

とします。ここで$${P}$$は変数ですが、後に定義する「継続」を受け取る変数とします。つまり、everyoneとは、継続を得て、それを$${\forall}$$で束縛された$${x}$$に適用することを表します。

さて、ではPに適用すべき継続は、"John saw everyone."の場合なんでしょうか。いま、量化されるべきはsawの目的語です。ここで、「sawの目的語と相対的な(A)の継続」を

$$
\lambda x.\text{\bf saw } x \ {\bf j}
$$

とします。すなわち、"John saw everyone."において、量化される語を変数$${x}$$にした「関数」が継続です。今の場合"John saw $${x}$$."として、$${x}$$を変数にした「関数」です。

そしてeveryoneにこの継続を適用したのが、"John saw everyone."になります:

$$
(\lambda P.\forall x.Px)(\lambda y.\text{\bf saw } y \ {\bf j})
$$

$${\forall}$$は数学でも出てくる「すべての」という意味の量化子です。上記の形式化は、ちょっとわかりにくいかもしれませんが、ぶっちゃけた書き方をすると、$${f(y)=\text{\bf saw } y \ {\bf j}}$$という関数を、$${g(P)=P.\forall x.Px}$$の$${P}$$に入れ、$${y}$$に量化された$${x}$$を代入する」ことを表します。これは変形すれば

$${\forall x.\text{\bf saw } x \ {\bf j}}$$

となります。確かにこれは"John saw everyone."の意味と合っています。

さらに"Everyone left."を形式化すると、以下のようになります:

$$
(\lambda P.\forall x P(x))(\lambda y.\text{\bf left } y)
$$

この場合の継続は、主語を変数として文章を「関数」にした

$${\lambda x.\text{\bf left }x}$$

です。

ここで行ったことをまとめると、文章を、量化したい対象を変数とした継続に変換し、これをeveryoneに渡せば、整合的な形式化ができます。このように、継続を他の関数に渡す形にするスタイルを、継続渡しスタイル(continuation-passing style, CPS)と言います。

このようにするとうまくいくのはある意味当たり前のようにも思えます。なぜならeveryoneは継続の双対になっているからです。継続の双対とは、継続を$${P}$$、その双対を$${\bar P}$$とすると、$${\bar P}$$に$${P}$$を適用するとS(型t)を返すものです。文章のどこにeveryoneが埋め込まれていようと問題なく文が成立します。

【まとめ】

ここで扱った自然言語における継続とは

「文章に存在する何らかの要素を変数とした"文章の関数"」

と言えます。
"John saw Mary."の文章を例にとると

  • 主語を変数とした継続は$${\lambda x.\text{\bf saw m }x}$$

  • 目的語を変数とした継続は$${\lambda y.\text{\bf saw }y\text{ \bf j}}$$

  • 他動詞を変数とした継続も存在し、$${\lambda R.R \text{ \bf m j}}$$である。

そして、"everyone"は「継続を受け取り、継続の変数を$${\forall}$$で束縛された変数にして、S(文)を返すもの」になります。

このように、量化子を含む文章は、継続を用いて形式化すると、構文解析的に自然です。

ただ、人間が"Everyone saw John."という文章を理解するとき、本当に継続を使って理解してるかなぁ、とも思います。むしろ人間は、everyonejと同様、フツーに型eとして扱っているような気もします。これはおそらく私の勉強がたりないのだと思います。Ref.[3]や、Montagueの議論をちゃんと理解すべきなのだと思います。あと継続を使うのはちょっと卑怯にも思えます笑(完全な偏見です)。

おしまい。


参考文献

[1] Chris Barker, "Continuations in Natural Language," Fourth ACM-SIGPLAN Continuation Workshop, Venice, Italy, 2004.
[2] Chris Barker, "CONTINUATIONS AND THE NATURE OF QUANTIFICATION," Natural Language Semantics 10: 211–242, 2002.
[3] Richard Montague, "The Proper Treatment of Quantification in Ordinary English," in R. Thomason, editor, Formal Philosophy: Selected Papers of Richard Montague, pages 247–270. Yale University Press, New Haven, 1974.

この記事が気に入ったらサポートをしてみませんか?