トップページ⇒tech
1001コメント344KB

Lisp Scheme Part19

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2008/01/14(月) 00:14:56
過去スレ
Part18: ttp://pc11.2ch.net/test/read.cgi/tech/1186922295/
Part17: ttp://pc11.2ch.net/test/read.cgi/tech/1177065699/
Part16: ttp://pc11.2ch.net/test/read.cgi/tech/1172404795/
Part15: ttp://pc10.2ch.net/test/read.cgi/tech/1151025773/
Part14: ttp://pc8.2ch.net/test/read.cgi/tech/1132275726/
Part13: ttp://pc8.2ch.net/test/read.cgi/tech/1115901841/
Part12: ttp://pc8.2ch.net/test/read.cgi/tech/1100229366/
Part11: ttp://pc5.2ch.net/test/read.cgi/tech/1091456033/
Part10: ttp://pc5.2ch.net/test/read.cgi/tech/1075630259/
Part9: ttp://pc2.2ch.net/test/read.cgi/tech/1069594582/
Part8: ttp://pc5.2ch.net/tech/kako/1058/10582/1058263391.html
Part7: ttp://pc5.2ch.net/tech/kako/1042/10421/1042167213.html
Part6: ttp://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part5: ttp://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part4: ttp://pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part3: ttp://pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part2: ttp://pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part1: ttp://piza2.2ch.net/tech/kako/987/987169286.html
0951デフォルトの名無しさん2008/03/08(土) 12:07:51
電鍵
09528112008/03/08(土) 14:39:52
>>909
wilikiをそのままコピーしただけではgettextがうまく機能しないと思います。
(メッセージが英語のままだったりしませんか?)
そのへんを>>811,845では小細工して解決してるんですが、微妙にきれいな方法ではないです。
localeがへんなところにインストールされているのはそのためです。
今のGaucheではWindowsではgauche.configモジュールがちゃんと機能しないので、
何かと不便な感じではあります。
gauche-config.cをそのまま拡張モジュールとして使えるようにできればいいんですけどね。
0953デフォルトの名無しさん2008/03/08(土) 18:17:36
誰か行ってる?
0954デフォルトの名無しさん2008/03/08(土) 18:28:44
実況は動きがないのぜ?
0955デフォルトの名無しさん2008/03/08(土) 18:34:15
画像は変わってないね。
09568412008/03/08(土) 23:02:07
>>952
うん、たしかに英語のままだった。
shareの下に置いてgettextさせて読み込ませるのには一応成功した。
だけどoperaやfirefoxだとwiliki見ることが出来ないんだよね。
なんかまだ設定がおかしいのかな?
俺が使ってるAnhttpdが悪いのかもしれんが。
0957811(齊藤) ◆3.JjF77I26 2008/03/08(土) 23:54:23
>>956
Windowsでは改行の問題がある。
詳しいことはここに書いてある。
http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3aWishList#H-qawvzn
www.cgiモジュールをちょっと書き換えてあるので、
そこもコピーしてくれれば大丈夫だと思う。
09588412008/03/09(日) 00:22:08
やはりヘッダが変になってたのか。
情報THXです。
0959デフォルトの名無しさん2008/03/09(日) 00:31:12
聞き所がわかんないんでここで聞いてみるんだけど
システム運用中にダイナミックにクラス定義を変更できる言語って
何がある?
# スレチだったら適当にルーティングしてほしい
0960デフォルトの名無しさん2008/03/09(日) 00:40:44
CLOS
Scheme系のオブジェクト指向システム

その他はくだ質スレで。
0961デフォルトの名無しさん2008/03/09(日) 00:42:11
そういや、昔カール・ヒュイットが、
クラス定義の履歴を持つシステムをLispで開発していたような。
クラス定義だけじゃなくて、オブジェクトやスタックの履歴も全部w
0962デフォルトの名無しさん2008/03/09(日) 01:33:50
Gauche本の謝辞にこのスレが書いてあるなw
まぁ俺は何もしてないけど。
0963デフォルトの名無しさん2008/03/09(日) 06:19:14
次スレ立てる人はテンプレに On Lisp HTML版を入れてー
ttp://user.ecc.u-tokyo.ac.jp/~tt076524/onlispjhtml/
0964デフォルトの名無しさん2008/03/09(日) 10:36:20
立てました
つttp://pc11.2ch.net/test/read.cgi/tech/1205021786/
0965デフォルトの名無しさん2008/03/09(日) 15:14:15
Little Schemerで理解できない箇所があります。
P153 下から4段目以降ですが何を云わんとしているのか分かりません。

