□その他その3□
初心者が集うIRC(布教してくれる先生も大募集です)
irc.scenecritique.com
port 6667
チャンネル #Lisp_Scheme
Scheme のテストコード書いたり、簡単な実行したりコードさらしたりするにはここへカモン。
ttp://codepad.org/ コードを書いて実行した時のURLを記録しておけば、
実行結果も一緒にさらす事が出来て幸せです。
※ Common Lisp、Scheme及びS式を使用するLisp族全般のスレです ※
>>1 λ....... あ、、これはラムダなんだからね!乙じゃないんだからぁ!
つ「不思議の国のアリス」【論理パズル】
女王様のジャムが盗まれました.犯行は単独犯によるものだとい
うことがわかっていて,容疑者は三月ウサギと頭のいかれた帽子屋とヤマネです.それぞれを取
り調べたところつぎのような証言をしました.
三月ウサギ 「私は絶対にジャムなど盗んでいません.」
帽子屋 「私たち3人のうち1人がジャムを盗みました.でもそれは私ではありません」
ヤマネ 「ウサギと帽子屋のどちらか一方だけが本当のことを言っています」
さらに調べたところ,三月ウサギとヤマネの少なくとも一方は嘘だということがわかりました.
ジャムを盗んだのは誰でしょうか?
オレオレ
>>19 三月ウサギ or 帽子屋 or ヤマネ ?
自分のことって意外と判らんもんなんですわ
>>18 ジャムを盗んだのは誰でしょうか?と質問してる人
三月ウサギw
発情してるからかw
>自分のことって意外と判らんもんなんですわ
ヤマネが嘘→兎が真且つ帽子が真 もしくは 兎が嘘且つ帽子が嘘
前者ならヤマネが犯人、後者は矛盾
ヤマネが真→兎が嘘且つ帽子が真
兎が犯人
じゃない?
>>27 それだけだと条件が足りず、答えが2通りでてしまう。
scheme のコードを elisp として使えるライブラリってもうありますか?
18の条件だと犯人が一人に絞り込めないんじゃないですか?
このスレでquiz出したい奴はS式で書けよ。
(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)
truthが定義されていないからなんとも。
;さらに調べたところ,三月ウサギとヤマネの少なくとも一方は嘘だということがわかりました.
;⇒(xor (@) (B))⇒(xor (@) (xor (@) (A)))
ここ違いませんか?
まあ答えが間違ってるんだからどこかが違うんだろう
>>37 ばーか。答は合ってるんだよ。ちっとはググレ。解き方が変なんだ。
40 :
デフォルトの名無しさん:2008/05/23(金) 20:17:44
>>38 (xor (@) (B))だと(少なくとも一方が嘘)ではなく(どちらか一方が嘘)になる
論理プログラミングってのは意外と答がちゃんと出ないモンなんだね。
ということにしたいのですね
>>41 (not (and (@) (B)))ではだめ。それだと両方とも嘘だということになって意味が違ってしまう。
(or (not (@)) (not (B))) ってことじゃね?
「さらに調べたところ,三月ウサギとヤマネの少なくとも一方は嘘だということがわかりました.」
なら三月ウサギとヤマネの両方が嘘でも真では?
あちこち見た結果、
>>23が正解らしい。でもなぜ?
少なくとも一方は○○ と どちらか一方は○○
は違いますよね?
>>41や
>>48はrequireが2つなのに、
>>23には3つあるんだよな。
文章からココを読み取れるかどうかが論理プログラミングの難しいところか。
答えに合わせてプログラミングしてるように見えるのは気のせいですか?
>>54 それは違う。
論理的帰結としてrequireになることがわかった枝をこのschemeの論理プログラムでは自動的に修正できない。
そこで、プログラマーが自分でその枝をrequireにしてやらなければならない。
半自動定理証明を調べてみろ。
2人組がいる。少なくとも1人は男だ。
(男 . 男) -> #t
(男 . 女) -> #t
(女 . 男) -> #t
(女 . 女) -> #f
2人組がいる。どちらか1人は男だ。
(男 . 男) -> #f
(男 . 女) -> #t
(女 . 男) -> #t
(女 . 女) -> #f
>>53 志村〜、ド・モルガン
>>55 あ、そっか。対話型でやってる部分はそういう項を書き換えてるということだね。
つまり
>>23は書き換え操作が入ってるから枝が増えてるということか。
なぜこんなにヤマネは信用されてるんでしょう?
そもそも
(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) '無罪)))))
の不備は不問?
ヒント:手で計算した人は皆同じ答えを出しています。
同じじゃない。
>>59の1つ目のrequireは@とBが両方とも嘘の場合を含んでるけど、
>>23のは含んでない。
でも、
>>23も正解に到達するのは2つ目のrequireを追加することが両方とも嘘の場合を却下したからだ。
だから
>>59の両方とも嘘の場合もキャンセルされて、
>>23と
>>59は同じ結果になる。
ということは
>>23はrequireを追加しただけじゃなく(not(and@ A))も書き換えてることになる。
ウサギ「俺じゃない」
帽子屋「俺じゃない」
ヤマネ「ウサギか帽子屋のどちらかだ」
ヤマネの主張をrequireしたら必然的にウサギが犯人になる
なぜヤマネの主張をrequireする?
>>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
(require (xor (xor
(eq? 帽子屋 '有罪) (eq? ヤマネ '有罪))
(xor (eq? 三月ウサギ '有罪) (eq? ヤマネ '有罪))))
があるってことはヤマネは常に正しい事を言ってるんですね。
ヤマネの弁護士の方ですか?
もしも帽子屋がうそをついたならウサギもヤマネも無罪。⇒ウサギが無罪なら、ウサギは本当のことを言った。⇒ヤマネも本当のことを言った。
しかし、ウサギとヤマネが少なくとも一方は嘘だということに矛盾する。
したがって、帽子屋は本当のことをいった。ここまではわかった。
>>66のように三人とも自分が犯人ではないと主張しているだけで
犯人であることと嘘を言っていることは同値ということになります
で、ウサギとヤマネの少なくとも一方が嘘ですが、これ以上絞り込めません
他のサイト見たら
>ヤマネ 「ウサギと帽子屋のどちらか一方だけが本当のことを言っています」
ヤマネ 「ウサギと帽子屋の少なくとも一方は本当のことを言っています」
になってた。つまり、帽子屋が本当のことをいった時点でヤマネは本当のことを言ったことになる。
つまり
>>18の問題文は間違ってる。その結果、2通りの答が出ることになったと思う。
たぶん、
>>23は他のサイトでも見てるんだろう。
>>70の主張が正しいと思う。
(display-line (amb))じゃなくて
(let loop () (and (amb) (loop)))とかにしたほうがいいですね
つ「不思議の国のアリス」【論理パズル】
女王様のジャムが盗まれました.犯行は単独犯によるものだとい
うことがわかっていて,容疑者は三月ウサギと頭のいかれた帽子屋とヤマネです.それぞれを取
り調べたところつぎのような証言をしました.
三月ウサギ 「私は絶対にジャムなど盗んでいません.」
帽子屋 「私たち3人のうち1人がジャムを盗みました.でもそれは私ではありません」
ヤマネ 「ウサギと帽子屋の少なくとも一方は本当のことを言っています」 ←修正!
さらに調べたところ,三月ウサギとヤマネの少なくとも一方は嘘だということがわかりました.
ジャムを盗んだのは誰でしょうか?
ttp://codepad.org/ffEosmDe
>>71,
>>73 てことは、ヤマネが正しいことを言った。⇒三月ウサギとヤマネの少なくとも一方は嘘だ。⇒「私は絶対にジャムなど盗んでいません.」 が嘘。
つまりウサギが有罪。
で、最終的にどんなプログラムになるの?
発言だけじゃなくて「ルール」も厳密じゃないといけないんだよな
「ウサギとヤマネの少なくとも一人は嘘をついていることが確定している」
でいいのか?
「ウサギとヤマネの言ったことは真実であるとは限らない」
ではなく?
うろ覚えではなく完全コピペの問題文でないと駄目だな
この手のは時々勝手な条件をつける人がいたり
省略や改変で余分な条件がついたりしてよく破綻する
つまり叙述トリックですね。わかります。
うざいんで、他でやってもらえますか
うざいだけなら君が我慢しよう
有名な問題をそのまま出すと、解く側もぐぐってコピペして提出するだけだからなあ
宿題にしても仕事にしても、そんなに甘くはないだろう
改変したせいで解が複数になったり不定になったりするんじゃ出題者の底が知れるがね
ジャンガジャンガジャンガジャンガ
ジャンガジャンガジャンガジャンガー
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 犯行は単独犯によるものだということがわかっていて,
容疑者は三月ウサギと頭のいかれた帽子屋とヤマネです.
スマリヤン本持っている人、原著・翻訳本では正確な問いはどんなですか?
>>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?
んでもって解答
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が正しいかな
>>89 お前wwなんでもかんでもxorしやがって
notを使うのが怖いからヤマネが正しいことを前提にしてるのか?
(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)))
OSの操作もぜ〜んぶScheme、S式で処理してしまうなんてことできないですか?
(dir 'c) なんてやると
(fileA fileB fileC ...)
みたいに返ってくるような。
S式で全部閉じた世界ってのを空想してます。
>>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]]].
>>96 symbolicsの中古探してみるとか?
>>97 findallはProlog標準関数ですか?
働きがよくわかりません。
>>98 >こんなの?
そうそう、そういうの。そういうのをWindowsで欲しい、作りたい。
>>99 >symbolicsの中古探してみるとか?
マジに中古あったらい欲しいっす。プレミアついてるんだろうか。
性能は今のパソコンより遥かに劣るんだし、安く手に入らんかな〜。
connection machine がうちの研究所にあったらしいんだけど
捨てちゃったらしんだよね。俺が来るだいぶ前に。
捨てたってそれどういうことよ。
ありえないよ。
捨てるんだったら俺にくれ。
第五世代の ψマシン、中古で放出しないかね。
たしかに電気代は心配だなぁ。
>>106 ブレーカ 1 個つけりゃ 200V なんてすぐとれるだろ?
それとも 3相 200V が必要なのか?
>>107 途中のいろんなところに負荷が掛かるから自宅以外の工事も必要だろ常考。
>>101 d。わかりました。
solve(It)という制約条件を満たすItをバックトラック(?)して見つけて、それをAllにbag-ofする関数ですね。
(amb)と(require)と(bag-of)ってのは便利なんだね。