1/61

自己紹介• なまえ： k.inaba (けーいなば)• なにもの？： 珍妙言語機能妄想日記書き– http://www.kmonos.net/wlog/– 「タグストラクチャル型」「お気楽非決定性」「return[f→g]」「物知りなぬるぽ」「Я９Я∽」「手続型リアクティブ」「Int./¥d+/」「名前推論」「Aspect指向Yコンビネータ」
…

2/61

プログラミング言語の過去• 1954• 1958• 1959•…

FORTRAN
LISP, ALGOL
COBOL

3/61

プログラミング言語の過去• BC7000～4000 印欧祖語
• BC5000～0
日本語• AD410～500
英語• 1954
FORTRAN• 1958
LISP, ALGOL• 1959COBOL• … これら数千年の歴史をもつ言語を「プログラミング言語」と思って学ぼう！

FLTV - 2009/8/30

Rhetorical Programming

真・自然言語プログラミングk.inaba
http://www.kmonos.net/wlog/

5/61

よくある突っ込み•「すでにあるじゃん」–日本語G-Basic (ぴゅう太)–Mind–なでしこ–AppleScript, …

ちがいます

6/61

よくある突っ込み•「すでにあるじゃん」

ちがいます

7/61

これらの言語は•自然言語の構文を取り入れてる– もし～ならば～違えば～ / ～とは～
– “「何をどうする」の語順はオブジェク

ト指向的”– “スタックマシンは日本語の語順と同じ”– “話し言葉のような人間に自然な文章で検索”

8/61

これらの言語は•自然言語の構文を取り入れてる– もし～ならば～違えば～ / ～とは～
– “「何をどうする」の語順はオブジェク
普段書いてるプログラムはト指向的”使い慣れた構文で書ければ– “スタックマシンは日本語の語順と同じ”
もっと楽なはず!という発想– “話し言葉のような人間に自然な文章で検索”9/61

今回のおはなし•自然言語の機能を取り入れよう!!
–自然言語は「プログラミング言語」と見ると恐しくパワフル10/61

今回のおはなし•自然言語の機能を取り入れよう!!
–自然言語は楽なのは慣れてるからじゃ「プログラミング言語」
ない,ヤツらがもの凄く強力と見ると恐しくパワフルな言語だから！という発想

11/61

ここからのお話

以下、いくつか「強力な機能」の具体例を紹介

“The”
型を１つ引数にとり現在のス
コープに唯一存在するその型のオブジェクトを返す演算子
ネタ元：4年前の自分の日記13/61

プログラマなら誰もが悩む変数名

14/61

Google検索結果 "変数名"15/61

Google検索結果 "変数名"いいプログラムを書くには変数名を正しくつけないとダメ「どう付けよう？」「私のこだわり」「検討を要する事項がたくさん」

16/61

一方自然言語は普通名詞を使った•m_pMainWnd->close()•窓を閉めて•Close the window

17/61

一方自然言語は普通名詞を使った•function(int n){return n*2}
•受け取った整数を2倍する関数•Function that doubles
the given integer18/61

英語では…（日本語だと暗黙）“The 型の名前”(例: The window)という式でその型の、現在のスコープに唯一あるインスタンス(例: 今いる部屋の窓)を取得できる

19/61というわけでプログラミング言語にもこの機能を入れてみよう！

20/61

作りました• google://Nikes+名前推論–Jikes を改造
var _ = “Hello World”
var __ = new JFrame(String);
JFrame.setBounds(0,0,100,100);
JFrame.setVisible(true);21/61Nikes• 実装–式っぽい場所に型名があったらその型の変数に置換。以上！
var _ = “Hello World”
var __ = new JFrame(String);
JFrame.setBounds(0,0,100,100);
JFrame.setVisible(true);22/61※デザインの考察• 日本語風ではなく英語風に"the"を明示する方がいいかも
var _ = new JFrame($String);$JFrame.setBounds(0,0,100,100);• 注意！自然言語の語彙まで真似る必要はない（真似るのは機能！）
var _ = new JFrame(The String);
The JFrame.setBounds(0,0,100,100);

23/61※関連する話：Eclipse先生も• 型名と同じ変数名を補完

C-Space!!