Q.
Is there something else that changes about...(省略)
align関数への引数と再帰の使用に関して、変更するものは
他に何かありますか?
A.
Yes, there is ...(省略)
はい、あります。二番目の要素はより複雑になるが、
ペアの一番目の要素はもっと簡単になる。
Q.In what way ...(省略)
どういう方法を使えば一番目の要素は簡単になりますか?
A.It is only a part ...(省略)
元のペアの一番目の要素の一部を切り出すことによって。
(日本語が変ですが、P103 Sevens Commandment に従うという意味だと思います)
Q.Doesn't this mean ...(省略)
引数の長さを決定するlength*関数が間違っていることを意味
しませんか?(→意味不明)よりよい関数を見つけられますか?
A.あります。その関数は一番目の要素にもっと注意を払わなければいけない。
Q. How much ...(省略)
一番目の要素にどのくらい注意すべきですか?
A. At least twice as much
少なくとも二倍以上。(→意味不明)

この後weight*という新しい関数が紹介されますが意図がわかりません。
このくだりは、align関数がpartial functionかどうかを判断
するために存在しているはずですが、weight*関数導入後は最終的に
partial functionではないと結論づけられています。
みなさん、どのように理解されましたか?
0966デフォルトの名無しさん2008/03/09(日) 20:15:04
誰も読んでないのかな。
0967デフォルトの名無しさん2008/03/09(日) 20:18:40
>>966
読んでるけど、書くほどのことがないんだよ。
0968デフォルトの名無しさん2008/03/09(日) 20:25:25
>>967
疑問に思うほどのことじゃないということですか?
length*とweight*のくだりはどう理解すればいいんですか?
0969デフォルトの名無しさん2008/03/09(日) 22:29:12
まだそこまで行ってないお
0970デフォルトの名無しさん2008/03/09(日) 23:18:23
>>965
The seventh commandmentは、手続き型言語のループカウンターのように、再帰関数では何かを減らして逝くことでしょ。

>引数の長さを決定するlength*関数が間違っていることを意味 しませんか?(→意味不明)

それ誤訳。『length*関数が間違っているわけじゃないですよね?もっといい関数があるんですか?』という意味。

>元のペアの一番目の要素の一部を切り出すことによって。
>(日本語が変ですが、P103 Sevens Commandment に従うという意味だと思います)

これがThe seventh commandmentの言うようにgoalに向かって何かが減るように変更すること。このsimplerにする例がP.154のweight*。

>A. At least twice as much
>少なくとも二倍以上。(→意味不明)

P154のweight*をよく見ると、(× weight* (first pora)) 2)、というのがあって2倍している。

ネタばればけど、このように再帰関数では何かを減らして逝くことで計算がどこかで止まるようにする(The seventh commandment)。
そうでないものはPartial function。
The seventh commandmentの内容を突き詰めていくとP172のYコンビネータに行き着く。(コンビネータでのループ結合子)

あー説明下手でごめん。
0971デフォルトの名無しさん2008/03/09(日) 23:40:51
>>970
レスありがとうございます。

>P154のweight*をよく見ると、(× weight* (first pora)) 2)、というのがあって2倍している。
説明不足でした。意味不明と書いたのは、以下のとおりです。

何かを減らしていくことでgoalに近づくというのは理解できます。
ただ、align関数とは何の関係も無いと思えるweight*関数の説明を
持ち出すことが、align関数のtotal function性(無限ループにはならない関数)
の証明になっているのかがピンときません。
align関数の中でlength*関数やweight*関数を使っているわけではないので。
(もちろん、length*関数、weight*関数それぞれの動作は理解できます。)
0972デフォルトの名無しさん2008/03/10(月) 00:23:03
すみません。
weight*関数で何故一番目のコンポーネントを二倍する
必要があるのかは分かっていません。

alignの再帰が進むにつれて何かが減っていくということを定量的に
示すためにweight*を持ち出しているとは予想できるのですが、

