Lisp Scheme Part22at TECH
Lisp Scheme Part22 - 暇つぶし2ch1:デフォルトの名無しさん
08/05/21 23:58:40
□過去スレ□
Part21: スレリンク(tech板)
Part20: スレリンク(tech板)
Part19: スレリンク(tech板)
Part18: スレリンク(tech板)
Part17: スレリンク(tech板)
Part16: スレリンク(tech板)
Part15: スレリンク(tech板)
Part14: スレリンク(tech板)
Part13: スレリンク(tech板)
Part12: スレリンク(tech板)
Part11: スレリンク(tech板)
Part10: スレリンク(tech板)
Part9: スレリンク(tech板)
Part8: URLリンク(pc5.2ch.net)
Part7: URLリンク(pc5.2ch.net)
Part6: URLリンク(pc3.2ch.net)
Part5: URLリンク(pc3.2ch.net)
Part4: URLリンク(pc.2ch.net)
Part3: URLリンク(pc.2ch.net)
Part2: URLリンク(pc.2ch.net)
Part1: URLリンク(piza2.2ch.net)

2:デフォルトの名無しさん
08/05/21 23:59:51
□参考リンク□

日本Lispユーザ会(日本語)
URLリンク(jp.franz.com)
ここにかなりの情報があります。 削るとAllegro Common Lispのページへ

プログラミング言語Scheme(日本語)
URLリンク(www.sci.u-toyama.ac.jp)
Schemeの人はまずここを見ましょう。

Schemeへの道(日本語)
URLリンク(www.stdio.h.kyoto-u.ac.jp)
ここはschemeの入門サイト。

Practical Scheme(日本語)
URLリンク(practical-scheme.net)
「普通のやつらの上を行け」など、興味深い文書を沢山翻訳されてます。
(Gaucheという完成度の高いscheme処理系作者さんのページでもあります。)

LispUser.net
URLリンク(lispuser.net)

3:デフォルトの名無しさん
08/05/22 00:00:15
□仕様関係□

CLtL2: Common Lisp the Language 2nd edition
URLリンク(www-2.cs.cmu.edu)

CLHS: Common Lisp Hyper Spec
URLリンク(www.ai.mit.edu)

R5RS: Revised(5) Report on the Algorithmic Language Scheme (ja)
URLリンク(www.sci.u-toyama.ac.jp)

R5RS: Revised(5) Report on the Algorithmic Language Scheme (en)
URLリンク(swiss.csail.mit.edu)

ERR5RS: A proposal for an Extended R5RS Scheme
URLリンク(scheme-punks.cyber-rush.org)

R6RS: Revised(6) Report on the Algorithmic Language Scheme
URLリンク(www.r6rs.org)

4:デフォルトの名無しさん
08/05/22 00:01:08
□SICP関係□

SICP(英語)
URLリンク(mitpress.mit.edu)
「計算機プログラムの構造と解釈」の原書です。 全てオンラインで読めます。

計算機プログラムの構造と解釈 第二版 (snip) に関連するホームページ
URLリンク(sicp.ipl.t.u-tokyo.ac.jp)

□wikipedia関連□

URLリンク(ja.wikipedia.org)
URLリンク(ja.wikipedia.org)
URLリンク(ja.wikipedia.org)

□継続□

なんでも継続
URLリンク(practical-scheme.net)

Schemeへの道:継続
URLリンク(www.stdio.h.kyoto-u.ac.jp)

継続の使い方
URLリンク(www.geocities.co.jp)

継続の使用法
URLリンク(www.ice.nuie.nagoya-u.ac.jp)

Kahua: 継続ベースのアプリケーションサーバー
URLリンク(www.kahua.org)

5:デフォルトの名無しさん
08/05/22 00:01:24
>>1乙であります。

6:デフォルトの名無しさん
08/05/22 00:01:48
□その他□ (便利な情報リソース)

John McCarthy's Home Page
URLリンク(www-formal.stanford.edu)
LISPの生みの親、J・マッカーシーのページだそうです。

Association of Lisp Users 米国のLispユーザ会
URLリンク(www.alu.org)

CMUのLisp Repository 新旧様々なプログラムが置いてある
fURLリンク(ftp.cs.cmu.edu)

The Common Lisp Cookbook: いわゆる Cookbook
URLリンク(cl-cookbook.sourceforge.net)

Bibliography of Scheme-related Research Scheme関連の論文リンク集
URLリンク(library.readscheme.org)

Scheme Hash(英語) S式でXMLを使える様にするSXMLなど
URLリンク(okmij.org)

幻の「入門Scheme」 オンラインで読める
URLリンク(www4.ocn.ne.jp)

各種scheme処理系をcygwin上からビルドする方法など。
URLリンク(www.geocities.co.jp)

encyCMUCLopedia (cmucl以外でも有益なはず )
URLリンク(www.isr.ist.utl.pt)

7:デフォルトの名無しさん
08/05/22 00:06:18
□その他その2□

独習 Scheme 三週間 (Schemeの教科書 )
URLリンク(www.sampou.org)

Cliki (CLコードがたくさん紹介されている。)
URLリンク(www.cliki.net)

よろずや (lispの実用的な情報が色々。 )
URLリンク(www.geocities.co.jp)

Common-Lisp.net: 多くのプロジェクトがホスティングされてる
URLリンク(common-lisp.net)

Practical Common Lisp: S式の羅列で現実的な問題をどう解くのかそのギャップに悩まされてる人に
URLリンク(www.gigamonkeys.com)

SLIB
URLリンク(swiss.csail.mit.edu)

SRFI
URLリンク(srfi.schemers.org)

Meadow memo: 2ちゃんねるログ(dat落ちした過去スレの一部が見られます。 )
URLリンク(www.bookshelf.jp)

Lispとは何か
URLリンク(www.asahi-net.or.jp)

8:デフォルトの名無しさん
08/05/22 00:06:42
□その他その3□

初心者が集うIRC(布教してくれる先生も大募集です)
irc.scenecritique.com
port 6667
チャンネル #Lisp_Scheme

Scheme のテストコード書いたり、簡単な実行したりコードさらしたりするにはここへカモン。
URLリンク(codepad.org)
コードを書いて実行した時のURLを記録しておけば、
実行結果も一緒にさらす事が出来て幸せです。

9:デフォルトの名無しさん
08/05/22 00:07:42
□実装□

Bit (mini-schemeよりも小さい(?)bytecode変換系 )
URLリンク(www.iro.umontreal.ca)

Lisp 言語処理系: CAMPUS LIsP, Lemon version (Cでわずか1000行)
URLリンク(www-masu.ist.osaka-u.ac.jp)

Schemix (Linuxのkernelへのパッチで/dev/として扱えるTinyScheme )
URLリンク(www.abstractnonsense.com)

awkで書かれたわずか500行のLispインタプリタ
URLリンク(www.accesscom.com)

Bigloo CLR 用のコードを吐けるようになったらしい
URLリンク(www-sop.inria.fr)

SECDR-Scheme: SECD machine model に基づく実装
URLリンク(lily.fan.gr.jp)

Minischeme: 1 ファイルに凝縮された Scheme 処理系
URLリンク(tinyscheme.sourceforge.net)

TinyScheme: Minischeme を色々弄ったもの
URLリンク(tinyscheme.sourceforge.net)

KI-Scheme, AM-Scheme, etc...
URLリンク(www.nifty.com)

LispMe: Palm 上で動く Scheme 処理系. これも SECD virtual machine.
URLリンク(www.lispme.de)

10:デフォルトの名無しさん
08/05/22 00:09:07
□実装その2□

Gauche: R5RS準拠のScheme処理系。Shiro Kawaiさん作。
URLリンク(practical-scheme.net)

PLT Scheme: DrScheme、MzSchemeなどのR5RS準拠および独自拡張のScheme処理系
URLリンク(www.plt-scheme.org)

Scheme48: R5RS準拠のSchemeのバイトコードインタプリタ
URLリンク(www.s48.org)

Gambit-C: R5RS準拠のScheme処理系
URLリンク(dynamo.iro.umontreal.ca)

Chicken: R5RS準拠のScheme処理系 スタンドアロン実行ファイルが簡単に作成できます
URLリンク(www.call-with-current-continuation.org)

Steel Bank Common Lisp: Common Lisp処理系
URLリンク(www.sbcl.org)

CMUCL: Common Lisp処理系
URLリンク(www.cons.org)

GNU CLISP: Common Lisp処理系
URLリンク(www.clisp.org)

Embeddable Common Lisp: Common Lisp処理系
URLリンク(ecls.sourceforge.net)

Arc: ポール・グレアム氏が作成した新しいLisp
URLリンク(arclanguage.org)

11:デフォルトの名無しさん
08/05/22 00:09:40
□イベント□

GaucheNight(2008-03-08)
URLリンク(practical-scheme.net)
SchemeとGaucheとλとS式を愛するすべての人に贈るマクロな一夜。
川合史朗、伊藤篤、山下伸夫、笹田耕一、ひげぽん、zick、黒田寿男、えんどうやすゆき、ほか

GaucheNight(2007-05-09)
URLリンク(practical-scheme.net)
川合史朗、黒田寿男、まつもとゆきひろ(Skype中継)、小飼弾、
伊東勝利、久井亨、小黒直樹、ほか

黒田氏関係 (黒板の人)
スレリンク(tech板:901-909番)
URLリンク(cl-www.msi.co.jp)
Scheme:マクロ:CommonLispとの比較
URLリンク(practical-scheme.net)
Script Languages
URLリンク(cl-www.msi.co.jp)

12:デフォルトの名無しさん
08/05/22 00:12:20
□書籍□

<プログラミングGauche>
・著者:川合史朗 監修 / Kahuaプロジェクト 著
・定価:3360円(本体3200円+税)
・B5変 524頁
・ISBN 978-4-87311-348-7
・発売日:2008/03/14

Scheme処理系言語Gauche(ゴーシュ)の初の解説書!

URLリンク(ssl.ohmsha.co.jp)
立ち読み版
URLリンク(karetta.jp)

<On Lisp>

・著者:Paul Graham 著 / 野田 開 訳
・定価:3990円(本体3800円+税)
・A5 440頁
・ISBN 978-4-274-06637-5

LispハッカーPaul Grahamが、Lispの力の源泉であるマクロプログラミングを解説

URLリンク(ssl.ohmsha.co.jp)
HTML版
URLリンク(user.ecc.u-tokyo.ac.jp)

<The Scheme Programming Language>

 (英語 オンライン読可)
URLリンク(www.scheme.com)

13:デフォルトの名無しさん
08/05/22 00:12:53
□2ch上にあるLISP関係のスレ□ (現在)

【入門】Common Lisp その4【質問よろず】
スレリンク(tech板)

【CGI】実用比較Lisp vs C/C++【GUI】
スレリンク(tech板)

【魔法】リリカル☆Lisp【言語】
スレリンク(tech板)

Lisp@UNIX版
スレリンク(unix板)

Emacs Lisp 3
スレリンク(tech板)

【ヤパーリ】XMLをS式に置換えていくスレ【LISP最強】
スレリンク(tech板)

【SICP】計算機プログラムの構造と解釈 Part2
スレリンク(tech板)

【普通のやつらの】 Arc Language 0 【上を行け】
スレリンク(tech板)

14:デフォルトの名無しさん
08/05/22 00:16:11
※ Common Lisp、Scheme及びS式を使用するLisp族全般のスレです ※

15:デフォルトの名無しさん
08/05/22 01:05:55
>>1
λ....... あ、、これはラムダなんだからね!乙じゃないんだからぁ!