24/61※関連する話• それ (なでしこ)、$_(Perl)「ｘｘと吠える」の「ｘｘ」を「ワンワン」に置換して、それを表示する。

or「ｘｘと吠える」の「ｘｘ」を「ワンワン」に置換して、表示する。

25/61※ついでに脱線• 既存の「日本語プログラミング」の“自然言語の機能を真似る”
的にいいなーと思うところ[相手]へ、[名前]を、紹介する手順…
終わり「次郎」を「太郎」へ紹介する– 助詞の有効活用（例はプロデル）

“Every”
現在の評価コンテキストを部分継続として切出しコンテナの要素に適用し集計する演算
ネタ元： “Wild Control Operators”
by Chris Barker, 他色々

27/61

しばらく前に見た発言【急募】Javaプログラミングについて質問です。もし整数が２か３で割り切れるときのみ、その整数をプリントアウトする時は、int
number = a; b=a%(2ll3);
if(b==0) System.out.println("割れる！！")でいいんでしょうか…。

28/61

分析する• 自然言語2か3で割り切れる
divisible by 2 or 3• プログラミング言語
a%2==0 || a%3==0• 直訳
a%(2||3)==0• 直訳
2で割り切れるか3で割り切れる

自然言語には"か" という、|| よりも超強力な演算子がある

冗長DRY則に反している∵ 表現力が貧弱

29/61というわけでプログラミング言語にもこの機能を入れてみよう！

30/61

実はすでにほぼある• Icon
http://www.cs.arizona.edu/icon/
every a%(2|3)=0 & write(“割れる！”)• ambオペレータ

最初に 2、次に 3 を生成するジェネレータ

(begin(require (= (modulo a (amb 2 3)) 0))(print “割れる！”))31/61

要するに• 「か」や「or」は継続(continuation) で作れる
• 逆に言うと• 自然言語は継続を自由自在に使いこなすパワフルさ32/61

でも&&っぽいのは直には難しい•自然言語–2と3で割り切れる•直訳–a%(2 && 3)==0 ←？

33/61

他の似たような「機能」:every• value = [1, 2, 3], A = 4– A は5より小さい– A is less than 5–A＜5– どの値も 5より小さい– Every value is less than 5–value.all?{ |x| x ＜ 5 }–every(value) ＜ 5…bad34/61

他の似たような「機能」:some• value = [1, 2, 3], A = 4– A は偶数– A is even–isEven( A )– どれかの値は偶数– Some value is even–value.any?{ |x| isEven(x) } …bad–isEven( some(value) )35/61

こういうのは全部•限定継続(Delimited Continuation)で説明できる！
–という研究が最近言語学の方で盛んらしいです36/61で、(限定)継続とは？
• 一言で言うと「俺、この処理が終わったら○○するんだ…」のこと

37/61で、(限定)継続とは？
function operator∥(var x, var y){var f = rest_of_full_expression()var g = after_full_expression()g( f(x) || f(y) )}if( a%(2∥3)==0 ){write(“割れる！”)}
write(…)

38/61で、(限定)継続とは？
function operator∥(var x, var y){var f = rest_of_full_expression()var g = after_full_expression()g( f(x) || f(y) )}俺、この∥演算子がif( a%(2∥3)==0 )終わったら{write(“割れる！”)} fun x → (a%x==0)
write(…)
を計算するんだ…

39/61

俺、if文の条件部が終わったら
fun b → で、(限定)継続とは？
if(b){write("割れる")}write(…)
するんだ…
function
operator∥(var x, var y){var f = rest_of_full_expression()var g = after_full_expression()g( f(x) || f(y) )}俺、この∥演算子がif( a%(2∥3)==0 )終わったら{write(“割れる！”)} fun x → (a%x==0)
write(…)
を計算するんだ…

40/61

他の例
function every(var list){
var f = rest_of_full_expression()var g = after_full_expression()
foreach( e in list )if( !f(e) )g(false)g(true)}if( every([1,2,3]) < 5 ) { … }41/61

他の大変マニアックな例• C++の後置++演算子でコピー要らなくできる気がする
class BigInt {BigInt&/<noreturn> operator++(int) {var f = rest_of_full_expression();var g = after_full_expression();var r = f(*this);
this->incr();
g(r);
}}