weight* pora
1 (a)
3 (a b)
5 (a (b c))
7 ((a b) c)

例えば((a b) c)にshiftを実行すると、(a (b c)) になる。
このときweight*は7から5に減る。つまりゴールに向かっている。
ということは感覚では分かるのですが、何故weight*という関数
なんだろうか?ということなんですよね。
0973デフォルトの名無しさん2008/03/10(月) 00:27:46
>>971
weight*はtotal functionになってるけど、alignとlength*はそうじゃない。どういう場合にtotal functionといえるのか?
それはもう少し先まで読んでみるとわかる。

>align関数のtotal function性(無限ループにはならない関数)
>の証明になっているのかがピンときません。

この本は発見的に自分で違いを見つけさせる方針だから証明はしてない。
alignはtotal functionになってないことを理解しよう。
そして先を読んでみると他のtotal functionにならない例が出てくる。
典型的な例を知っておくと計算が終了しないバグに対する免疫ができる。
それがこの辺のねらい。とにかく先に進んでみる。
0974デフォルトの名無しさん2008/03/10(月) 00:46:38
>weight*関数で何故一番目のコンポーネントを二倍する
>必要があるのかは分かっていません。

一番目のコンポーネントがsimplerになっているかどうかを定量的に評価するため。
例えば2ではない数でやってみるとどうなるかやってみるといい。3とか5とか7ではどうか?

>alignの再帰が進むにつれて何かが減っていくということを定量的に
>示すためにweight*を持ち出しているとは予想できるのですが、

これについては予想で終わらせずに、実際計算してみるほうがいい。
length*のようなsimplerになっているかどうかの定量的評価と、
weight*のようなsimplerになっているかどうかの定量的評価では
どちらが再帰関数のThe seventh commandmentを確認できるか?
0975デフォルトの名無しさん2008/03/10(月) 11:05:05
レスありがとうございます。

>>973
alignはpartial functionではないと書いてあるのですが、これは
alignがtotal functionであるという意味ではないんんでしょうか?
length*もatomの数を必ず返してくるのでtotal functionだと思ってる
のですが。

>典型的な例を知っておくと計算が終了しないバグに対する免疫ができる。
>それがこの辺のねらい。
なるほど。先に進んで見ます。

>>974
alignのtotal性の判断を難しくしているのは(align (shift pora))の部分ということで
、ここを考察しているわけですよね。else節では、second poraに対してalignが
再帰していますが、ここはsecondを適用しているので必ず元のリストより小さくなります。
つまり The seventh commandmentを満たしているのでtotal性の条件を満たしている。
問題の(align (shift pora))については、poraの性質を考えるとshiftを適用していけば
いつかは(atom? pora)が真になるか(a-pair? (first pora))が偽になることは明白です。
つまり、total性が分かっているelse節がいつかは実行される。これを定量的に表すために
length*を導入しても判断できなかった。何故なら、poraにshiftを適用し続けると
一番目のコンポーネントは徐々に短くなっていくのに、length*はそれを考慮していない。
そこで、一番目のコンポーネントを2倍(2以上なら可)していく重みを付けることが
必要だったということかなと思えました。

0976デフォルトの名無しさん2008/03/10(月) 13:55:53
little schemer P160の
英文の意味がわからないので教えてください。

What if we didn't have (define ...)
anymore? Could we still define length.
(予想)define文を何も持たなかった場合はどうですか?
それでもlengthを定義できますか?

Without (define...) nothing, and especially
not the body of length, could refer to length.
ここがわかりません。
0977デフォルトの名無しさん2008/03/10(月) 14:17:49
>>976
予想はそれでいい。

> Without (define...)
defineがなければ、
> nothing could refer to length.
誰もlengthを参照することができない。
> and especially not the body of length
lengthのボディからさえ参照することができないのだ。

and以下はnothingに付けられた修飾節。
誰も参照することはできないし、
今特に問題にしている再帰的定義のための、
λ式本体からの自分自身への参照も出来ない。

0978デフォルトの名無しさん2008/03/10(月) 15:53:43
>>977
ご丁寧にありがとうございました。

nothingが主語だということを気づけませんでした。

and especially...の文節は、倒置されていますか?
つまり、the body of lengthが主語。
省略しないで書くと