16:デフォルトの名無しさん
08/05/22 03:17:05
>>10
guile:R5RS準拠のGNUの公式拡張用言語、もちろんSLIBも使えます。
URLリンク(www.gnu.org)


17:デフォルトの名無しさん
08/05/22 20:24:36
Schemeは論理プログラミングも出来ます。
URLリンク(codepad.org)

18:デフォルトの名無しさん
08/05/22 21:49:40
つ「不思議の国のアリス」【論理パズル】

女王様のジャムが盗まれました.犯行は単独犯によるものだとい
うことがわかっていて,容疑者は三月ウサギと頭のいかれた帽子屋とヤマネです.それぞれを取
り調べたところつぎのような証言をしました.

三月ウサギ 「私は絶対にジャムなど盗んでいません.」

帽子屋 「私たち3人のうち1人がジャムを盗みました.でもそれは私ではありません」

ヤマネ 「ウサギと帽子屋のどちらか一方だけが本当のことを言っています」

さらに調べたところ,三月ウサギとヤマネの少なくとも一方は嘘だということがわかりました.
ジャムを盗んだのは誰でしょうか?

19:デフォルトの名無しさん
08/05/22 22:02:34
オレオレ

20:デフォルトの名無しさん
08/05/22 23:02:06
>>19
三月ウサギ or 帽子屋 or ヤマネ ?

21:デフォルトの名無しさん
08/05/22 23:04:06
自分のことって意外と判らんもんなんですわ

22:デフォルトの名無しさん
08/05/22 23:08:00
>>17みたく解けるんだろうなぁ orz

23:デフォルトの名無しさん
08/05/22 23:13:18
>>19
おまえ三月ウサギだったのか。往生しろ!w
URLリンク(codepad.org)

24:デフォルトの名無しさん
08/05/22 23:18:54
URLリンク(ja.wikipedia.org)

25:デフォルトの名無しさん
08/05/22 23:25:14
>>18
ジャムを盗んだのは誰でしょうか?と質問してる人

26:デフォルトの名無しさん
08/05/22 23:26:48
三月ウサギw
発情してるからかw
>自分のことって意外と判らんもんなんですわ

27:デフォルトの名無しさん
08/05/22 23:34:56
ヤマネが嘘→兎が真且つ帽子が真 もしくは 兎が嘘且つ帽子が嘘
前者ならヤマネが犯人、後者は矛盾
ヤマネが真→兎が嘘且つ帽子が真
兎が犯人

じゃない?

28:デフォルトの名無しさん
08/05/23 01:01:49
>>27
それだけだと条件が足りず、答えが2通りでてしまう。

29:デフォルトの名無しさん
08/05/23 01:16:22
scheme のコードを elisp として使えるライブラリってもうありますか?

30:デフォルトの名無しさん
08/05/23 09:35:29
18の条件だと犯人が一人に絞り込めないんじゃないですか?

31:デフォルトの名無しさん
08/05/23 09:59:13
このスレでquiz出したい奴はS式で書けよ。