42/61Same• さらに–All students are reading thesame book–all(students).read(same(book))• マルチホール継続というのが必要らしい…？

43/61※関連する話• http://d.hatena.ne.jp/ku-mame/20090312/p1– map が面倒なので DelegateMap
p [1,2,3].dmap + 1# => [2,3,4]
p [1,2,3].map{|x| x+1} # => 上と等価

• http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20090316#p01– 部分継続でDelegateMap

44/61※関連する話• Chris Barker– http://homepages.nyu.edu/~cb125/• Chung-chieh Shan
– “Linguistic Side Effects”– http://www.cs.rutgers.edu/~ccshan/• Oleg Kiselyov– “Delimited Continuations in Natural Language Semantics”– http://okmij.org/ftp/gengo/

45/61

この章のまとめ• 自然言語の「2か3で割り切れる」
はとてもパワフルです• どのくらいパワフルかというと限定継続くらい–Or more …?

“▽は○が□”関数適用の結果をメッセージとしてオブジェクトへ飛ばす
ファーストクラスメッセージ
ネタ元：『象は鼻が長い‐日本文法入門』
by 三上章, 他色々47/61

主語と述語とオブジェクトとメソッド•犬が鳴く–dog.cry()•猫が鳴く–cat.cry()•というのをふまえて…

48/61

主語？

主語？

象は鼻が長い• どういう文構造と解釈すれば？?
• 長らく日本語学者の論争の的

49/61

解釈Ａ

象は鼻が長い• 日本語の「は」は「主語」ではなく「主題」を表す
with(elephant){ trunk.isLong }50/61

解釈Ｂ

象は鼻が長い
• 「主述述語文」という考え方• 主語＋述語の組み合わせが再び述語になる
elephant.(trunk.isLong)

51/61というわけでプログラミング言語にもこの機能を入れてみよう！

52/61

大雑把に考えて•主語＋述語 がまた述語＝•オブジェクト.メソッド
が、またメソッドに53/61

obj.methodがまたmethodに• http://shinh.skr.jp/m/?dat
e=20090301#p02–それっぽい話題があった！！
param2.(param1.(obj.msg))
全く美しくないな…
obj.msg は obj を保持したメッセージを返している、 クロージャ的なメッセージ54/61

例１• shinhさんによる–max{…}の部分をまとめて変数につっこみたいeven = evens.max{|a,b|a.priority <=> b.priority}
odd = odds.max{|a,b|a.priority <=> b.priority}

55/61

例１• shinhさんによる–max{…}の部分をまとめて変数につっこみたい.maxPrio
even= evens.max{|a,b|= .max{|a,b|a.priority <=> b.priority}
odd ==odds.max{|a,b|
even
evens.maxPrio
odd a.priority= odds.maxPrio<=> b.priority}

56/61

自然言語なら♪ぞうさん ぞうさん
おはなが ながいのね
そうよ かあさんも ながいのよ•象は鼻が長い。
•母さんもそう。

主述述語の再利用！

57/61

例２• こういうのできたら嬉しいよね
puts n.rjust(8, “0”)puts m.rjust(4, “0”)puts k.rjust(6, “0”)

58/61

例２• こういうのできたら嬉しいよね.zeroPad
putsn.rjust(8,= .rjust(_,“0”) “0”)puts n.zeroPad(8)m.rjust(4, “0”)puts m.zeroPad(4)k.rjust(6, “0”)puts k.zeroPad(6)まとめ

60/61

まとめ：未来言語は…
• 自然言語からパクれ！
× 単語や語順や構文を真似る
× NLPの技術を駆使して人間相手のように曖昧に命令できる処理系を作る○ 自然言語の機能をパクれ！

61/61※追記：Ｑ＆Ａ※• 最後のって要は部分適用？
– 機能としてはそうです– メソッド/メッセージという概念を崩さずそのままに部分適用を可能にするとどうなるか？
的なことを考えてます• 題の「レトリカル」って？
– ホントは比喩とか転移修飾とかそういう技法をプログラミングに持って行くレベルの話までしたかったんですが、巧い読み替えが思いつかず…＞＜