(予想)
and especially the body of length (could) not (refer to) length
特にlengthのボディ(定義部)が、lengthを参照できない。

>今特に問題にしている再帰的定義のための、
>λ式本体からの自分自身への参照も出来ない。

結局、lengthを定義する際に、λ式にdefineで名前を与えてやらないと、
λ式本体(lambda文の定義部)で、無限にλ式がネストしてしまう、
つまり定義不可能と理解しました。
0979デフォルトの名無しさん2008/03/10(月) 17:36:33
いいんじゃないでしょうか。
0980デフォルトの名無しさん2008/03/10(月) 17:40:40
>>979
ご教示ありがとうございました。
0981デフォルトの名無しさん2008/03/10(月) 17:46:34
P164の以下の式を理解するのに
順番に展開してみたところ、明らかに文法上不正にも
関わらず、その部分が実行されないかぎりエラーとは
みなされないようですが、Schemeはそういう文化なのでしょうか?
(C++のテンプレートにもSFINAEというルールがありますが)

;length(<=1)

((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((mk-length eternity) (cdr l))))))))

;展開 第一段階
((lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((mk-length eternity) (cdr l)))))))

(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((mk-length eternity) (cdr l)))))))
)

続く
0982デフォルトの名無しさん2008/03/10(月) 17:58:06
;展開 最終形
(lambda (l)
(cond
((null? l) 0) ; -----�@
(else (add1 (((lambda (mk-length)
(lambda (l)
(cond
((null? l) 0) ; -----�A
(else (add1 ((mk-length eternity) (cdr l))))))) eternity) (cdr l)))))) ;-----�B

ここで、nullリストかatomを一つだけ持つリストを渡してやると、それぞれ
上に示しました�@、�Aで処理が終了するので、正しい長さである0と1が返って
きます。疑問はありません。

ただ、定義上与えてはいけない二つのatomを持つリスト '(a b) などを
渡した場合を考えると、�Bの部分が実行されることになりますが、
add1の引数にlambda関数を渡すことになるので、引数として数字を一つだけ
とる仕様のadd1関数の文法に違反します。nullリストかatomを一つだけ持つ
リストを渡している限り�Bの部分は評価されないので、それはOKということに
なるのでしょうか?
0983デフォルトの名無しさん2008/03/10(月) 18:12:04
失礼しました。P165のlength0についてでした。

>>981 >>982 はeternityを使ってるのでadd1の文法違反ではなく
リスト(a b)に対しては無限ループになります。

;length0
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (mk-length (cdr l))))))))

;展開 第一段階
((lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (mk-length (cdr l)))))))

(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (mk-length (cdr l)))))))
)

0984デフォルトの名無しさん2008/03/10(月) 18:12:42
;length0
;展開 最終形

(lambda (l)
(cond
((null? l) 0)
(else (add1 ((lambda (mk-length) -----�B
(lambda (l)
(cond
((null? l) 0)
(else (add1 (mk-length (cdr l))))))) (cdr l))))))

本関数に atomを一つ持つリストを渡すと�Bの部分が評価されることになりますが
結果的に関数を渡すことになるためadd1の仕様に反し文法エラーになるはず。
nullリストだけを渡す限り�Bは実行されないのでエラーにはならず正しく0
が返ってきます。


0985デフォルトの名無しさん2008/03/10(月) 20:15:35
読み終えた。
Y combinator の説明は展開が複雑すぎ。。
0986デフォルトの名無しさん2008/03/10(月) 20:34:41
けど読み終えるとY結合子が魔法じゃないことが分かっておもしろいじゃん。
λ式って本当におもしろい。
0987デフォルトの名無しさん2008/03/10(月) 20:36:49
>>985
Little Lisper には演習問題があるのでひとつ紹介しよう。

演習9.4:

With the Y-combinator we can reduce the number of arguments on which a function has to recur.
For example, member can be rewritten as:

(define member-Y
(lambda (a l)
((Y (lambda (recfun)
(lambda (l)
(cond
((null? l) nil)
(t (or
(eq? (car l) a)
(recfun (cdr l))))))))
l)))

Step through the application (member-Y a l) where a is x and l is (y x).
Rewrite the functions rember, insertR, and subst2 in a similar mannar.
0988デフォルトの名無しさん2008/03/10(月) 20:40:09
>>987の「t」はschemeのelseに相当する。
0989デフォルトの名無しさん2008/03/10(月) 20:43:30
(define length
(Y
(lambda (recfun)
(lambda (l)
(cond
((null? l) 0)
(t (add1
(recfun (cdr l)))))))))
0990デフォルトの名無しさん2008/03/10(月) 21:10:32
演習9.3:

In the chapter we have derived a Y-combinator that allows us to write recursive functions of one argument without using define.
Here is the Y-combinator for functions of two arguments:

(define Y2
(lambda (M)
((lambda (future)
(M (lambda (arg1 arg2)
((future future) arg1 arg2))))
(lambda (future)
(M (lambda (arg1 arg2)
((future future) arg1 arg2)))))))

Write the functions =, rempick, and pick using Y2.

Note: There is a version of (lambda ...) for defining a function of an arbitrary number of arguments, and an apply function for applying such a function to a list of arguments.
With this you can write a single Y-combinator for all functions.
0991デフォルトの名無しさん2008/03/10(月) 21:25:05
>>986
理屈を追っただけなので、まだ何がメリットなのかよくわからんです。
lengthならストレートに書いたほうが短くて全然わかりやすいし。
それとも普通の言語でいうアルゴリズム的存在で、
例えばスタックとかの理屈を理解したというレベルでしょうかね。
で、使っているうちにY-combinator自体がライブラリのような感覚
になっていって。。

気長にやります。

>>987
ありがとうございます。
やってみます。



0992デフォルトの名無しさん2008/03/10(月) 21:26:58
>>990
いただきます。
何で演習問題なくなってしまったんだろうか。
0993デフォルトの名無しさん2008/03/10(月) 21:31:35
>>978

>結局、lengthを定義する際に、λ式にdefineで名前を与えてやらないと、
>λ式本体(lambda文の定義部)で、無限にλ式がネストしてしまう、
>つまり定義不可能と理解しました。

ところが>>989をよくみるとY-combinatorのご利益がわかる。
これでdefineで名前空間を汚さなくて済むようになる。
0994デフォルトの名無しさん2008/03/10(月) 21:36:49
P160で「defineなしにlengthは定義できないのか?」といっていたよね。
でも>>993で言ったように定義出来ることが確認できた。

>理屈を追っただけなので、まだ何がメリットなのかよくわからんです。
>lengthならストレートに書いたほうが短くて全然わかりやすいし。

もはや名前空間を汚さずに出来る。
コンビネーターの世界へようこそ!
0995デフォルトの名無しさん2008/03/10(月) 21:39:47
計算論 高橋正子って予備知識必要?
0996デフォルトの名無しさん2008/03/10(月) 21:41:17
>>993
でもプログラムの中に毎回

(Y
(lambda (recfun)
(lambda (l)
(cond
((null? l) 0)
(t (add1
(recfun (cdr l))))))))

と記述するのは面倒です。インタラクティブに実行するときも
メンドイ。名前が無いととても扱いにくいです。
上の式自体にlengthって名前付けてしまうと、名前空間を汚さない
メリットが無いような。
0997デフォルトの名無しさん2008/03/10(月) 21:42:33
>>992
Daniel P. Friedman先生のHPにPSファイルがあります。
http://www.ccs.neu.edu/home/matthias/BTLS/
Exercises: TLL/3rdのリンクがそうかも。
0998デフォルトの名無しさん2008/03/10(月) 21:46:56
>>994
define名が無くても出来るってことですね。とは言っても名前空間を汚さない以外に
何かメリットはないものでしょうか、という疑問が。
修行します。
0999デフォルトの名無しさん2008/03/10(月) 21:50:29
>>996

(((lambda (M)
((lambda (future)
(M (lambda (arg)
((future future) arg))))
(lambda (future)
(M (lambda (arg)
(future future) arg))))))
(lambda (recfun)
(lambda (l)
(cond
((null? l) 0)
(t (add1 (recfun (cdr l))))))))
(quote (a b c)))

Whew, names may not be necessary, but they sure can be useful!

<<from Little Lisper P173>>
1000デフォルトの名無しさん2008/03/10(月) 21:52:34
Does your hat still fit?

Perhaps not after such a mind stretcher.
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。