32:こんなんでどうだろ
08/05/23 16:36:16
(define mrubbit-s '(not (criminal mrubbit)))
(define mhatter-s '(and (not (criminal mhatter)) (or mrubbit mhatter dormouse)))
(define dormouse-s '(xor (truth mrubbit-s) (truth mhatter-s)))

(define term '(and (xor (criminal mrubbit) (criminal mhatter) (criminal dormouse))
         (or (not (truth mrubbit-s)) (not (truth dormouse-s))) ))
(truth term)


33:デフォルトの名無しさん
08/05/23 18:07:56
>>30
絞れます。>>23

34:デフォルトの名無しさん
08/05/23 18:10:40
>>31
できない子は有難くROMってろw

35:デフォルトの名無しさん
08/05/23 18:13:13
truthが定義されていないからなんとも。

36:デフォルトの名無しさん
08/05/23 19:11:18
;さらに調べたところ,三月ウサギとヤマネの少なくとも一方は嘘だということがわかりました.
;⇒(xor (①) (③))⇒(xor (①) (xor (①) (②)))

ここ違いませんか?

37:デフォルトの名無しさん
08/05/23 19:35:29
まあ答えが間違ってるんだからどこかが違うんだろう

38:デフォルトの名無しさん
08/05/23 19:36:35
>>36
もう少し具体的に言うとどういうところ?

39:デフォルトの名無しさん
08/05/23 19:39:58
>>37
ばーか。答は合ってるんだよ。ちっとはググレ。解き方が変なんだ。

40:デフォルトの名無しさん
08/05/23 20:17:44
>>38
(xor (①) (③))だと(少なくとも一方が嘘)ではなく(どちらか一方が嘘)になる

41:デフォルトの名無しさん
08/05/23 20:59:26
こうじゃないですか?
URLリンク(codepad.org)

42:デフォルトの名無しさん
08/05/23 21:47:12
>>40-41
残念。答が違うよ。

43:デフォルトの名無しさん
08/05/23 21:49:04
論理プログラミングってのは意外と答がちゃんと出ないモンなんだね。

44:デフォルトの名無しさん
08/05/23 21:52:40
ということにしたいのですね

45:デフォルトの名無しさん
08/05/23 21:52:48
>>41
(not (and (①) (③)))ではだめ。それだと両方とも嘘だということになって意味が違ってしまう。

46:デフォルトの名無しさん
08/05/23 21:55:19
(or (not (①)) (not (③))) ってことじゃね?

47:デフォルトの名無しさん
08/05/23 21:55:59
「さらに調べたところ,三月ウサギとヤマネの少なくとも一方は嘘だということがわかりました.」
なら三月ウサギとヤマネの両方が嘘でも真では?

48:デフォルトの名無しさん
08/05/23 22:05:01
(or (not (①)) (not (③))) でやっても答が合わない。
URLリンク(codepad.org)

49:デフォルトの名無しさん
08/05/23 22:06:03
>>47
ベン図書いてミソ。

50:デフォルトの名無しさん
08/05/23 22:07:43
あちこち見た結果、>>23が正解らしい。でもなぜ?

51:デフォルトの名無しさん
08/05/23 22:08:23
少なくとも一方は○○ と どちらか一方は○○
は違いますよね?

52:デフォルトの名無しさん
08/05/23 22:11:47
>>41>>48はrequireが2つなのに、>>23には3つあるんだよな。
文章からココを読み取れるかどうかが論理プログラミングの難しいところか。

53:デフォルトの名無しさん
08/05/23 22:14:48
>>51
なら>>41>>48が同じ答になるのは何故?

54:デフォルトの名無しさん
08/05/23 22:17:33
答えに合わせてプログラミングしてるように見えるのは気のせいですか?

55:デフォルトの名無しさん
08/05/23 22:25:39
>>54
それは違う。
論理的帰結としてrequireになることがわかった枝をこのschemeの論理プログラムでは自動的に修正できない。
そこで、プログラマーが自分でその枝をrequireにしてやらなければならない。
半自動定理証明を調べてみろ。

56:デフォルトの名無しさん
08/05/23 22:39:59
2人組がいる。少なくとも1人は男だ。
(男 . 男) -> #t
(男 . 女) -> #t
(女 . 男) -> #t
(女 . 女) -> #f

2人組がいる。どちらか1人は男だ。
(男 . 男) -> #f
(男 . 女) -> #t
(女 . 男) -> #t
(女 . 女) -> #f

>>53
志村~、ド・モルガン

57:デフォルトの名無しさん
08/05/23 22:44:16
>>55
あ、そっか。対話型でやってる部分はそういう項を書き換えてるということだね。
つまり>>23は書き換え操作が入ってるから枝が増えてるということか。

58:デフォルトの名無しさん
08/05/23 23:04:49
>>53,>>56
それはわかったw

59:デフォルトの名無しさん
08/05/23 23:07:06
おれも正解にたどり着いた。「不思議の国のアリス」ってこんな難しかった記憶無いぞw
URLリンク(codepad.org)

60:デフォルトの名無しさん
08/05/23 23:14:56
>>23>>59は同じなの?

61:デフォルトの名無しさん
08/05/23 23:15:09
なぜこんなにヤマネは信用されてるんでしょう?

62:デフォルトの名無しさん
08/05/23 23:15:51
そもそも
(define (誰かひとりが犯人?  . ls)
    (cond
     ((eq? (car ls) '有罪) (and (eq? (cadr ls) '無罪) (eq? (caddr ls) '無罪)))
     ((eq? (cadr ls) '有罪) (and (eq? (car ls) '無罪) (eq? (caddr ls) '無罪)))
     ((eq? (caddr ls) '有罪) (and (eq? (car ls) '無罪) (eq? (cadr ls) '無罪)))))
の不備は不問?

63:デフォルトの名無しさん
08/05/23 23:22:27
ヒント:手で計算した人は皆同じ答えを出しています。

64:デフォルトの名無しさん
08/05/23 23:27:56
同じじゃない。>>59の1つ目のrequireは①と③が両方とも嘘の場合を含んでるけど、
>>23のは含んでない。
でも、>>23も正解に到達するのは2つ目のrequireを追加することが両方とも嘘の場合を却下したからだ。
だから>>59の両方とも嘘の場合もキャンセルされて、>>23>>59は同じ結果になる。
ということは>>23はrequireを追加しただけじゃなく(not(and① ②))も書き換えてることになる。

65:デフォルトの名無しさん
08/05/23 23:29:33
>>64>>60への返答。

66:デフォルトの名無しさん
08/05/23 23:31:38
ウサギ「俺じゃない」
帽子屋「俺じゃない」
ヤマネ「ウサギか帽子屋のどちらかだ」

67:デフォルトの名無しさん
08/05/23 23:37:02
ヤマネの主張をrequireしたら必然的にウサギが犯人になる
なぜヤマネの主張をrequireする?

68:デフォルトの名無しさん
08/05/23 23:43:43
>>62
(define (誰かひとりが犯人? . ls)
(cond
((eq? (car ls) '有罪) (and (eq? (cadr ls) '無罪) (eq? (caddr ls) '無罪)))
((eq? (cadr ls) '有罪) (and (eq? (car ls) '無罪) (eq? (caddr ls) '無罪)))
((eq? (caddr ls) '有罪) (and (eq? (car ls) '無罪) (eq? (cadr ls) '無罪)))
(else #f)))

こうだよねw

69:デフォルトの名無しさん
08/05/23 23:46:43
>>68の修正と>>59を合体したが結果は同じ。
URLリンク(codepad.org)

70:デフォルトの名無しさん
08/05/23 23:50:30
(require (xor (xor
                   (eq? 帽子屋 '有罪) (eq? ヤマネ '有罪))
                 (xor (eq? 三月ウサギ '有罪) (eq? ヤマネ '有罪))))
があるってことはヤマネは常に正しい事を言ってるんですね。
ヤマネの弁護士の方ですか?

71:デフォルトの名無しさん
08/05/24 00:05:26
もしも帽子屋がうそをついたならウサギもヤマネも無罪。⇒ウサギが無罪なら、ウサギは本当のことを言った。⇒ヤマネも本当のことを言った。
しかし、ウサギとヤマネが少なくとも一方は嘘だということに矛盾する。
したがって、帽子屋は本当のことをいった。ここまではわかった。

72:デフォルトの名無しさん
08/05/24 00:09:28
>>66のように三人とも自分が犯人ではないと主張しているだけで
犯人であることと嘘を言っていることは同値ということになります

で、ウサギとヤマネの少なくとも一方が嘘ですが、これ以上絞り込めません

73:デフォルトの名無しさん
08/05/24 00:13:43
他のサイト見たら
>ヤマネ 「ウサギと帽子屋のどちらか一方だけが本当のことを言っています」
ヤマネ 「ウサギと帽子屋の少なくとも一方は本当のことを言っています」
になってた。つまり、帽子屋が本当のことをいった時点でヤマネは本当のことを言ったことになる。
つまり>>18の問題文は間違ってる。その結果、2通りの答が出ることになったと思う。
たぶん、>>23は他のサイトでも見てるんだろう。>>70の主張が正しいと思う。

74:デフォルトの名無しさん
08/05/24 00:34:54
(display-line (amb))じゃなくて
(let loop () (and (amb) (loop)))とかにしたほうがいいですね

75:デフォルトの名無しさん
08/05/24 01:31:24
つ「不思議の国のアリス」【論理パズル】

女王様のジャムが盗まれました.犯行は単独犯によるものだとい
うことがわかっていて,容疑者は三月ウサギと頭のいかれた帽子屋とヤマネです.それぞれを取
り調べたところつぎのような証言をしました.

三月ウサギ 「私は絶対にジャムなど盗んでいません.」

帽子屋 「私たち3人のうち1人がジャムを盗みました.でもそれは私ではありません」

ヤマネ 「ウサギと帽子屋の少なくとも一方は本当のことを言っています」 ←修正!

さらに調べたところ,三月ウサギとヤマネの少なくとも一方は嘘だということがわかりました.
ジャムを盗んだのは誰でしょうか?

URLリンク(codepad.org)

76:デフォルトの名無しさん
08/05/24 01:37:07
あ、>>75のリンクは間違い。

77:デフォルトの名無しさん
08/05/24 01:43:25
>>71,>>73
てことは、ヤマネが正しいことを言った。⇒三月ウサギとヤマネの少なくとも一方は嘘だ。⇒「私は絶対にジャムなど盗んでいません.」 が嘘。
つまりウサギが有罪。

78:デフォルトの名無しさん
08/05/24 01:44:39
で、最終的にどんなプログラムになるの?

79:デフォルトの名無しさん
08/05/24 01:54:17
そもそもの問題として、不思議の国のアリスは関係ない
これはレイモンド=スマリヤンの『パズルランドのアリス』という有名な論理パズル本の問題
URLリンク(www.amazon.co.jp)

80:デフォルトの名無しさん
08/05/24 01:58:55
>>75
ヤマネは自明なことを言ってるだけだな。

81:デフォルトの名無しさん
08/05/24 02:04:18
発言だけじゃなくて「ルール」も厳密じゃないといけないんだよな
「ウサギとヤマネの少なくとも一人は嘘をついていることが確定している」
でいいのか?
「ウサギとヤマネの言ったことは真実であるとは限らない」
ではなく?

82:デフォルトの名無しさん
08/05/24 02:16:55
うろ覚えではなく完全コピペの問題文でないと駄目だな
この手のは時々勝手な条件をつける人がいたり
省略や改変で余分な条件がついたりしてよく破綻する

83:デフォルトの名無しさん
08/05/24 03:51:10
つまり叙述トリックですね。わかります。

84:デフォルトの名無しさん
08/05/24 09:30:28
うざいんで、他でやってもらえますか

85:デフォルトの名無しさん
08/05/24 10:52:36
うざいだけなら君が我慢しよう

86:デフォルトの名無しさん
08/05/24 10:54:41
有名な問題をそのまま出すと、解く側もぐぐってコピペして提出するだけだからなあ
宿題にしても仕事にしても、そんなに甘くはないだろう

87:デフォルトの名無しさん
08/05/24 11:01:07
改変したせいで解が複数になったり不定になったりするんじゃ出題者の底が知れるがね

88:デフォルトの名無しさん
08/05/24 11:13:02
ジャンガジャンガジャンガジャンガ 
ジャンガジャンガジャンガジャンガー

89:デフォルトの名無しさん
08/05/24 15:33:59
prolog で解いてみた。いろいろ微妙。
xor( A, B ) :-
A -> ¥+B ; B.

truth(Is) :-
Is = [ [rabbit, g], [hatman, n], [yamane, n] ] ;
Is = [ [rabbit, n], [hatman, g], [yamane, n] ] ;
Is = [ [rabbit, n], [hatman, n], [yamane, g] ] .

rabbit_says(Is) :-
truth(Is),
member( [rabbit, n], Is ).

hatman_says(Is) :-
truth(Is),
member( [hatman, n], Is ).

yamane_says(Is) :-
xor( rabbit_says(Is), hatman_says(Is) ).

more_research(Is) :-
xor( rabbit_says(Is), yamane_says(Is) ).

solve(It) :-
truth(It),
yamane_says(It),
more_research(It).

?- findall(It, solve(It), All).
All = [[[rabbit, g], [hatman, n], [yamane, n]]].


90:デフォルトの名無しさん
08/05/24 15:38:23
共犯の可能性は考えないの?

91:デフォルトの名無しさん
08/05/24 15:44:27
>>90
犯行は単独犯によるものだということがわかっていて,
容疑者は三月ウサギと頭のいかれた帽子屋とヤマネです.

スマリヤン本持っている人、原著・翻訳本では正確な問いはどんなですか?

92:デフォルトの名無しさん
08/05/24 16:08:40
>>91
"Did YOU by any chance steal the jam?" the King asked the March Hare.
"I never stole the jam!" pleaded the March Hare.

"What about YOU?" the King roared to the Hatter, (中略)
"No, no!" pleaded the Hatter . "One of us stole it, but it wasn't me!"

"And what about YOU?" continued the King to the Dormouse.
"What do you have to say about all this? Did the March Hare and the Hatter both tell the truth?"
"At least one of them did," replied the Dormouse, (中略)

As subsequent investigation revealed, the March Hare and the Dormouse were not both speaking the truth.
Who stole the jam?

93:デフォルトの名無しさん
08/05/24 16:29:17
んでもって解答
The Hatter said, in effect, that either the March Hare or the Dormouse stole it.
If the Hatter lied, then neither the March Hare nor the Dormouse stole it,
which means that the March Hare didn't steal it, hence was speaking the truth.
Therefore, if the Hatter lied, then the March Hare didn't lie,
so it is impossible that the Hatter and the March Hare both lied.
Therefore the Dormouse spoke the truth when he said that the Hatter and March Hare didn't both lie.
So we know that the Dormouse spoke the truth. But we are given that the Dormouse and the March Hare didn't both speak the truth.
Then, since the Dormouse did, the March Hare didn't.
This means that the March Hare lied, so his statement was false, which means that the March Hare stole the jam.

これから逆算するに

ウサギ「私は盗んでいない」
帽子屋「ウサギかヤマネのどちらかが盗みました」
ヤマネ「帽子屋とウサギの両方が嘘を言っていることはありえません」
ルール:必ず単独犯で、ウサギとヤマネの両方が真実を告げているということはありえない


>>75が正しいかな

94:デフォルトの名無しさん
08/05/24 16:37:43
>>89
お前wwなんでもかんでもxorしやがって

notを使うのが怖いからヤマネが正しいことを前提にしてるのか?

95:デフォルトの名無しさん
08/05/24 17:51:54
(let ((* (amb 'usagi 'bousi 'yama)))
(let ((usagi (amb #t #f)) (bousi (amb #t #f)) (yama (amb #t #f)))
(when usagi
(unless (not (eq? * 'usagi)) (amb)))
(when (not usagi)
(unless (eq? * 'usagi) (amb)))
(when bousi
(unless (not (eq? * 'bousi)) (amb)))
(when (not bousi)
(unless (eq? * 'bousi) (amb)))
(when yama
(unless (or usagi bousi) (amb)))
(when (not yama)
(unless (not (or usagi bousi)) (amb)))
(unless (or (not usagi) (not yama)) (amb))
(display *)
(newline)
(amb)))

96:デフォルトの名無しさん
08/05/24 17:58:15
OSの操作もぜ~んぶScheme、S式で処理してしまうなんてことできないですか?

(dir 'c) なんてやると

(fileA fileB fileC ...)
みたいに返ってくるような。

S式で全部閉じた世界ってのを空想してます。

97:デフォルトの名無しさん
08/05/24 18:03:55
>>94

山根の証言が正しいことを前提にしてたのは、そうしないとヤマネも犯人になっちゃってたからw
あと、not を使うのが怖いってどういう意味?
ともかく、>>93を参考にしてもう一回問題を読み直して、ヤマネの証言に依存しないようにした

truth(Is) :- % 単独犯である
Is = [ [rabbit, g], [hatman, n], [yamane, n] ] ;
Is = [ [rabbit, n], [hatman, g], [yamane, n] ] ;
Is = [ [rabbit, n], [hatman, n], [yamane, g] ] .

rabbit_says(Is) :- % ウサギの証言
member( [rabbit, n], Is ). % 俺はやってない

hatman_says(Is) :- % 帽子屋の証言
member( [hatman, n], Is ). % 俺もやってない

yamane_says(Is) :- % ヤマネの証言
¥+( ( ¥+rabbit_says(Is), ¥+hatman_says(Is) ) ).
%% ウサギと帽子屋の両方が嘘を言っていることはあり得ない

more_research(Is) :- % その後の調査
¥+( ( rabbit_says(Is), yamane_says(Is) ) ).
%% ウサギとヤマネの両方の証言が真実だとはあり得ない

solve(It) :-
truth(It),
more_research(It).

?- findall(It,solve(It),All).
All = [[[rabbit, g], [hatman, n], [yamane, n]]].


98:デフォルトの名無しさん
08/05/24 18:04:58
>>96
こんなの?

URLリンク(www.scsh.net)

99:デフォルトの名無しさん
08/05/24 18:44:32
>>96
symbolicsの中古探してみるとか?


100:デフォルトの名無しさん
08/05/24 18:52:35
>>97
findallはProlog標準関数ですか?
働きがよくわかりません。

101:デフォルトの名無しさん
08/05/24 19:12:06
>>100

適当に説明すると、findall は第2引数(述語)を満たすような第1引数(変数)のリストを第3引数(変数)に束縛する。
ここでは、このプログラムがウサギが犯人であることを導くことと、それ以外の結論を導かないことを示すために使った。

URLリンク(www.cs.ualberta.ca)
の "3. Finding all solutions" も参考になると思う

102:デフォルトの名無しさん
08/05/24 19:51:55
>>98
>こんなの?
そうそう、そういうの。そういうのをWindowsで欲しい、作りたい。

>>99
>symbolicsの中古探してみるとか?

マジに中古あったらい欲しいっす。プレミアついてるんだろうか。
性能は今のパソコンより遥かに劣るんだし、安く手に入らんかな~。


103:デフォルトの名無しさん
08/05/24 20:11:57
connection machine がうちの研究所にあったらしいんだけど
捨てちゃったらしんだよね。俺が来るだいぶ前に。


捨てたってそれどういうことよ。
ありえないよ。
捨てるんだったら俺にくれ。

104:デフォルトの名無しさん
08/05/24 20:13:25
>>103 電気代どうするよwwWw


105:デフォルトの名無しさん
08/05/24 20:15:39
第五世代の ψマシン、中古で放出しないかね。

たしかに電気代は心配だなぁ。

106:デフォルトの名無しさん
08/05/24 20:19:32
>>103
自宅に200V電源あるのか?

107:デフォルトの名無しさん
08/05/24 20:25:50
>>106
ブレーカ 1 個つけりゃ 200V なんてすぐとれるだろ?
それとも 3相 200V が必要なのか?


108:デフォルトの名無しさん
08/05/24 21:16:06
>>107
途中のいろんなところに負荷が掛かるから自宅以外の工事も必要だろ常考。

109:デフォルトの名無しさん
08/05/24 22:02:19
>>101
㌧。わかりました。
solve(It)という制約条件を満たすItをバックトラック(?)して見つけて、それをAllにbag-ofする関数ですね。

110:デフォルトの名無しさん
08/05/24 22:06:52
(amb)と(require)と(bag-of)ってのは便利なんだね。

111:デフォルトの名無しさん
08/05/24 22:44:07
200Vつったら普通三相じゃねーの?

112:デフォルトの名無しさん
08/05/24 22:50:06
>>111
家庭の分電盤は単相三線が多い。
普通のコンセントには 100V + 100V として供給。
エアコンには 200V (センターアース)で供給。

113:デフォルトの名無しさん
08/05/24 23:58:18
>103
特定しますた

…漏れも触ってみたかった orz

114:デフォルトの名無しさん
08/05/25 01:33:58
>>103,104
通常の家屋じゃ電気代の前に床がもたんので貰っても結構高く付きそう。


115:デフォルトの名無しさん
08/05/25 08:39:43
Connection Machine か…。時代を先取りしすぎたよな。
チップ単体の性能向上に限界が見えつつある現代にこそふさわしい。

116:デフォルトの名無しさん
08/05/25 16:32:04
ベストエフォートのあのバスが先取りだってえ?

117:デフォルトの名無しさん
08/05/25 16:36:49
がらくたの話してる奴に一言。

「お前の話はツマラン」

118:デフォルトの名無しさん
08/05/25 16:39:40
>>117
さらに上を行ってどうするw

119:デフォルトの名無しさん
08/05/25 16:43:27
自分にだけは甘いっていうか、
自分の書くことが悉く金言至言に思えちゃう年頃なんですよ

120:デフォルトの名無しさん
08/05/25 16:44:33
今年は春が長いな。

121:デフォルトの名無しさん
08/05/25 17:43:18
プログラマってのはゴミみたいな奴ばっかだなw
その吹き溜まり社会に行かなくて良かったと思えるスレだなw

122:デフォルトの名無しさん
08/05/25 18:52:33
本質を見失って中傷することだけが正義と捉える輩にはうんざり。

123:デフォルトの名無しさん
08/05/25 19:59:11
本質の話をしようぜ!

124:デフォルトの名無しさん
08/05/25 20:07:35
マクロが書けさえすれば、S式は本質的には必要ないです。

125:デフォルトの名無しさん
08/05/25 20:46:08
Far Cry!

126:デフォルトの名無しさん
08/05/25 21:17:13
たしかにマクロアセンブラで書ければ本質的には高級言語はいらないわけだが・・・
そんな生活に戻るのはおらまっぴらだ。

127:デフォルトの名無しさん
08/05/25 21:28:29
まんまんぴらぴらだ

128:デフォルトの名無しさん
08/05/25 22:06:15
>>126
それはまた逆の意味で極端ですね。本質wは両極端の中間に位置していると思います。

129:デフォルトの名無しさん
08/05/25 22:39:31
S式を超える表現を思いついたらすげーな。

130:デフォルトの名無しさん
08/05/26 01:17:55
>>126
今でもマクロアセンブラレベルでしか書けないマシンもあるからあんまりいぢめんな
メモリさえ許せばとりあえずlisp1.0系を導入して、強引に繋いだキーボードでテスト基盤を調査とかすることはよくあると思うんだけどどう?
組み込みよりのちょっと大きめのプロダクト扱う会社だとテストでインタラクティブ環境作れるlispやもちっと小さいインタプリタを自前で持ってるよね?
少なくともおいらのしってる会社で4件はあったよ(うち2件がlispだった)


131:デフォルトの名無しさん
08/05/26 01:38:56
組み込み系はGCの移植・検証がめんどくさいな

132:デフォルトの名無しさん
08/05/26 01:41:26
そゆ用途ならForthじゃね?実績的に。

133:デフォルトの名無しさん
08/05/26 02:24:48
そういえば、BASICとassemblyしか知らなかった俺に、
美しいプログラミングの世界をかいま見せてくれたのがFORTHだった。


134:デフォルトの名無しさん
08/05/26 02:50:29
130です
>>132の言う通り残りの1件はforthでした、しかも、もっとメモリ制約の有った案件が10件他にあってそれは全部forth系です。
ようするに若干メモリに余力無いと採用できないのは本当です



135:デフォルトの名無しさん
08/05/26 02:52:18
補足
全部で1Kワードのメモリしか無いのが残りね。
最初の4件は32Kワードあった


136:デフォルトの名無しさん
08/05/26 04:12:04
>>131
GCを極力使わない方法もある。
運用の仕方でGCレスも可能。
メモリも100KBもあれば余裕で動くんじゃないの。
組み込みつっても最近のは余裕あるでしょ。

137:デフォルトの名無しさん
08/05/26 09:28:07
>>135
それROMは別でしょ?
余裕でLisp動くじゃない。

138:デフォルトの名無しさん
08/05/26 09:29:11
Lispできついのはメモリ空間/ポインタの扱いじゃない?
組み込みだとアドレス空間の割り当てが、案件ごとに違うだろうし。

139:デフォルトの名無しさん
08/05/26 18:03:39
>>138
配列が使える状況であればどうとでもなる。
セグメントの話ならFORTHでも同じ事だし、
頻繁にreadするのでもない限りRAMもそれほど必要ない。
最終的に何かを制御するだけならGCも省ける場合がある。
どういうプロセッサできついのか具体的に
挙げてくれると判りやすいけど。

140:デフォルトの名無しさん
08/05/26 19:36:40
ポインタのサイズが16ビットだったり24ビットだったり


そういえばdoubleは64ビットだから組み込み以外でも問題になるね

141:デフォルトの名無しさん
08/05/26 19:42:39
short型のコンスとlong型のコンスがあったりするの?

142:デフォルトの名無しさん
08/05/26 19:43:07
URLリンク(www.forth.org)

143:デフォルトの名無しさん
08/05/26 20:18:26
>>140
難しく考えすぎじゃないのか?
組み込みでdoubleなんて使うのかね。

144:デフォルトの名無しさん
08/05/26 21:16:53
ニコスクリプトで pure lisp
URLリンク(www.nicovideo.jp)

145:デフォルトの名無しさん
08/05/26 21:41:48
>>139
1KワードしかRAMがなければ、
組み込みシンボルオブジェクトの一部や組み込み関数の定義部は、
ROMに入れたくなるから、
> 配列が使える状況であればどうとでもなる。
は、そんな簡単にポータブルな実装にはならない。

「どうにでもなる」と言えば、どうにでもなるんだが。


146:デフォルトの名無しさん
08/05/26 21:45:09
ROMとRAMで空間が分かれてるタイプのプロセッサはちょっと使いにくいかもだな

147:デフォルトの名無しさん
08/05/26 21:53:50
>>145
お前口ばっかで全く作ったこともないだろ。
1ワードだから何だよ。それが仕事なら作るだろ。
むしろそんな環境でLispに出番があるのか疑問だが。

148:デフォルトの名無しさん
08/05/26 21:54:52
Kが抜けてたw
まあそういう事。

149:デフォルトの名無しさん
08/05/26 22:12:36
横レススマソ。
1984年ごろのパソコンが128kぐらいだったのを考えると
最近の組み込みなんてメモリサイズが大きいという希ガス。
で、1kワードRAMって何に使うの?

150:デフォルトの名無しさん
08/05/26 22:19:18
>>143
組み込み 以外 でも、と言ってる

doubleのようにポインタのサイズより大きいオブジェクトは
間接参照やメモリ割り当てで遅くなるだろ?

151:デフォルトの名無しさん
08/05/26 22:21:35
>>150
普通のLispの処理系一般に当てはまる問題だが、そういう一般的な話がしたいの?

152:デフォルトの名無しさん
08/05/27 00:19:08
ところで、横槍を入れるときはそう言うべきなの?

153:デフォルトの名無しさん
08/05/27 00:33:27
>>150
>>140の「そういえば」はどこに掛かるんだよ。酔っ払いか?
で?間接参照で遅くなるから何すか?


154:デフォルトの名無しさん
08/05/27 05:10:09
>>152
特定の二人だけであまりに必死な会話を展開してるときは
そう言いたくなることもある。たまに。

155:デフォルトの名無しさん
08/05/27 05:14:49
>>147がなんでかみついてるのかいまいち把握できん
元の書き込みも1Kワードのマシンじゃforthだって書いてるじゃん(っていうか他に選択肢あるのか1Kで)


156:デフォルトの名無しさん
08/05/27 07:22:55
だから、それが何なんですかね?forth大好きおじさん。
lispスレに何の御用ですか?

157:デフォルトの名無しさん
08/05/27 07:48:17
自分じゃ頭は良いけど性格が悪いキャラのつもりで
単に頭が悪いキャラなのは勘弁して欲しいなぁ

158:デフォルトの名無しさん
08/05/27 07:51:53
どちらかと言うと、気に入らない書き込みしてるのが1人に見えてしまう法則発動かと。

159:デフォルトの名無しさん
08/05/27 08:30:20
MindStormsで動く湯浅先生のLispってどう?
使った人いる?


160:デフォルトの名無しさん
08/05/27 12:07:40
GaucheでLittle Schemerにのってる以下の関数を実行すると、
メモリ以上に食って終わらなくなるのですが。
(define add1
 (lambda (n)
  (+ n 1)))
(define A
 (lambda (n m)
  (cond
   ((zero? n) (add1 m))
   ((zero? m) (A (sub1 n) 1))
   (else (A (sub1 n)
       (A n (sub1 m)))))))

161:デフォルトの名無しさん
08/05/27 12:11:48
そうでしょうね

162:163
08/05/27 12:16:03
>>161
私、何か間違ってますでしょうか?

163:163
08/05/27 12:34:36
163

164:へだま ◆7JLFh7E/wI
08/05/27 12:34:56
>>162
URLリンク(mathworld.wolfram.com)
このへんの記事が御参考になればよいのですが



165:デフォルトの名無しさん
08/05/27 12:42:26
すまそん、wikipedia.jp見てました。計算量が爆発する関数なんですね。
どうもです。

166:デフォルトの名無しさん
08/05/27 13:48:49
アッカーマン関数なんて懐かしいな

167:デフォルトの名無しさん
08/05/27 16:17:25
タイムボカンシリーズか。懐かしいよな。

168:デフォルトの名無しさん
08/05/27 17:46:00
>>140
Pointer(Address Reg)のサイズが 16bits って 8BitsMPU とかだよね? メモリー空間が64Kの世界かぁ。うむむ。

169:デフォルトの名無しさん
08/05/27 18:35:29
>>168
たまには8086も思い出してください(個人的には嫌いだがw)


170:デフォルトの名無しさん
08/05/27 19:02:48
あの変態的な「セグメントと称する物」は2度と見たくないw

171:デフォルトの名無しさん
08/05/28 07:53:43
Windows環境でGaucheでCGIプログラミングをしようとしているのですが

#!E:/Gauche/bin/gosh.exe
(display "Content-Type: text/plain;\n\nHello, Gauche!\n")

と書くとInternalServerErrorが出ます。
goshのパス自体はこれで正しいのですが、何かやり方を間違っている所があるでしょうか?
初心者質問ですいません。


172:デフォルトの名無しさん
08/05/28 08:05:14
>>171
まずHTTPサーバのログを確認。
つぎにコマンドプロンプトで
C:\foo> E:\Gauche\bin\gosh.exe bar.cgi
とかやってみる。これで動くなら設定が悪い。


173:デフォルトの名無しさん
08/05/28 10:41:42

サーバーのログ見たら
Premature end of script headers: mb.cgi
*** ERROR: cannot find file "./D:/ws/hp/scheme/mb.cgi" to load
との事。
プログラムのあるフォルダで、コマンドプロンプトで動作させたときはきちんと動きますが
gosh "プログラムの絶対パス"
とすると同じエラーが返るのでこれが原因のようです。
もうちょっと頑張らないと…


174:デフォルトの名無しさん
08/05/28 11:04:50
解決いたしました
goshの引数で「-l」付けたら行けました
ご助言ありがとうございます。

#!E:/Gauche/bin/gosh.exe -l
(display "Content-Type: text/plain;\n\nHello, Gauche!\n")

175:デフォルトの名無しさん
08/05/28 21:10:25
TI-Explorerって面白そう。他に情報ないかな?

URLリンク(cadr.g.hatena.ne.jp)

176:デフォルトの名無しさん
08/05/28 21:16:53
こことか
URLリンク(victor.se)

177:デフォルトの名無しさん
08/05/28 21:28:42
URLリンク(www.unlambda.com)

178:デフォルトの名無しさん
08/05/28 21:32:51
マニュアル(PDF)
URLリンク(www.bitsavers.org)

179:デフォルトの名無しさん
08/05/28 21:39:31
メモリ8Mで68020か。ハードはMacintosh II と同等ぐらいだな。時期的にもかぶってる。

180:デフォルトの名無しさん
08/05/29 00:27:16
MacIvoryとかELISとかって、手に入らないのかなぁ。

181:デフォルトの名無しさん
08/05/29 12:32:08
TAO/ELISのソースコードは公開できないのかねえ

ICOTはKL1 UNIX版その他を公開したから、
まだ研究が続いているものもあるのにねえ
URLリンク(www.icot.or.jp)

NTTは今や私企業だから難しいかね

182:デフォルトの名無しさん
08/05/29 18:39:36
ソースクレ厨がうざくて・・
というか、正式に依頼するなり手順踏めば手に入るものだよ。


183:デフォルトの名無しさん
08/05/29 20:46:09
continuationについて教えてください.(下にコードを添付します)
case-Aは常に同じ状態からのcontinuation再開となるのに対し,
case-Bは前回の結果を反映したcontinuation再開となります.
continuationが生成されたときの状態をそのまま保存したものであり
continuationが呼び出されるとその状態が復元されて続きの評価が行われる
という理解からするとcase-Bの結果が理解できません.
前回のcontinuation呼び出しの影響はどこに記録されるのでしょうか.

184:183
08/05/29 20:46:54
;;;case-A
(define continuation #f)

(let loop ((counter 0))
 (write counter)
 (if (< counter 3)
  (begin
   (if (= counter 1)
    (call-with-current-continuation
     (lambda (k) (set! continuation k))))
   (loop (+ counter 1)))    ;;ここが違う
  'finished)) ;==> 0123finished

(continuation #t) ;==> 23finished
(continuation #t) ;==> 23finished
(continuation #t) ;==> 23finished

185:183
08/05/29 20:47:30
;;;case-B
(define continuation #f)

(let loop ((counter 0))
 (write counter)
 (if (< counter 3)
  (begin
   (if (= counter 1)
    (call-with-current-continuation
     (lambda (k) (set! continuation k))))
   (set! counter (+ counter 1)) ;;ここが違う
   (loop counter))        ;;ここが違う
  'finished)) ;==> 0123finished

186:183
08/05/29 20:49:13
[case-Bが途中で切れてしまいました.]
[case-Bの続き]
(continuation #t) ;==> 3finished
(continuation #t) ;==> 4finished
(continuation #t) ;==> 5finished

187:デフォルトの名無しさん
08/05/29 21:18:32
>>183
case-Bの場合で説明すると、continuationはcounterが記録されている位置だけを覚えていて、その値を覚えているわけではない。
なのでset!をすると次回は前回にセットされた値が読み出されるのでそのようになる。
って感じでいいのかな?


188:デフォルトの名無しさん
08/05/29 21:23:58
状態が「復元され」るわけじゃなく、とっておいたそれにスイッチするだけ。
MLをちょろっと勉強して、Schemeの破壊的に変更する変数は
MLではセルになるんだと考えれば理解が早いと思う。

189:デフォルトの名無しさん
08/05/29 21:33:32
MLをちょろっと勉強しにいくのはいいんだけど・・・
ちゃんと帰ってきてくれよな!
ラムダの門が君を待ってるよ~(w

190:デフォルトの名無しさん
08/05/29 21:35:21
これは意見が分かれるところで、
C言語を学んでスタックフレームを理解すれば早いという説もある。

191:デフォルトの名無しさん
08/05/29 21:56:00
継続で保存した状態から再開したければクロージャを使うべきだと思うけど、その例では使ってない。
保存した状態(つまりクロージャ)をスタックしてバックトラックする例を勉強すればどこが違うか理解できるだろう。
非決定性とか論理プログラミングを探して読んでみると良いと思う。

192:183
08/05/29 22:27:39
短時間の間に多くのご指導をいただきありがとうございます.
なるほど.言葉の使いかたが間違っているかもしれませんが,まとめると,
「変数の束縛関係はどこかにあるsymbol-tableに記録されているが,
『continuationは,生成時のsymbol-tableをdeep-copyしたものを保持するわけではなく
単にそのsymbol-tableへの参照を保持するだけである』」
と考えてよろしいでしょうか.
だからcontinuation生成後にそのsymbol-tableに変更が加えられると,
continuation呼び出し時には変更分が反映されている,と.

193:デフォルトの名無しさん
08/05/29 22:31:22
>>192
symbol-tableって言い方は誤解を招くけど、大筋はそんなもんかな

194:デフォルトの名無しさん
08/05/29 22:40:15
文字列ポートってちゃんと閉じたほうがいいの?

195:デフォルトの名無しさん
08/05/29 23:11:27
lispって本当に役に立つんだろうか
明日役に立つのはrubyやpythonだけど
数年後に役に立ってくれるんだろうか

196:デフォルトの名無しさん
08/05/29 23:19:58
;;;case-A
(define continuation #f)

(let loop ((counter 1))
(if (< counter 2)
(begin
(if (= counter 1)
(call-with-current-continuation
(lambda (k) (set! continuation k))))
(write counter) (newline)
(loop (+ counter 1)))    
'finished)) ;==> 1finished

(continuation #t) ;==> 1finished
(continuation #t) ;==> 1finished
(continuation #t) ;==> 1finished

197:デフォルトの名無しさん
08/05/29 23:20:34
;;;case-B
(define continuation #f)

(let loop ((counter 1))
(if (< counter 2)
(begin
(if (= counter 1)
(call-with-current-continuation
(lambda (k) (set! continuation k))))
(write counter) (newline) 
(set! counter (+ counter 1))
(loop counter))
'finished)) ;==> 1finished

(continuation #t) ;==> 2finished
(continuation #t) ;==> 3finished
(continuation #t) ;==> 4finished

198:デフォルトの名無しさん
08/05/29 23:21:15
>>181
面白そうなのにもったいないよね。

199:183
08/05/29 23:22:21
>>187->>191, >>193
厳しいご指摘もないようですので>>192で考えてみます.
どうもありがとうございました.またよろしくお願いします.

200:デフォルトの名無しさん
08/05/29 23:23:34
call/ccに渡された継続って
なぜ末尾コンテクストじゃなくても
末尾呼び出しされるんだろう。
普通の関数と同じ扱いにすれば
参照透明性も損なわれないような気がする。
深く考えてないけど。

201:デフォルトの名無しさん
08/05/30 00:05:48
>>199
symbol-table → binding

202:デフォルトの名無しさん
08/05/30 00:06:59
>>200
帰ってくるのかよ!

203:デフォルトの名無しさん
08/05/30 00:11:35
>>200
帰還方法を(継続として)渡すような双方向継続フレームワークを作るのが良かろう

204:デフォルトの名無しさん
08/05/30 00:20:42
>201
「束縛関係(binding)を記録している所」なら「環境(environment)」なんじゃね?

205:デフォルトの名無しさん
08/05/30 00:26:38
>>204
環境というとフラットな印象だなあ。(グローバルみたいな)
スタック状に積み重なってるイメージは束縛のほうかな。

206:デフォルトの名無しさん
08/05/30 00:32:47
>>204-205
「環境(environment)」=「クロージャ」

207:デフォルトの名無しさん
08/05/30 00:50:22
>>206
おいおい、大事なものが抜けてないか~
それじゃ仕事になんないよ(w

208:デフォルトの名無しさん
08/05/30 06:46:31
>>205
それは「環境」に対して持ってるイメージが狭すぎるよ。
SECDのEはenvironmentのEだぜ。

209:183
08/05/30 10:41:05
昨日から考えていますが,まだ理解が不充分です.お教えください.
語弊があるかもしれませんが,変数の束縛関係が登録されている場所のことを「symbol-table」ということにします.
symbol-table が何枚も重なって,scope 全体の階層構造を表現しているとします.
昨日お教えいただいた「continuation は,自分が生成されたときの symbol-table への『参照』を持っている」という理解だと,
今度は >>196 の挙動が理解できません.
(>>183 の「symbol-tableの『deep-copy』を持っている」という私の最初の理解だと,>>197 の挙動が理解できませんでした.)
ここで生成される continuation が参照しているのは,let がつくる「top-level よりも 1 レベル深い symbol-table」だと思います.
>>196 の場合,末尾再帰の際に (+ counter 1) が評価されて,その結果の 2 が新たな counter の束縛値としてこの symbol-table
に書き込まれ,その後に let の本体が評価されますよね?
そうすると,loop の引数として (+ counter 1) を渡す >>196 も,set! で直接 symbol-table に束縛関係を書き込む >>197 も,
どちらも同じ >>197 のような結果を示すはずだと思うのです.なぜ >>196 が counter の最初の束縛値 1 を覚えているのでしょうか.
>>196>>197 の違いはどこにあるのでしょう?まさにそれがこの 2 つのコードを書いてみた動機だったのですが…
(多分 >>196 の評価過程をどこか間違えて理解しているのだと思います)

210:デフォルトの名無しさん
08/05/30 11:54:43
関数呼び出しは、新しい「symbol-table」を作るだけで、元の symbol-table を書き換えたりしない。
この例だと、 (loop (+ counter 1)) を評価するたびに、 counter の値が違う symbol-table が作られる。
だから、継続に戻ると、元の symbol-table がそのまま残ってる。

211:183
08/05/30 12:18:01
>>210
実はそれも考えましたが,この場合そうあるべきではないと思うのです.
loop を呼び出すたびに新たな symbol-table を作るとなると,末尾再帰呼び出しの回数が
大きくなるにつれて symbol-table の枚数が増え続けることになり,それを表現する stack
がどんどん伸びてしまいませんか?
これは「末尾再帰処理」の「余計なメモリ消費を行わずに繰り返しを表現する」という掟に
反するように思うのですが…
これが末尾再帰でなく通常の関数呼び出しなら >>210 さんのおっしゃる挙動で理解できます.

212:デフォルトの名無しさん
08/05/30 12:33:04
>>211
もしかしたら「末尾呼び出しはジャンプに最適化される」とあちこちに書いてあるから、loopの呼び出しがジャンプになるならcounterが上書きされると思ったのかもしれないけど・・・
schemeレベルからはそう見えることはないです。
ではどうやって末尾再帰呼び出しの保証をしているのかなのですが・・・時間が無いのでだれか書かない?

213:デフォルトの名無しさん
08/05/30 12:59:06
末尾再帰呼び出しだからといって(リソースの食いっぷり以外の)挙動が変わるわけではない。
普通に再帰呼び出ししてると考えたほうが判りやすいのではないかな。

214:デフォルトの名無しさん
08/05/30 13:08:16
末尾コンテキストでの呼び出しは、実際にはスタックフレームに
積まれた引数を移動させるコストが発生する。
コンパイラがフロー解析していたり、単純な呼び出しならば
直接不要になった変数を破壊する書き換えが行われる場合がある。

それと、コンパイルされれば局所変数は相対位置で参照されるので
通常は名前なんかはスタック上に保持していない。
つまりsymbol-tableという言い方はおかしい。

215:デフォルトの名無しさん
08/05/30 15:20:37
スタックという言い方もおかしいかもしれないな。
スタックというと「ひとつしかない」「配列」を思い浮かべるかもしれないが、
概念的にはヒープ上のリストと同じように扱えるものと考えたほうがいい。

216:デフォルトの名無しさん
08/05/30 16:05:16
>>214
>>215
がいいこと言った!
というわけで、誘導しようと思ったらリンクが無かったわ^^;

Three Implementation Models for Scheme
URLリンク(www.cs.indiana.edu)

久しぶりにラムダの門磨いときますね(w

217:デフォルトの名無しさん
08/05/30 21:19:30
識別子が式に束縛される(得る)OcamlやHaskellと違って
Schemeの識別子はC言語などと一緒で
式ではなく記憶領域の場所に束縛される。

末尾再帰の最適化に関しては
スタックフレームの参照で考えると

A→B→C ;;普通の関数呼び出しのスタックフレームの参照連鎖

A→ →C ;;末尾呼び出しの場合はAとCを直接つないじゃえ、どうせCから値を直接返そうがBが値を返そうがプログラマから見れば同じだし
  B

A→C ;;Bはどのスタックフレームからも参照されてないのでGCに回収されました

ってな感じで定数空間で末尾再帰されてると考えてもいいかも。
実際の処理系はもっと効率よくやってるはずだけど。

218:デフォルトの名無しさん
08/05/30 23:15:06
>>211
> それを表現する stack がどんどん伸びてしまいませんか?

末尾再帰の場合はそうせずに済むってことだよ。

219:デフォルトの名無しさん
08/05/30 23:17:44
>>217
良い説明だと思う。
こういう風にきちんと考えないと、継続が絡んだときの挙動を説明できないんじゃないかな。

220:183
08/05/30 23:27:08
みなさまありがとうございます.
末尾再帰呼び出しについて >>217 さんのご説明が私のイメージにいちばん近くわかりやすいです.
この例で,C の呼び出しは実際には A を呼び出しているわけで,>>214 さんのいわれるような
「末尾コンテキストでの呼び出し(C)は、実際には(Cの)スタックフレームに積まれた引数を(Aに)移動させる」
処理が起きるわけですよね.
問題は,この中に continuation が混在していることなのですが,この図に continuation の
スタックフレームへの参照を追加するとどのような図になるのでしょうか.
再帰呼び出しの中で,どのようにすれば continuation が「正しい」scope を持ち続けることが
できるのかということなのですが…

221:デフォルトの名無しさん
08/05/31 00:11:22
λ式中の束縛識別子はそのλ式がapplyされた時に動的に生成されるCで言えばauto変数。
だから再帰などで同じ手続きが呼ばれてもそれぞれの変数の束縛(アドレス)はユニーク。
λ式中の自由識別子はそのλ式がevalされ(て手続きが生成され)た時に可視な束縛(ポインタ)が参照される。
だから再帰などで同じ手続きがよばれても同一の場所(アドレス)を参照する。

call/ccが引数の手続きに渡す継続は
case-Aの場合は(lambda (x) (write counter) (newline) (loop (+ counter 1)))
case-Bの場合は(lambda (x) (write counter) (newline) (set! counter (+ counter 1)) (loop counter))
この中に現れている自由識別子(というか束縛識別子は参照されてないけど)は何度呼ばれても同一の場所を参照する。
case-Bの場合はset!でcounterが束縛されているメモリの値を書き換えてるから
書き換えられた値を参照している。
ここで(loop (+ counter 1))は手続き呼び出しだから(loop 3)等の値に評価されてから手続きに渡されている事に留意。
そして1回目のloopのcounterと2回目のloopのcounterは同一でない場所を参照してる。(スタックフレームの再利用などの最適化されていなければ)

222:デフォルトの名無しさん
08/05/31 00:15:27
継続といっても呼び出され方が特別なだけで(末尾文脈でなくても末尾呼び出しされる)
手続きと実体は一緒だから同じように考えればOK

223:デフォルトの名無しさん
08/05/31 00:16:19
つ metacirclar interpreter

224:204
08/05/31 00:35:20
>183
末尾再帰や継続を勉強する前にせめてschemeの評価モデルの勉強をすべきだと思うんだ
まず「環境フレームモデル」について勉強することをお勧めするよ

225:デフォルトの名無しさん
08/05/31 00:50:58
>>224
そういう意味じゃ>>183にとってGauche本は良書じゃなかろうか?

226:デフォルトの名無しさん
08/05/31 01:37:50
>>183
説明してみます。

C1はcounterが1の束縛、C2はcounterが2の束縛だとすると、
最初にnamed letに入ったときはスタックは

C1

ここでcontinuationをセーブしている。
loopを呼び出すと

C1->C2

の状態になる。
で、ifからfinishで抜けている。スタックは空。

"空"

(continuation #t)を評価すると、スタックは先にセーブした

C1

の状態になって(call/cc ...)の次の式から評価が開始される。

続く

227:デフォルトの名無しさん
08/05/31 01:38:23

そこからloopが再び呼び出されると

C1->C2'

の状態となる。ここで先のC2とC2'になる。
さてC1がどこに記録されているかだけど、これはcontinuationにぶら下がる形でヒープに保管するのが簡単な実装方法。

ところでloopは末尾再帰呼び出しなので、C1->C2やC1->C2'になるところでC1を潰してC2やC2'で上書きしてしまいそうなのだが、
これは実装がC1が破壊できないことを知っているので行われない。
これはC1がヒープに保管されているかどうかで判定するのが簡単な実装方法になる。

(continuation #t)の#tはどこにいくのか?
C1->C2'の途中に#tを持った束縛ができないか心配になるけど、この#tは(call/cc ...)の帰り値となって、スタックから取り去られることになる。

う~ん、どうだろうか?

228:デフォルトの名無しさん
08/05/31 01:42:53
typo御免
「の状態となる。ここで先のC2とC2'になる。」

「の状態となる。ここで先のC2とこのC2'は違う束縛になる。」
のつもり。m(_ _)m


229:183
08/05/31 01:52:17
みなさまありがとうございます.
>>221 さんのご説明が具体的で核心をついた答そのものだと思います.
さらに >>226 - >> 228 さんのご説明は >>217 さんの例に則していて
わかりやすそうです.
少し時間がかかると思いますが処理をなぞって考えさせていただきます.

230:デフォルトの名無しさん
08/05/31 11:55:56
3パターンの継続を誰か説明してあげたら?

(1) upward onlyの継続 (例外はこれで可能)
(2) 一回使ったらおしまいの継続 (コルーチンはこれで可能)
(3) 汎用的な継続

231:デフォルトの名無しさん
08/05/31 11:57:34
URLリンク(practical-scheme.net)

232:デフォルトの名無しさん
08/05/31 12:15:11
>>230
(1) ひとつしかないスタックを破壊的に変更しながら使う
(2) いくつかのスタックを破壊的に変更しながら使う
(3-a) スタックを退避したりリストアしたり
(3-b) immutableパターン

233:183
08/05/31 12:52:01
ご心配いただいて申し訳ありませんので現在の状況を報告いたします.
基本的な規則は
・closure が呼び出されれば(たとえそれが末尾再帰呼び出しであっても),
 新たな束縛環境が作られ,その環境に視点が切り替えられていく.
・continuation には,自分が生成されたときの束縛環境への参照が保持されている.
・通常処理を続けている間は,末尾再帰呼び出しに伴い次々と生成されて
 切り替えられる束縛環境をもとに評価が進められるのだが,
 ひとたび continuation が呼び出されると,その continuation 上に保持されていた
 束縛環境に視点が切り替えられる.
であり,これらに従って評価を繰り返していけば case-A と case-B の挙動の違いを
説明できるように思います.
みなさんのご説明以上の内容ではありませんが,最初のルールを充分にわかっていなかった
(つまり,末尾再帰呼び出しの場合,同じ束縛環境のまま束縛関係を上書きしてしまうと考えていた)
ことが混乱の原因であったように思います.
まだ理解が不充分だと思いますが,少しだけわかりかけてきた気がします.

234:デフォルトの名無しさん
08/05/31 14:41:09
名古屋名物 名古屋コールチン

235:デフォルトの名無しさん
08/05/31 14:51:28
>>234
本気で面白いと思って書き込んだのでないなら少し反省してもらおうか。


236:デフォルトの名無しさん
08/05/31 15:45:47
俺はちょっと笑ったぞ

237:デフォルトの名無しさん
08/05/31 15:49:47
鳥皮はコルーチンたっぷり

238:デフォルトの名無しさん
08/05/31 18:10:23
>>234-237
もうしばらく静かにしておいてやれYO!

239:デフォルトの名無しさん
08/05/31 21:55:26
(define member?
(lambda (a lat)
(cond
((null? lat) #f)
((eq? a (car lat)) #t)
(else (member? a (cdr lat))))))

(member? 'sardines '(Italian sardines spaghetti parsley))

240:デフォルトの名無しさん
08/05/31 21:56:04
(define intersect
(lambda (set1 set2)
(letrec
((I (lambda (set)
(cond
((null? set) '())
((member? (car set) set2)
(cons (car set)
(I (cdr set))))
(else (I (cdr set)))))))
(I set1))))

(intersect '(tomatoes and macaroni) '(macaroni and cheese))

241:デフォルトの名無しさん
08/05/31 21:57:19
; >>230
; (1) upward onlyの継続 (例外はこれで可能)

(define intersectall
(lambda (lset)
(let/cc hop
(letrec
((A (lambda (lset)
(cond
((null? (car lset))
(hop '()))
((null? (cdr lset))
(car lset))
(else
(intersect (car lset)
(A (cdr lset))))))))
(cond
((null? lset) `())
(else (A lset)))))))

(intersectall '((tomatoes and macaroni) (macaroni and cheese) (tomatoes and cheese)))

242:デフォルトの名無しさん
08/05/31 22:52:40
(define rember-upto-last
(lambda (a lat)
(let/cc skip
(letrec
((R (lambda (lat)
(cond
((null? lat) '())
((eq? (car lat) a)
(skip (R (cdr lat))))
(else (cons (car lat) (R (cdr lat))))))))
(R lat)))))

(rember-upto-last
'cookies
'(cookies chocolate mints caramel delight ginger snaps sesserts chocolate mousse
vanilla ice cream German chocolate cake more cookies gingerbreadman chocolate chip brownies))

243:デフォルトの名無しさん
08/06/01 00:18:03
>>196-197で call-with-current-continuation と書いてたのを
>>241-242ではlet/ccと書いてある。(Seasoned Schemerからの例)

244:デフォルトの名無しさん
08/06/01 00:22:49
>>239-242
「う~ん、それならこれで十分なんじゃな~い」ってきっと言われる・・・

(define rember-upto-last
 (lambda (a lat)
  (let loop ((ans lat) (lst lat))
   (cond ((null? lst) ans)
      ((eq? (car lst) a) (loop (cdr lst) (cdr lst)))
      (else (loop ans (cdr lst)))))))

(define intersectall
 (lambda (lset)
  (fold intersect (car lset) (cdr lset))))

なんか簡潔で説得力のある一級継続の使用例は無いものだろうか・・・

245:デフォルトの名無しさん
08/06/01 00:55:50
継続無しでいくことが主目的ならそれでいいんジャマイカ?>>244
継続の動作の仕組みを調べる材料に使うなら>>239-242は十分な例だと思う。
継続を理解することよりも何かに例えることに力点があるうちは理解できないだろう。

246:デフォルトの名無しさん
08/06/01 01:28:21
((call/cc
 (lambda (goto)
  (letrec ((start
        (lambda ()
         (print "start")
         (goto next)))
       (froz
        (lambda ()
         (print "froz")
         (goto last)))
       (next
        (lambda ()
         (print "next")
         (goto froz)))
       (last
        (lambda ()
         (print "last")
         (+ 3 4))))
   start))))

247:デフォルトの名無しさん
08/06/01 01:29:02
動作を理解しても「こんなのいらね」で終わることもあるからな。良い例が欲しいな。

248:デフォルトの名無しさん
08/06/01 01:29:09
(let* ((yin ((lambda (foo) (newline) foo)
       (call/cc (lambda (bar) bar))))
    (yang ((lambda (foo) (write-char #\*) foo)
       (call/cc (lambda (bar) bar)))))
 (yin yang))

249:デフォルトの名無しさん
08/06/01 01:29:33
((call/cc call/cc) (call/cc call/cc))

250:デフォルトの名無しさん
08/06/01 01:30:21
>>247
そのレベルでやってるやつには不要。


251:デフォルトの名無しさん
08/06/01 01:33:52
>>247
クレクレうるせーんだよ。氏ね。

252:デフォルトの名無しさん
08/06/01 01:50:09
乞食が自分で書けば良いんジャマイカ?

253:デフォルトの名無しさん
08/06/01 01:51:23
>>250
「そのレベル」でいいんジャマイカ、と

254:デフォルトの名無しさん
08/06/01 01:54:47
荒れてきたねw
foldで書き直せますって言う暇があったら好例を出すべきだったと思うね。

255:デフォルトの名無しさん
08/06/01 01:57:29
>>253
おまえも馬鹿らしいなw

256:デフォルトの名無しさん
08/06/01 02:04:31
もですね、わかります

257:デフォルトの名無しさん
08/06/01 02:11:52
       ,;r''"~ ̄^'ヽ,
      ./       ;ヽ  新憲法で表現の自由規制、裁判官の国民審査権破棄
      l  _,,,,,,,,_,;;;;i  
      l l''|~___;;、_y__ lミ;l      ネット規制法で検閲、人権擁護法案で報道規制、
      ゙l;| | `'",;_,i`'"|;i |    
     ,r''i ヽ, '~rーj`c=/        ダウンロード違法、単純所持禁止、..etcetc
   ,/  ヽ  ヽ`ー"/:: `ヽ      
  /     ゙ヽ   ̄、:::::  ゙l, 情報源を潰して日本を中国化だ!フゥハハハーハァー
 |;/"⌒ヽ,  \  ヽ:   _l_        ri                   ri
 l l    ヽr‐─ヽ_|_⊂////;`ゞ--―─-r| |                   / |
 ゙l゙l,     l,|`゙゙゙''―ll___l,,l,|,iノ二二二二│`""""""""""""|二;;二二;;二二二i≡二三三l
 | ヽ     ヽ   _|_  _       "l ̄ ̄ ̄ ̄ ̄ ̄ |二;;二二;;二=''''''''''' ̄ノ
 /"ヽ     'j_/ヽヽ, ̄ ,,,/"''''''''''''⊃r‐l'二二二T ̄ ̄ ̄  [i゙''''''''''''''''"゙゙゙ ̄`"
/  ヽ    ー─''''''""(;;)   `゙,j"  |  | |
  _,,,,,,,,,ヽ、        ,,,,,r-'''''ーー'''|   |  | |
''"    ヽ,,___,,,r‐''''''二__    |__|  | |
          \'''"   /     ノ    | |


258:デフォルトの名無しさん
08/06/01 02:13:43
>>256
ああいえばこういう。まじ視ね。

259:デフォルトの名無しさん
08/06/01 02:14:33
なんか蛆虫がいっぱいw

260:デフォルトの名無しさん
08/06/01 02:41:53
>>247良い例マダァ?

261:デフォルトの名無しさん
08/06/01 02:47:45
荒れる方向へ誘導するなよ

262:デフォルトの名無しさん
08/06/01 02:51:16
もうおまいら全部まとめて >>7 独習 Scheme 三週間 (Schemeの教科書 ) でも読んで寝ろよ。
定番のコルーチンとバックトラックがちゃんとのってるぞ。

263:デフォルトの名無しさん
08/06/01 03:53:30
>>262
動作を理解しても「こんなのいらね」で終わることもあるからな。良い例が欲しいな。

264:デフォルトの名無しさん
08/06/01 04:16:01
グダグダうるせーんだよ。乞食は氏ね。

265:デフォルトの名無しさん
08/06/01 07:28:43
ambは再帰で書くと分かりにくいが、これならどうだ

(define-syntax amb
 (syntax-rules ()
  ((_ x ...)
   (let/cc yield
    (let/cc fallthrough
     (push! stack fallthrough)
     (yield x))
    ...
    ((pop! stack))))))

266:デフォルトの名無しさん
08/06/01 09:39:35
>>265
そんな動きもしない中途半端な例より過去スレ嫁。
不思議の国のアリスをやってた連中がambを使ってたハズ。

267:デフォルトの名無しさん
08/06/01 10:51:03
Gauche使ってる奴は独自機能を使って煙に巻きたがるんだよなw
push!とpop!の説明しないのかよ?

268:デフォルトの名無しさん
08/06/01 10:53:39
(define-syntax amb
(syntax-rules ()
((_) (fail))
((_ a) a)
((_ a b ...)
(let ((fail0 fail))
(call/cc
(lambda (cc)
(set! fail
(lambda ()
(set! fail fail0)
(cc (amb b ...))))
(cc a)))))))

(define call/cc call-with-current-continuation)

(define fail #f)

(define (require pred)
(or pred (amb)))

(call/cc
(lambda (cc)
(set! fail
(lambda ()
(cc 'no-choise)))))

269:デフォルトの名無しさん
08/06/01 11:22:04
このスレも人増えてなにより

270:デフォルトの名無しさん
08/06/01 11:49:40
(define call/cc call-with-current-continuation)

(define fail #f)

(call/cc
(lambda (cc)
(set! fail
(lambda ()
(cc 'no-choise)))))

(fail) ; => no-choise

271:デフォルトの名無しさん
08/06/01 12:02:19
>>196-197と比較するとambがやってることがわかると思う。

(amb 1 2 3 4 5) ; => 1
(fail) ; => 2
(fail) ; => 3
(fail) ; => 4
(fail) ; => 5
(fail) ; => no-choise

272:デフォルトの名無しさん
08/06/01 12:07:54
>>246
うほっ、これいいね!
出典があるなら教えて~

273:デフォルトの名無しさん
08/06/01 12:17:57
>>272
それ前スレにも出てた。有名なのかも。

274:デフォルトの名無しさん
08/06/01 12:41:12
>>272
おそらく出典はGuy Steele御大です。
URLリンク(lib.store.yahoo.net)


275:272
08/06/01 12:41:45
ありがと^^

276:デフォルトの名無しさん
08/06/01 12:54:41
#define d define
#d a include
#a <stdio.h>
#a <string.h>
#a <ctype.h>
#d p char*
#d P ,(p)
#d T(E) !strcmp(E,"()")
#d U return
#d W while
#d X sbrk(199)
#d z atof
#d e isspace
#d D A(_)
#d E S(C(_))
#d B(y) p y(_)p _;{
#d G(y,V) B(y)p i;U sprintf(i=X,"%lf",z(E)V z(S(C(D)))),i;}p sbrk(),*S(),*j(),*O,*H;K,Y,M=14;double z();Q(_)p _;{int V=0;W(e(*_))_++;H=_;W(V|!(e
(*H)|*H==')'||(*H=='('&&H-_)))V+=(*H=='(')-(*H== ')'),H++;U H-_;}B(C)U _++,Y=Q(_),_=strncpy(X,_,Y),_[Y]=0,_;}B(A)_++,_+=Q(_);W(e(*_))_++;U O=X,*O='(',strcpy(
O+1,_),O;}B(Z)U _;}B(c)U C(E);}B(q)U A(E);}B(t)p i=E;U H=S(C (D)),sprintf(O=X,T(H)?"(%s)":"(%s %s",i,H+1),O;}B(F)U S(C(A(T(E)?D:_)));}L(i,s)p
i,*s;{U isdigit(*i)?z(i)!=z(s):strcmp(i,s);}B(b)U L(E,S(C(D)))?"()":"t";}B(R)U E;}B(o)U z(E)<z(S(C(D)))?"t":"()";}G(f,+)G(g,-)G(h,*)p r[4][2]={"function" P R,
"quote"P C,"lambda"P Z,"defun"P j};B(j)U r[M][1]=D,*r[M++]=C(_);}p not[99][2]={"if"P F,"equal"P b,"<"P o,"+"P f,"-"P g,"*"P h,"car"P c,"cdr"P q,
"cons"P t,"t","t"};B(S)int Li,s;p u;if(isdigit(*_)|T(_))U _;for(Y=M;Y--;)if(!strcmp(_,*r[Y]))U r[Y][1];u=E,_=D;if(*u-'(')U(*((p(*)())u))(_);s=Li=M;W(!T(_))r[M][1]=E,*r[M++]
="",_=D;O=C(u);W(!T(O))*r[Li++]=C(O),O=A(O);U O=S(C(A(u))),M=s,O;}main(){H=O=X,Y=0;W(Y|!e(K=getchar()))K==EOF?exit(0):0,Y+=(K=='(')-(K==')'),*H++=K;*H=0,puts(S(O))
,main();{printf("XLISP 4.0\n");}}

277:デフォルトの名無しさん
08/06/01 13:04:34
call/ccが名前つきブロックにもなるletrecを内側に持つとgotoできるのか。
letrecをループに使うのは良くみかけるけどね。
(define (count-chars)
(letrec ((loop (lambda (ch count)
(if (eof-object? ch)
count
(loop (read-char) (+ count 1))))))
(loop (read-char) 0)))

278:デフォルトの名無しさん
08/06/02 20:30:36
好みの問題ですけど
相互再帰じゃない場合はnamed letの方が見やすいですね。

279:デフォルトの名無しさん
08/06/02 21:02:33
>>278
こんなとこで言ってないで国際会議の場でGuy Steeleに意見しろよ。

280:デフォルトの名無しさん
08/06/02 22:18:39
先月caltechのカンファで直接言ったんだけど、Fortressの後始末でそれどころじゃないみたい。

281:デフォルトの名無しさん
08/06/02 22:29:13
この間スペックが出たばかりなのに後始末って何するの?

282:デフォルトの名無しさん
08/06/02 23:06:44
スペックが出ちゃえばあとは後始末だけだな

283:デフォルトの名無しさん
08/06/02 23:22:31
Fortressの教科書書いてくれないのかな。

284:デフォルトの名無しさん
08/06/03 00:23:36
>>280はオトコだが、>>279は根性無しの引きもりと言うことですね。


285:デフォルトの名無しさん
08/06/03 00:57:55
>>284
顔真っ赤にして見苦しいよw

286:デフォルトの名無しさん
08/06/03 01:03:13
>>283
Steele って教科書書いた事あるの?

287:デフォルトの名無しさん
08/06/03 01:19:35
>>286
Cの本、Common Lispの本は?Javaのもあるし、もう1冊The High Performance Fortran Handbookもあるけど。
あと、本じゃないけどジャーゴンファイル。
PDFで結構いろいろなマニュアルも見つかる。
このスレでは "The History of Scheme" が有名かな。

絶対に外せないのがコレかな
URLリンク(dspace.mit.edu)

288:デフォルトの名無しさん
08/06/03 01:35:16
サンクス。もっと入門的な書き物の事だと思ってた。
理論的なペーパーならここにあるのじゃダメかな。

URLリンク(research.sun.com)

289:デフォルトの名無しさん
08/06/03 01:50:15
>>288
㌧。だめってことはないよ。こちらの勝手な希望なのでw
URLリンク(research.sun.com)
こんな感じで200~400ページぐらいの分量があると全貌が見えるからいいかなと。
Guy Steeleはマニュアル書くと面白い例を出してくれるから期待したいな。
Cの本なんてすごく良かったのに和訳が絶版になって残念だなぁと思う。

290:デフォルトの名無しさん
08/06/03 02:55:58
>>285が痛すぎる件について。

まぁ不問にしてやろうw


291:デフォルトの名無しさん
08/06/03 05:11:11
くだらないやりとり引っ張る奴が一番見苦しい

292:デフォルトの名無しさん
08/06/03 09:08:32
本当に「この話題を引っ張って欲しくない」人は、見苦しいとか煽って余計終わりにくくしたりしません。

ま、勢いで書き残しちゃった自分の痛いレスに触れて欲しくない>>285が、正論のフリして終結を促したものの、
自意識が邪魔してつい余計な「反撃」をしちゃって、終わらせることにも第三者のフリにも失敗、というとこでしょうかw

293:デフォルトの名無しさん
08/06/03 10:23:26
>>286
ない。

294:デフォルトの名無しさん
08/06/03 10:24:15
AI MEMO は Lambda the Ultimate シリーズもだな

295:デフォルトの名無しさん
08/06/03 18:30:30
URLリンク(library.readscheme.org)

296:デフォルトの名無しさん
08/06/03 20:31:19
parser generator を探してみた。さすがは実験言語。ぞろぞろ出てきますw

URLリンク(www.iro.umontreal.ca)
URLリンク(www.informatik.uni-freiburg.de)
URLリンク(www.cs.cmu.edu)

297:デフォルトの名無しさん
08/06/03 20:35:32
>>292
おまえ等クダスレ逝って喧嘩しろ。邪魔。

298:デフォルトの名無しさん
08/06/03 20:40:48
>>296こんなのあるYO!
URLリンク(www.cs.indiana.edu)

299:デフォルトの名無しさん
08/06/03 20:50:11
>>296
エッセンスが好き。

300:デフォルトの名無しさん
08/06/03 21:03:09
遺伝的プログラミング
URLリンク(codepad.org)

301:デフォルトの名無しさん
08/06/03 21:07:21
essenceってLL(1)のSLLGENと比べて敷居が高そうw
そんなこと無さ気に書いてあるけどさw

302:デフォルトの名無しさん
08/06/03 21:09:05
>>298
激しく㌧。凄いね。

303:デフォルトの名無しさん
08/06/03 21:41:37
>>301
使うの簡単だよ。
開発は大変だったろうけど。
汎用のパーザの部分計算でパーザを生成するから。

304:デフォルトの名無しさん
08/06/03 21:41:58
>>300
なんじゃそりゃ!
(define (equ x) (* 2 (^ x 4)))
という式の微分を求めてるらしいけど。普通の記号処理と違うのに
(* 8 (^ x 3))
と同じ式がちゃんと求まってるw

305:デフォルトの名無しさん
08/06/03 22:14:37
>>300,>>304
URLリンク(www.genetic-programming.org)

306:デフォルトの名無しさん
08/06/03 22:17:13
遺伝的プログラミングで最適化したコードを吐くパーザとかw

307:デフォルトの名無しさん
08/06/03 22:32:33
essenceはScheme48用のpggというProgram Generator Generatorを使うのね。
作られたessenceはProgram Generatorなんだから、できたスキームはプログラムなわけ。
でもスキーム用のpggというProgram Generator Generatorを使うと・・・

308:デフォルトの名無しさん
08/06/03 22:55:01
>>297
本当にそう思ってる人は、
(ごく一部の、目的の為に衝動を抑えるという人類なら大抵できることができないクズを除いて)
そういう喧嘩腰の追っ払い方を試みません。バレバレですw

309:デフォルトの名無しさん
08/06/03 22:56:11
>>307
その再帰の不動点プログラムはいったいなんなんだ。

310:デフォルトの名無しさん
08/06/03 23:05:10
遺伝的プログラミングで関数が収束しているのは一様収束?

311:デフォルトの名無しさん
08/06/03 23:10:05
>>309
Schemeなんじゃないかな。

312:デフォルトの名無しさん
08/06/03 23:26:01
初めてYコンビネータとかambとかGPを見たとき魔法を使ってるみたいだって思った。

313:デフォルトの名無しさん
08/06/04 00:08:36
>>308
本当にそう思っている人も居るからそろそろ察してね。

314:デフォルトの名無しさん
08/06/04 17:58:16
>>309
不動点として処理系を求めることなんてできるのかな?

>>310
世代を増やしてやれば一様収束に近いかな?
世代数より、使える要素の数に対する候補数や木構造の複雑さの許容範囲の方が
解に対して大きく影響を与えるようだよ。
その辺のパラメータを上手に与えないとGPが正しい解を返してくれない。
理論的なことはよくわからないんだけど。

315:デフォルトの名無しさん
08/06/04 20:28:22
>>312
GPは未だに魔法みたいに見える
Yコンビネータとambは解説読むと目から鱗だった(ガッテンボタンいっぱい押す感じ)



316:デフォルトの名無しさん
08/06/04 20:56:57

∩ヘ~

317:デフォルトの名無しさん
08/06/04 21:07:13
best score of generationが0.001以下なら安心できる解が得られてるというのを目安に使ってる。
理屈抜きにw

318:デフォルトの名無しさん
08/06/04 21:32:08
URLリンク(codepad.org)
この例だと3番目で0.001以下なので正しいと考える。
伊庭研HPにもそう書いてあるw

319:デフォルトの名無しさん
08/06/04 21:42:20
試しにcos x の微分を解かせてみた。一発回答だった。スゲーw
URLリンク(codepad.org)

320:デフォルトの名無しさん
08/06/05 02:17:01
GPってなんすか?

321:320
08/06/05 02:18:48
>>319を見て解決しました
> ; Genetic Programming with Scheme

322:デフォルトの名無しさん
08/06/05 08:19:19
>>314
表示的意味論では、表示関数は不動点。

323:デフォルトの名無しさん
08/06/05 09:58:56
GP=Graham,Paul

324:デフォルトの名無しさん
08/06/05 15:47:07
Little Schemerって何が言いたいのかよくわからないところが多々あるのですが、
ものまね鳥やSICPやいろいろ読んだらありがたみがわかるようになるの?

325:デフォルトの名無しさん
08/06/05 16:51:54
hogehoge schemerシリーズを買おうと思ったら
近くの本屋だとsicpとsimply schemeしか置いてねぇ・・・

326:デフォルトの名無しさん
08/06/05 16:54:50
>>325
それだけ置いてありゃ立派なもんだよ

327:デフォルトの名無しさん
08/06/05 18:06:39
>>325
都会はええのう。うちの近所じゃエクセル本しかないw

328:デフォルトの名無しさん
08/06/05 18:23:27
>>324
シリーズ3冊読んで初めて意味がわかる。
微積とかの数学を知らない人向けのSICPだったのかと。
だから数学が得意な大学生は最初からSICPでいいと思う。
CSを専攻しようか迷ってるならシリーズ3冊を読んだ後ものまね鳥を読んでみると自分の適性が判断できるよ。

ありがたみっていう意味をどう使ってるかによるけど、CSとはどういうものかを知るという意味ではいい本。
何が言いたいのかわかるというのは、CSとはどんなことがらに興味の対象をもっている分野かを理解すること。
それがわからなくてもプログラムは作れる。
けど、バグが入りこまないような理論的裏づけとか、論理プログラミングが欲しいときがそのうちクルと思う。
そのときが来る前の先行投資と思えば安いもんだと思うよ。
悩んで考える時間は若いときにしか持ち得ないからガンガレ。


329:デフォルトの名無しさん
08/06/05 20:12:01
javascriptしかいじったことのないゆとりがSICP読んでるんですけど、
schemeは無名関数内で再帰呼び出しって出来ないんですか?

lambdaの中でそのlambdaを呼び出すみたいな。

javascriptだと
(function(x){return (x)?x+arguments.callee(x-1):0; })(10);
とかやって使うやつなんですけど…

高階演算のとこで使いたいんですが、調べてもうまく見つからなかったです。



330:デフォルトの名無しさん
08/06/05 20:22:55
>>329

(((lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))))
(lambda (func-arg)
(lambda (n)
(if (zero? n)
1
(* n (func-arg (- n 1)))))))
5)

Yコンビネータの雛形が内蔵されている階乗関数になってます。

331:デフォルトの名無しさん
08/06/05 20:23:00
↑みたいなFAQネタ誰かまとめろ

332:デフォルトの名無しさん
08/06/05 20:29:38
(((lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))))
(lambda (func-arg)
(lambda (l)
(if (null? l)
'no-list
(if (null? (cdr l))
(car l)
(max (car l) (func-arg (cdr l))))))))
'(4 5 6 3 4 8 6 2))

333:329
08/06/05 20:29:43
>>330
どうも、ありがとうございます。
なにやら複雑ですね。

>>331
既出でしたか。失礼しましたー


334:デフォルトの名無しさん
08/06/05 20:34:32
(define Y
(lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg)))))))

335:デフォルトの名無しさん
08/06/05 20:35:29
>>330はこう書いてもよい。

(define F*
(lambda (func-arg)
(lambda (n)
(if (zero? n)
1
(* n (func-arg (- n 1)))))))

((Y F*) 5)

336:デフォルトの名無しさん
08/06/05 20:36:15
>>332はこう書いてもよい。

(define M*
(lambda (func-arg)
(lambda (l)
(if (null? l)
'no-list
(if (null? (cdr l))
(car l)
(max (car l) (func-arg (cdr l))))))))

((Y M*) '(4 5 6 3 4 8 6 2))

337:329
08/06/05 20:42:03
>>332
>>334
>>335
>>336

皆さんありがとうございます。なんかすみません。
どれも微妙に難しいコードですが、がんばって理解します。



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch