That's close on two points!
First, I have handed in this report below, in time!
because this midnight is deadline.
Second, Tomorrow, I will participate in the party held by WRESS, where there will be gathered 300 people who can speak English for discussing! I heard team tables were already dicided, and the table I'm in gatherd good English speakers. How fun it seems! I will make full use of it!
----------
1. 問題設定
2. 考え方
3. 作成したプログラム
4. 実行結果
5. 考察
6. 感想
1. 問題設定
三つの自然数の足し算の全ての場合を列挙する。
2. 考え方
配布資料で示されている関数addは、第3引数が既に分かっているとき、バックトラックによって様々な解を捜し求めてくれる。しかしながら、第3引数が未知のときは、関数add内の再帰ループの結果が真となり、第1引数と第3引数のインクリメントが永遠と行われてしまう。
このような関数addの性質を踏まえつつ、関数addを用いて3項の加算演算を行う関数add3を使う。その後、関数add3を用いて三つの自然数の足し算の全ての場合を列挙する関数enum3を作成する。
このとき、関数addと同様の理由で、全ての変数を未知の状態で関数add3を呼び出してしまうと、再帰関数addでtrueの永久ループにはまってしまい、バックトラックが発生しなくなる。よって、常にバックトラックを発生させるため、まずは3項加算式の解である第4引数の値を決定させる。その後、関数add3を呼び出すことでバックトラックが起こり、三つの自然数の足し算の全ての場合を列挙する関数enum3が完成する。
3. 作成したプログラム
/* X + Y = Z */
add(0, Y, Y).
add(s(X), Y, s(Z)) :- add(X, Y, Z).
/* A + B + C = D */
add3(0, 0, Z, Z).
add3(0, s(X), Y, s(Z)):-
add3(0, X, Y, Z).
add3(s(A), B, C, s(D)):-
add3(A, B, C, D).
/* 3項加算演算で起こりうる全ての場合を列挙する */
enum3(A,B,C,D) :-
add(D,0,D), % 先にDの値を評価行う。
add3(A,B,C,D). % その後、AとBとCの評価を行う。
4. 実行結果
?- enum3(A,B,C,D).
A = 0,
B = 0,
C = 0,
D = 0 ;
A = 0,
B = 0,
C = s(0),
D = s(0) ;
A = 0,
B = s(0),
C = 0,
D = s(0) ;
A = s(0),
B = 0,
C = 0,
D = s(0) ;
A = 0,
B = 0,
C = s(s(0)),
D = s(s(0)) ;
A = 0,
B = s(0),
C = s(0),
D = s(s(0)) ;
A = 0,
B = s(s(0)),
C = 0,
D = s(s(0)) ;
A = s(0),
B = 0,
C = s(0),
D = s(s(0)) ;
A = s(0),
B = s(0),
C = 0,
D = s(s(0)) ;
A = s(s(0)),
B = 0,
C = 0,
D = s(s(0)) ;
5. 考察
本項目では、バックトラックの理解を深めるため、prologで関数enum3を呼び出したとき、処理系の内部ではどのような振る舞いが行われているのかを考察したい。
関数enum3が呼び出されたとき、最初に評価される式はadd(D,0,D)である。ここで、関数addの持つデータベースを見るとadd(0, Y, Y)と書かれていることがわかる。よって、このとき関数add3から関数addに渡される第2引数の値が0であることが分かっているので、add(0, Y, Y)より第3引数は0と判断する。結果、enum3の第4引数Dは0であると判断された。
その後、関数enum3の関数add3が呼び出される。このとき、これまでの結果から既にDの値は分かっているので、実際に関数add3に渡される引数はadd3(A, B, C, 0)となる。
次に、関数add3の内部の振る舞いについて考える。関数add3ではデータベースとしてadd3(0, 0, Z, Z)を持っている。関数addのときと同じように、第4引数が0であることからD=C=0である判断される。
その後、add3(0, s(X), Y, s(Z)):- add(X,Y,Z).の評価を行う。関数addで使う引数のYとZは共に0であることが分かっているため、実際に渡される引数はadd(X, 0, 0)となり、X+0=0よりX=0という結果を得る。つまり関数enum3の第二引数Bが0である判断される。
最後に、add3(s(A), B, C, s(D)):- add3(A, B, C, D).の評価を行う。これまでの結果から、再帰的に呼び出す関数add3に渡される引数は、add3(A, 0, 0, 0)となる。そして、再び関数add3の先頭の式から評価が開始される。つまり、データベースadd3(0, 0, Z, Z)と、引き渡された引数(A, 0, 0, 0)の照合が行われる。このとき、4つの引数のうち3つがデータベースと一致していることから、Aに入る引数は0であると判断される。結果、関数enum3の出力する値は、”A=0, B=0, C=0. D=0”となる。
一巡目の解求まると、バックトラックによって、今まで通ってきた解を順々に戻っていく。結果、関数enum3で一番初めのadd(D,0,D)を呼び出したところまで戻る。そして、他の解を探すため、分岐点の違う分岐ルートを選ぶ。つまり、関数add内の分岐、
add(0, Y, Y). (最初に通ったルート)
add(s(X), Y, s(Z)) :- add(X, Y, Z). (←違う分岐ルート:今度はこっちを通る)
である。コレによりs(D)が行われる。つまりs(0)となり、再び関数addが引数(s(0), 0, s(0))を伴って呼び出される。addが呼び出されると、本考察冒頭と同様に、データベースとの照合が行われる。そして、バックトラックにより関数enum3に戻り、関数add3が引数(A, B, C, s(0))を伴って渡されて呼び出される。
その後、関数add3のデータベースより、第3引数=第4引数と判断され、D=C=s(0)と判断される。そして、この後も1順目と同様に、式を評価していく。
このようにして、関数enum3では自明の解を得るまで式を次々と評価していく。このため、”2.考え方”の部分でも述べたが、式を評価していく途中で自明の解が得られない再帰ループに入ってしまった場合、思ったとおりの振る舞いをしてくれなくなる。
これらのことから、今回の問題のような列挙を目的とした探索をして欲しい場合は、処理系が一つずつ解を導いてくれるようにprogrammingする必要があるといえる。本プログラムでは、これらのことを意識し、バックトラックが常に発生する仕組みを構築した。結果、本プログラムは仕様に沿う振る舞いをしてくれた。
6. 感想
PrologがどのようなStepで走っているのかを理解するのが難しく、理解するのにかなりの時間を使ってしまった。そのため、課題2の問題例で示されている他の問題や、オリジナルの問題を解くことが出来なかった。なので、今回解けなかった問題に対しては、自由課題として後日提出したい。
ラベル Computational Intelligence の投稿を表示しています。 すべての投稿を表示
ラベル Computational Intelligence の投稿を表示しています。 すべての投稿を表示
2008-06-07
2008-05-12
Computational Intelligence 3
essayはほぼ終了。あとはresumeとcover letter(多分今回は必要ないっぽい)書いて糸冬了かな。さっさと終わらせて、言語処理系と回路理論の課題やって、hardware記述言語の勉強+状態遷移図の復習しよう。あとそろそろJudeとprologのprogrammingも出来るようにならんとな。でもOSが大分遅れ気味なのも痛いなぁ。
orz
反省しなくては。
こんな事態になった原因は、俺の脳内処理能力+課題解決能力が糞なせいに他ならない。いつでもどこでもtoggle switch一つで脳をフル稼働させられる人間になりたいわ。
----- Computational Intelligence note May 12th, 2008 -----
[Computational Inteligence]
・述語とは
あるものがカテゴリへの所属しているとか student(bob)
性質を持っているとか tall(bob)
動作をするとか runs)bob)
関係とか loves(bob,liz)
述語に引数として与えると原始論理式(atomic formula)となる。
・prologと一階述語論理で扱う記号
定数、変数、関数を一階述語論論理で扱う
定数 bob, 0, june, nil
変数は大文字
数学と情報では変数の概念が違う
⇒単一代入変数
一回決まったら、他の値にはならない
k=3としたら、途中でk=6とかにはしない。
逆の振る舞いを"破壊的代入"という
⇒一回与えた変数を書き換えること
関数 s(X),date(dec,31)
ものからものを作る
"一階"とは、遠陬にはものを表す変数しか入らないということ!
⇒変数にはものしか入らないということ!
・記号 vs. 記号の意味
記号は何らかの意味を担っている。
計算機の中で閉じた意味を作ることが出来る
計算機の中といっても計算機の外とも関係がある。
計算機の中のbobというシンボルと
計算機の外のbobという実在する人物は
人間が結び付けている。
結びつけは全て人間が行っている。
記号の意味はプログラマが決める。
論理式が言及している集合のことを、対象領域という。
・記号による知識表現の例
例えば、生死を扱うとき
定数:socrates
述語:Human, mortal
あらゆるものに名前をつけるということは大変なこと
⇒monthは別々でもいいが、dayにいちいち名前をつけることは大変!
5 = s(s(s(s(s(0))))) means 0の次の次の次の次の次の数
rectangle()関数を使えば、
(x0, y0)と(x1,y1)を貰うことで
長方形を作ることが出来る。
⇒関数と考えるよりもデータ構造と考えた方が自然な場合もある。
書いたものが何を表すかというと、ある複素数を表す"つもり"になっている。
prologでは、f()は定数の親戚と考えても構わない。
・解釈
知識には宣言的と手続き的がある。
prolgにはその両方が備わっている。
prologはどうやって与えられた質問に答えているのか?
例えば、
宣言的な顔:兄弟とか足し算の概念を宣言的に定義している。
⇒何回やっても答えが同じでなくてはならない。
⇒証明をする必要がある。
・宣言的な解釈
基本的には論理学の復習
プログラムとは、ruleを書き並べたもの。
個々のruleがandかorでつながっている。
⇒programではandで繋がっている。
とりあえずデータベースみたいなプログラムを考える。
cf.家族関係(2) - 用語の意味の定義
個々のruleはprogrammerは正しいと思って書かれている。
どれか一個が正しいのではなく、全て正しいと思って書かれている。
では、個々のruleはどうなっているのか?
規則(rule) --- 節とかclauseとか言う。
自然言語で言うと条件文に対応している
factとは肯定平叙文!
質問(query) --- も「clause」
一種の疑問文となる。
正確に言うと、否定疑問文に対応。
・では、何が無いのか?2つある。
普通の否定平叙文がない!
ちなみに、≠は否定ではない。≠は違う人だ、と宣言しているだけ。
つまり、肯定的に二つのものが異なると解釈する。
ORでつながった複文もない。
・演習
is_parent_of(pam, bob)
femail(pam)
is_mother_of(X, Y) :- is_parent_of(X, Y), femail(X)
↑全体はandで繋がっていると考えて、書き直すと、
is_parent_of(pam, bob)
∧ femail(pam)
∧ ∀X∀( Yis_mother_of(X, Y) (is_parent_of(X, Y) ∧ femail(X)) )
となる。さらに三行目は、別の書き方をすると
is_mother_of(X, Y) ∨¬is_parent_of(X, Y) ∨ ¬femail(X)
となる。また、↑のことをclauseという。
・ここまでのまとめ
つまり、節とは、原始論理式やその否定をorで繋げたもの。
原子論理式はばらすことが出来ない論理式。
これ以上バラスと、論理式ではなくなってしまう論理式のこと。
基本的に、if文は可能
結論にはnotは付かない。
条件は一般には0個以上ある。
条件の数にはたくさんあってもよい。
しかしながら、結論は一個でなければならない。
これが、prologの特徴となっている。
?- add(0, s(0), X), add(X, X, Y)
?- means :- または "←"
基本的には、まず"or"でバラす。
つまり、¬add(0, s(0), X) ∨ add(X, X, Y)
orで繋がっていない分はfalseであるといえる!
false ← ¬add(0, s(0), X) ∨ add(X, X, Y)?
つまり、矛盾であることを言っている。
つまり、prologとは否定疑問文で解釈している?
正確に書くと、
∧∀X∀Y(¬add(0, s(0), X) ∨ add(X, X, Y))
= 全てのXに対して、いないので、
・教科書の例
false :- is_ancestor_of(X,jim)
⇒for all X, X is not an ancewstor of jim
⇒is there no ancestor of jim?
Yes! pat is an ancestor!
yes! ann is an ancestor!
・もう一つの解釈の可能性
条件文の略記。
左辺にyes(x)は
If X is an ancesstor of jim, say "yes" and answer C.
⇒yes, pat is an answer.
⇒yes, ann is an answer
否定疑問文が入ったらyesと答えようとして、証明手続きが機能
P⇒yes, not Pは非常に近いといえる。
・変数の役割
もう一つ大事なことは、変数というのはfor all という前提が付いていた。
試験問題では、∀X∀Yは書く?
∀=universal con~~? ⇒ 全称記号
who is ancestor of jimと聞くところを、prologでは
is there ancestor of jimと聞いている。
質問の中の変数ではどうなっているのか?
例:is_ancestor_of(X, jim)という変数があったとすると、
¬(ヨX is_ancestor(X, jim))
XがYのgrandfatherだというとき、その中にzさんの記号を書くと、
zさんの存在記号となる?
つまり、
∀X∀Y∀Z(g_father(X, Y) ← (father(X,Z)∧father(Z,Y)))
と
∀X∀Y(g_father(X,Y) ← ヨZ(father(x,Z)∧father(Z,Y)))
は、同じことを言っている。
↑情報数学の復習
条件文に入れてしまうと存在記号に化ける!
・三段論法について
bottom-up
⇒ P P⇒Q
-------------
⇒Q
prologでは、ちょっと違う。
⇒top-down
Q⇒ P⇒Q
----------
P⇒
↑Qという手続きが呼ばれたので、Pという手続きが呼ばれたと考える。
どちらも、下記のルールの特殊な場合に過ぎない。
A⇒B B⇒C
------------
A⇒C
となる。
・prologの実行メカニズムの基本
知識として、二つの方法を使っている
P :- Q,R.
P :- S,T.
↑の2通りについて調べる。
1と折り目で間違っていた場合は、
S、Tに展開して、"やり直す"!
↑これはprolog独自のアルゴリズム。
このようなアルゴリズムを決定性アルゴリズムという?
反対を、非決定性のアルゴリズムという?
最初にやって、駄目だったら次の方法を試してみる。
このような振る舞いをbacktrackを使うという。
つまり、試行錯誤するということ!
普通のprologの処理系は、書いた順番に実行する。逐次的に実行する。
論理値だと思ったときには、規則の中の条件の順序はどうでも良いが、
基本的には、上に書いた文から、左に書いてる節から評価していく。
一般ruleというものがある。
・帰納的定義
nの階乗定義の場合、
n! = 1 (n=0) ----- base case
= n(n-1)! (n>0)
base caseを先に書く!
一個のルールのときには、条件を絞っていく。
なるべくさきに、条件を絞っていった方がよい。
計算に時間のかかるものは、後にやった方がよい!
例:
条件を4つ書いたとき、XもYも女兄弟ですか?というとき、
親はせいぜい二人しかいないのだから、まず共通の親を見つけたほうが良い!
XとYは別人だ、といいたいとき。
もし、誰かの女兄弟を探してくるとき。
Iは与えられた人物の女今日はを探してくる。
女の人を探してくる。
Yさんと違う人を探す。
↑コレはnaive
Xという人を探すんだとしたら、
確立1/2になるようなものは後に探した方がよい。
なるべきたくさんある可能性を速く絞らせた方がよい。
・問20
(2,2)のような場所でも、;を打ってたら、そのうち出てくるものでなくてはいけない。
(0,X)を最初に出力しようとしていくと、(2,2)は出てこない。
⇒実現するためには
論理式を入れたら、自動的に証明してくれる。
・prolog
他の言語に比べたら、知能的っぽいけど、そこまで万能ではない。
・まとめ
今までは、ifとか条件否定とかやってきたが、
whoとかwhatが引数としてきた場合、
どうやって変数に代入するのか、という話はまだやっていない。
論理式を弄くりながら、学んでいく。
一階述語論理の三段論法だと、
human(socrates) ∀X(~以下略
+と-でキャンセルできる。
prologでは =は"=="の意味になる。
来週はbacktrackに基づいて、unificationは何をやっているかを調べる。
orz
反省しなくては。
こんな事態になった原因は、俺の脳内処理能力+課題解決能力が糞なせいに他ならない。いつでもどこでもtoggle switch一つで脳をフル稼働させられる人間になりたいわ。
----- Computational Intelligence note May 12th, 2008 -----
[Computational Inteligence]
・述語とは
あるものがカテゴリへの所属しているとか student(bob)
性質を持っているとか tall(bob)
動作をするとか runs)bob)
関係とか loves(bob,liz)
述語に引数として与えると原始論理式(atomic formula)となる。
・prologと一階述語論理で扱う記号
定数、変数、関数を一階述語論論理で扱う
定数 bob, 0, june, nil
変数は大文字
数学と情報では変数の概念が違う
⇒単一代入変数
一回決まったら、他の値にはならない
k=3としたら、途中でk=6とかにはしない。
逆の振る舞いを"破壊的代入"という
⇒一回与えた変数を書き換えること
関数 s(X),date(dec,31)
ものからものを作る
"一階"とは、遠陬にはものを表す変数しか入らないということ!
⇒変数にはものしか入らないということ!
・記号 vs. 記号の意味
記号は何らかの意味を担っている。
計算機の中で閉じた意味を作ることが出来る
計算機の中といっても計算機の外とも関係がある。
計算機の中のbobというシンボルと
計算機の外のbobという実在する人物は
人間が結び付けている。
結びつけは全て人間が行っている。
記号の意味はプログラマが決める。
論理式が言及している集合のことを、対象領域という。
・記号による知識表現の例
例えば、生死を扱うとき
定数:socrates
述語:Human, mortal
あらゆるものに名前をつけるということは大変なこと
⇒monthは別々でもいいが、dayにいちいち名前をつけることは大変!
5 = s(s(s(s(s(0))))) means 0の次の次の次の次の次の数
rectangle()関数を使えば、
(x0, y0)と(x1,y1)を貰うことで
長方形を作ることが出来る。
⇒関数と考えるよりもデータ構造と考えた方が自然な場合もある。
書いたものが何を表すかというと、ある複素数を表す"つもり"になっている。
prologでは、f()は定数の親戚と考えても構わない。
・解釈
知識には宣言的と手続き的がある。
prolgにはその両方が備わっている。
prologはどうやって与えられた質問に答えているのか?
例えば、
宣言的な顔:兄弟とか足し算の概念を宣言的に定義している。
⇒何回やっても答えが同じでなくてはならない。
⇒証明をする必要がある。
・宣言的な解釈
基本的には論理学の復習
プログラムとは、ruleを書き並べたもの。
個々のruleがandかorでつながっている。
⇒programではandで繋がっている。
とりあえずデータベースみたいなプログラムを考える。
cf.家族関係(2) - 用語の意味の定義
個々のruleはprogrammerは正しいと思って書かれている。
どれか一個が正しいのではなく、全て正しいと思って書かれている。
では、個々のruleはどうなっているのか?
規則(rule) --- 節とかclauseとか言う。
自然言語で言うと条件文に対応している
factとは肯定平叙文!
質問(query) --- も「clause」
一種の疑問文となる。
正確に言うと、否定疑問文に対応。
・では、何が無いのか?2つある。
普通の否定平叙文がない!
ちなみに、≠は否定ではない。≠は違う人だ、と宣言しているだけ。
つまり、肯定的に二つのものが異なると解釈する。
ORでつながった複文もない。
・演習
is_parent_of(pam, bob)
femail(pam)
is_mother_of(X, Y) :- is_parent_of(X, Y), femail(X)
↑全体はandで繋がっていると考えて、書き直すと、
is_parent_of(pam, bob)
∧ femail(pam)
∧ ∀X∀( Yis_mother_of(X, Y) (is_parent_of(X, Y) ∧ femail(X)) )
となる。さらに三行目は、別の書き方をすると
is_mother_of(X, Y) ∨¬is_parent_of(X, Y) ∨ ¬femail(X)
となる。また、↑のことをclauseという。
・ここまでのまとめ
つまり、節とは、原始論理式やその否定をorで繋げたもの。
原子論理式はばらすことが出来ない論理式。
これ以上バラスと、論理式ではなくなってしまう論理式のこと。
基本的に、if文は可能
結論にはnotは付かない。
条件は一般には0個以上ある。
条件の数にはたくさんあってもよい。
しかしながら、結論は一個でなければならない。
これが、prologの特徴となっている。
?- add(0, s(0), X), add(X, X, Y)
?- means :- または "←"
基本的には、まず"or"でバラす。
つまり、¬add(0, s(0), X) ∨ add(X, X, Y)
orで繋がっていない分はfalseであるといえる!
false ← ¬add(0, s(0), X) ∨ add(X, X, Y)?
つまり、矛盾であることを言っている。
つまり、prologとは否定疑問文で解釈している?
正確に書くと、
∧∀X∀Y(¬add(0, s(0), X) ∨ add(X, X, Y))
= 全てのXに対して、いないので、
・教科書の例
false :- is_ancestor_of(X,jim)
⇒for all X, X is not an ancewstor of jim
⇒is there no ancestor of jim?
Yes! pat is an ancestor!
yes! ann is an ancestor!
・もう一つの解釈の可能性
条件文の略記。
左辺にyes(x)は
If X is an ancesstor of jim, say "yes" and answer C.
⇒yes, pat is an answer.
⇒yes, ann is an answer
否定疑問文が入ったらyesと答えようとして、証明手続きが機能
P⇒yes, not Pは非常に近いといえる。
・変数の役割
もう一つ大事なことは、変数というのはfor all という前提が付いていた。
試験問題では、∀X∀Yは書く?
∀=universal con~~? ⇒ 全称記号
who is ancestor of jimと聞くところを、prologでは
is there ancestor of jimと聞いている。
質問の中の変数ではどうなっているのか?
例:is_ancestor_of(X, jim)という変数があったとすると、
¬(ヨX is_ancestor(X, jim))
XがYのgrandfatherだというとき、その中にzさんの記号を書くと、
zさんの存在記号となる?
つまり、
∀X∀Y∀Z(g_father(X, Y) ← (father(X,Z)∧father(Z,Y)))
と
∀X∀Y(g_father(X,Y) ← ヨZ(father(x,Z)∧father(Z,Y)))
は、同じことを言っている。
↑情報数学の復習
条件文に入れてしまうと存在記号に化ける!
・三段論法について
bottom-up
⇒ P P⇒Q
-------------
⇒Q
prologでは、ちょっと違う。
⇒top-down
Q⇒ P⇒Q
----------
P⇒
↑Qという手続きが呼ばれたので、Pという手続きが呼ばれたと考える。
どちらも、下記のルールの特殊な場合に過ぎない。
A⇒B B⇒C
------------
A⇒C
となる。
・prologの実行メカニズムの基本
知識として、二つの方法を使っている
P :- Q,R.
P :- S,T.
↑の2通りについて調べる。
1と折り目で間違っていた場合は、
S、Tに展開して、"やり直す"!
↑これはprolog独自のアルゴリズム。
このようなアルゴリズムを決定性アルゴリズムという?
反対を、非決定性のアルゴリズムという?
最初にやって、駄目だったら次の方法を試してみる。
このような振る舞いをbacktrackを使うという。
つまり、試行錯誤するということ!
普通のprologの処理系は、書いた順番に実行する。逐次的に実行する。
論理値だと思ったときには、規則の中の条件の順序はどうでも良いが、
基本的には、上に書いた文から、左に書いてる節から評価していく。
一般ruleというものがある。
・帰納的定義
nの階乗定義の場合、
n! = 1 (n=0) ----- base case
= n(n-1)! (n>0)
base caseを先に書く!
一個のルールのときには、条件を絞っていく。
なるべくさきに、条件を絞っていった方がよい。
計算に時間のかかるものは、後にやった方がよい!
例:
条件を4つ書いたとき、XもYも女兄弟ですか?というとき、
親はせいぜい二人しかいないのだから、まず共通の親を見つけたほうが良い!
XとYは別人だ、といいたいとき。
もし、誰かの女兄弟を探してくるとき。
Iは与えられた人物の女今日はを探してくる。
女の人を探してくる。
Yさんと違う人を探す。
↑コレはnaive
Xという人を探すんだとしたら、
確立1/2になるようなものは後に探した方がよい。
なるべきたくさんある可能性を速く絞らせた方がよい。
・問20
(2,2)のような場所でも、;を打ってたら、そのうち出てくるものでなくてはいけない。
(0,X)を最初に出力しようとしていくと、(2,2)は出てこない。
⇒実現するためには
論理式を入れたら、自動的に証明してくれる。
・prolog
他の言語に比べたら、知能的っぽいけど、そこまで万能ではない。
・まとめ
今までは、ifとか条件否定とかやってきたが、
whoとかwhatが引数としてきた場合、
どうやって変数に代入するのか、という話はまだやっていない。
論理式を弄くりながら、学んでいく。
一階述語論理の三段論法だと、
human(socrates) ∀X(~以下略
+と-でキャンセルできる。
prologでは =は"=="の意味になる。
来週はbacktrackに基づいて、unificationは何をやっているかを調べる。
2008-05-01
Computational Intelligence 2
今日から一限が無い日は、9時に友達と集まってspeakingの練習をはじめました。TopicはAdvance Englishで、今まで放置プレイしてきたacademic word list "570"。周りの視線をやけに浴びてる気がするけど、きっと気のせいだろう。
ところで、先週のTOEFLの前日に、ちょっと面白いイベントに参加したらなんと某企業のT-shirtを手に入った!キタコレ!でもそれ着て外に行くのは、色々と勘違いを起こしそうだから遠慮がちだったり。
またまた話し変わって、今週の月曜日はVijay Saswat Doctorの講義が早稲田理工学部であったので、参加しました。内容は「Programming for concurrency and distribution」。
今、IBM researchが研究しているX10 programmingの説明みたいな講義です。
並行処理をどう実現するか、って説明からX10 programmingの概要、
最後にX10 programmingのサンプルソースコードの解説といった内容。
threadの知識が既に乏しい自分は蚊帳の外ですたorz
まぁとりあえず凄くいいと思ったのは、X10 programmingで作ったソースコードはJVMでもC compilerでも動くらしい。すげぇwでも、原理は理解できずw
参考
http://x10.sourceforge.net/x10home.shtml
講義に関して言えば、最初はゆっくりしゃべってくれたたから理解できたけど、だんだんスピードアップしてきて、イミフワールドへww言ってることをスライドと照らし合わせながら、大まかにしか理解できなかったorzまぁ理解度は1,2割ってところかorz orz orzアメリカの理工系講義もこんな感じなんかなぁ。まだまだ、今のレベルじゃ太刀打ちできないね。
今年は早稲田CS学科主宰(?)のGlobal COE programがある関係で、今後も色々なCSの著名人を大久保キャンパスに招待するらしい。次の講義では、最低でも、講義で示される理論の5割は理解できるようになりたいもんです。
------ assignment memo -----
Take8easy俺。情報数学復習しないとまずいっぽいなorz
【課題内容】
主張1:「コンピュータが知的なはずが無い(P1),だって、プログラムされたことしか出来ない(Q1)のだから」
Q1は正しいか?Q1はP1を含意するか?
主張2:「人間が知的なはずが無い(P2),だって、遺伝子に組み込まれたことしか出来ない(Q2)のだから」
Q2は正しいか?Q2はP2を含意するか?
以上に関する自分の意見をレポートにまとめて提出。両主張の関係をよく分析してください。
主張1と主張2は全く同じ格好をしている。
同じロジックなら同じ答えになるはず。
答えが違っていたらどこかで言葉の認識のズレがある。
→「知的」の定義?
→人間ににとっての「知的」とコンピュータにとっての「知的」は同じ尺度か?
【与えられた命題の整理】
P1 = コンピュータが知的なはずが無い
¬P1 = コンピュータは知的なはずである。
Q1 = プログラムされたことしか出来ない
¬Q1 = プログラムされたこと(以外)も出来る。
Q1'= プログラムされていないことは出来ない。
→Q1 = Q1' ??
P2 = 人間が知的なはずが無い
¬P2 = 人間は知的なはずである。
Q2 = 遺伝子に組み込まれたことしか出来ない
¬Q2 = 遺伝子に組み込まれたこと(以外)も出来る。
Q2'= 遺伝子に組み込まれなかったことは出来ない
Q2 = Q2' ??
・命題の否定、置換
Q1 → P1 プログラムされたことしか出来ないのだから、コンピュータは知的ではない。
¬Q1 →¬P1 プログラムされたこと以外も出来るのだから、コンピュータは知的である。
Q1'→ P1 プログラムされていないことは出来ないのだから、コンピュータは知的ではない。
Q2 → P2 遺伝子に組み込まれたことしか出来ないのだから、人間は知的ではない。
¬Q2'→¬P2 遺伝子に組み込まれたこと以外も出来るのだから、人間は知的である。
Q2'→ P2 遺伝子に組み込まれなかったことは出来ないのだから、人間は知的ではない。
【言葉の定義】
・「プログラムされたことしか出来ない」とは?
→プログラムに書かれたことしか出来ない。
・「遺伝子に組み込まれたことしか出来ない」とは?
遺伝子に組み込まれたこと≒本能? ←定義できない?
→本能でしか行動できない。
・「○○しか出来ない」とは?
コンピュータにしか出来ないことがある。
→複雑な計算、膨大なデータの処理
人間にしか出来ないことがある。
→人の顔の判別(現在の段階では)
・○○しかできない = 知的ではない。
ならば、「知的である」とは与えられたこと以外も出来ることになる。
・与えられたこととは?
→その人、モノが生まれた目的・使命?
コンピュータの場合:プログラムの仕様、目的
人間の場合:本能 = 子孫を増やすこと?
・「知的=与えられたこと以外のことも出来る」とすると
知的とは?
コンピュータにとっての知的:プログラムの仕様、作られた目的以外のことも出来ること
人間にとっての知的:子孫を増やす以外のことも出来ること
・エラー発生
脳内メモリが足りません
orz
------ note@Artificial Intelligence -----
計算知能(Computational Intelligence, CI)@wikipedia
a successor of artificial intelligence. As an alternative to GOFAI it rather relies on heuristic algorithms such as in fuzzy systems, neural networks and evolutionary computation. In addition, computational intelligence also embraces techniques that use Swarm intelligence, Fractals and Chaos Theory, Artificial immune systems, Wavelets, etc.
Computational intelligence combines elements of learning, adaptation, evolution and Fuzzy logic (rough sets) to create programs that are, in some sense, intelligent. Computational intelligence research does not reject statistical methods, but often gives a complementary view (as is the case with fuzzy systems). Artificial neural networks is a branch of computational intelligence that is closely related to machine learning.
Computational intelligence is further closely associated with soft computing, connectionist systems and cybernetics.
人工知能研究の一分野であり、数理論理学に基づく従来的な人工知能とは一線を画すものである。計算知能の研究は、ファジィシステムやニューラルネットワークや進化的計算といったヒューリスティック的アルゴリズムを中心とする。その他にも、群知能、フラクタル、カオス理論、人工免疫系、ウェーブレットといった技法も利用する。
計算知能の研究では、学習や適応や進化やファジィ論理(ラフ集合)といった要素を駆使して、ある意味で知的なプログラムを作成することを目指している。計算知能の研究では、統計的手法を拒絶するものではなく、しばしば相補的な考え方を提供することもある(例えば、ファジィシステム)。ニューラルネットワーク研究は計算知能研究の一部であり、機械学習と密接に関連している。
計算知能はソフトコンピューティング、みすぼらしい(scruffy)AI、コネクショニズムのシステム、およびサイバネティックスと密接に関連している。
・課題補足
プログラムしたことしか、主張できないのか。
人間は遺伝子に組み込まれたことしか出来ない。だったら知的とはいえない。
主張の1と2がねじれてなかったら一貫する。
ずれていたら、どこがずれているのか?そこを良く分析する。
提出先の変更:63号館の1階
4月28日 Global COE Vijay Saswat Doctor
Programming for concurrency and distribution
マルチコアを使いこなすときの考え方:並列処理、並行処理、分散処理
今回は並行処理
今まで見たいなプログラムではいけない、という話。
X10という言語について。
IBMは、クラスターとか作ってる。javaの普及に貢献。
APGASという考え方に基づいて。
明日、X10の演習できる。
Ambient Global COE
--------------------------------------------
今日の目的:prologを使ってみよう。
疑問文から始まる。
最初はプログラムを読み込む。
コマンドpwd.
cd('c:/~~')
もしくはconsultボタン
list.
→読み込んだものを確認
家計図
赤 女、
青 男。
この家計図をコンピュータに入れるためには
述語部分に値する関数を作ってあげればよい。
is_parent_of(parent, chile).
female(human).
ex:
is_parent_of(pam, bob)
femail(pam).
↑ここまでが具体的な事実。
これらはデータみたいなもの。
prologはデータとプログラムの境目が薄い。
ある家計図のある家族のことが書ける。
辞書にはどういうことが書いてあるのか。
用語の意味の定義。
is_mother_of(X,Y) :- is_parent_of(X,Y) , female(X).
:- = ⇒ ⊂
, = ∧
is_sister_of(X,Y) :-
自分が自分の兄弟かどうかは適当に。
アンダーライン = ワイルドカード
XはYの祖先である。
父親、おじいちゃん、色々ある→再帰呼び出しにする必要がある。
is_ancestor_of() :- is_parent_of()
もうちょっと定義すると
is_ancestor_of(X,Y):-
is_parent_of(X,Y),
is_ancestor_of(Z,Y)
[bobの状況]
bobには子供が二人いるが、もしかしたらそれ以上の子供がいるかもしれない。
yes / noの処理系と(昔)
true / failの処理系がある。(今)
noとfailの違いは微妙。
証拠が無いという意味がfail。
Who, whatの場合:
Whoは変数みたいなもの。
is_parent_of(Who,bob).
Who = pam .
is_parent_of(Who,bob).
Who = pam ;
Who = tom ;
fail.(わかんない)
・もっと複雑な疑問
is_parent_of(X,Y).
データベースにあるものを片っ端から調べる。
→入れた順番に六通りの答えが存在する。
X=
Y=
X=
Y=
......
・条件を並べる
is_parent_of(X,Who), is_parent_of(X,pat).
共通の親がbobで
X = bob
Who = ann
自分が自分の兄弟としているので、
X= bob
Who = pat
・定義を見るとき
listing(is_mother_of).
・is_mother_of(Who,bob).
同じ格好のものを見つけて、当てはまるものを返すだけ。
→データベース検索と同じ
・デバッグ - 中の人が何やってるか知りたいとき
trace.
ワンステップずつ実行する。
Exit = 無事確認された。
・is_ancestor_of(Who,bob).
誰がbobの祖先ですか、と見えるが
子孫も同時に探索できる。
Ex
is_ancestor_of(pam, Who).
bob,ann,pat,jim
G507とかはシステム内部で作った変数。
子孫は二通りある。
Redo:一つ見つかったけど、それだけじゃ満足しないでやり直しをする。続きをする。
→子供の子孫を探しに行っている。
問い14,15は簡単なので各自やっておく。
・論理式
A&BもB&Aも同じ。
→兄弟もひっくり返しても良い
・is_ancestor_of(X,Y) :-
is_parent_of
is_ancestor_of
↑上と下を入れ替えても構わない。
・祖先の定義の仕方は一杯ある。
X ------ Z -------- Y
parent ancestor
X -------- Z ------ Y
ancestor parent
・問15
再帰呼び出しは、下手に書くと止まらない。
→is_ancestor_of -> is_ancestor_of -> is_ancestor_of ....... loop
・足し算のプログラム
非常に原始的な足し算が出来る。
→物事を根本から考える
add(0,Y,Y)
0の次と次は自然数
s(X) = sの次を読む。
xの次の数にyを足したらzの次の数になる。
= add(X,Y,Z).
multiply(0,_,0)
・読み込みコマンド
['prologファイル名']
add(s(s(0)),s(s(s(0))),X)
X = s(s(s(s(s(0))))))) = 5
add(X,Y,s(s(s(0)))).
X + Y = 3となるX,Yを出力できる。
・add(X,Y,Z).
プログラムはこうやって答える↓
X=0のとき
Y=Zが同じ。
X=s(0)
Z = s(Y)
…こんな感じで一般解を永遠と繰り返す。
→prologは一般解を扱う力がある。
変数を含んでいないものをground termという。
問:三つの足し算を計算するprologを書いてみよう!
勿論X is 1234+ 1234なんてことも出来るが、
足し算を根本的に計算すると、
遅い代わりに逆向きに走ることが出来る!
・半加算器と全加算器(half adder, full adder)
FA = 前の繰り上がりも考慮した加算器。
fa fa haという回路を作る。
加算器という述語。
これをつなげていけばaddが出来る。
・prologには二つあって
事実(fact)と規則(rule)がある。
if sentence:rule
足し算はruleで出来る。
3ビットだから2+3とかやってみる。
add(0,1,0 ,0,1,1, X3,X2,X1,X0)
add(X2, X1,X0, Y2,Y1,Y0, 0,1,0,1).
順番はともかくとして、答えが出てくる。
出力を入れると入力を出すこともできる!
house.pl
人工知能→モノが何故動くのか、何故動かないのかの診断に使う
炊く無い敗戦データベース
cd curcuit braiker
l light
w wire
s switch
dynamic宣言の説明は省略。
down(s1) = s1 is down
lit = 電気がつく
lit :- light(L) , ok(L), live(l)
live(outside)
live(Y)
この状態で初めて、家中に電気がつく!
lit(L) このうちで光るものはなんだ!
・switchを落とすには
データを書き換える→プログラムを書き換える。
retract(down(s1)). 入れた知識を引っ込める
assert(up(s1)). 新たな知識を入れる。
こんな感じで、家の状況を論理式で書くことが出来る。
w0とp1は繋がっているのか、とか質問できる。
ところで、先週のTOEFLの前日に、ちょっと面白いイベントに参加したらなんと某企業のT-shirtを手に入った!キタコレ!でもそれ着て外に行くのは、色々と勘違いを起こしそうだから遠慮がちだったり。
またまた話し変わって、今週の月曜日はVijay Saswat Doctorの講義が早稲田理工学部であったので、参加しました。内容は「Programming for concurrency and distribution」。
今、IBM researchが研究しているX10 programmingの説明みたいな講義です。
並行処理をどう実現するか、って説明からX10 programmingの概要、
最後にX10 programmingのサンプルソースコードの解説といった内容。
threadの知識が既に乏しい自分は蚊帳の外ですたorz
まぁとりあえず凄くいいと思ったのは、X10 programmingで作ったソースコードはJVMでもC compilerでも動くらしい。すげぇwでも、原理は理解できずw
参考
http://x10.sourceforge.net/x10home.shtml
講義に関して言えば、最初はゆっくりしゃべってくれたたから理解できたけど、だんだんスピードアップしてきて、イミフワールドへww言ってることをスライドと照らし合わせながら、大まかにしか理解できなかったorzまぁ理解度は1,2割ってところかorz orz orzアメリカの理工系講義もこんな感じなんかなぁ。まだまだ、今のレベルじゃ太刀打ちできないね。
今年は早稲田CS学科主宰(?)のGlobal COE programがある関係で、今後も色々なCSの著名人を大久保キャンパスに招待するらしい。次の講義では、最低でも、講義で示される理論の5割は理解できるようになりたいもんです。
------ assignment memo -----
Take8easy俺。情報数学復習しないとまずいっぽいなorz
【課題内容】
主張1:「コンピュータが知的なはずが無い(P1),だって、プログラムされたことしか出来ない(Q1)のだから」
Q1は正しいか?Q1はP1を含意するか?
主張2:「人間が知的なはずが無い(P2),だって、遺伝子に組み込まれたことしか出来ない(Q2)のだから」
Q2は正しいか?Q2はP2を含意するか?
以上に関する自分の意見をレポートにまとめて提出。両主張の関係をよく分析してください。
主張1と主張2は全く同じ格好をしている。
同じロジックなら同じ答えになるはず。
答えが違っていたらどこかで言葉の認識のズレがある。
→「知的」の定義?
→人間ににとっての「知的」とコンピュータにとっての「知的」は同じ尺度か?
【与えられた命題の整理】
P1 = コンピュータが知的なはずが無い
¬P1 = コンピュータは知的なはずである。
Q1 = プログラムされたことしか出来ない
¬Q1 = プログラムされたこと(以外)も出来る。
Q1'= プログラムされていないことは出来ない。
→Q1 = Q1' ??
P2 = 人間が知的なはずが無い
¬P2 = 人間は知的なはずである。
Q2 = 遺伝子に組み込まれたことしか出来ない
¬Q2 = 遺伝子に組み込まれたこと(以外)も出来る。
Q2'= 遺伝子に組み込まれなかったことは出来ない
Q2 = Q2' ??
・命題の否定、置換
Q1 → P1 プログラムされたことしか出来ないのだから、コンピュータは知的ではない。
¬Q1 →¬P1 プログラムされたこと以外も出来るのだから、コンピュータは知的である。
Q1'→ P1 プログラムされていないことは出来ないのだから、コンピュータは知的ではない。
Q2 → P2 遺伝子に組み込まれたことしか出来ないのだから、人間は知的ではない。
¬Q2'→¬P2 遺伝子に組み込まれたこと以外も出来るのだから、人間は知的である。
Q2'→ P2 遺伝子に組み込まれなかったことは出来ないのだから、人間は知的ではない。
【言葉の定義】
・「プログラムされたことしか出来ない」とは?
→プログラムに書かれたことしか出来ない。
・「遺伝子に組み込まれたことしか出来ない」とは?
遺伝子に組み込まれたこと≒本能? ←定義できない?
→本能でしか行動できない。
・「○○しか出来ない」とは?
コンピュータにしか出来ないことがある。
→複雑な計算、膨大なデータの処理
人間にしか出来ないことがある。
→人の顔の判別(現在の段階では)
・○○しかできない = 知的ではない。
ならば、「知的である」とは与えられたこと以外も出来ることになる。
・与えられたこととは?
→その人、モノが生まれた目的・使命?
コンピュータの場合:プログラムの仕様、目的
人間の場合:本能 = 子孫を増やすこと?
・「知的=与えられたこと以外のことも出来る」とすると
知的とは?
コンピュータにとっての知的:プログラムの仕様、作られた目的以外のことも出来ること
人間にとっての知的:子孫を増やす以外のことも出来ること
・エラー発生
脳内メモリが足りません
orz
------ note@Artificial Intelligence -----
計算知能(Computational Intelligence, CI)@wikipedia
a successor of artificial intelligence. As an alternative to GOFAI it rather relies on heuristic algorithms such as in fuzzy systems, neural networks and evolutionary computation. In addition, computational intelligence also embraces techniques that use Swarm intelligence, Fractals and Chaos Theory, Artificial immune systems, Wavelets, etc.
Computational intelligence combines elements of learning, adaptation, evolution and Fuzzy logic (rough sets) to create programs that are, in some sense, intelligent. Computational intelligence research does not reject statistical methods, but often gives a complementary view (as is the case with fuzzy systems). Artificial neural networks is a branch of computational intelligence that is closely related to machine learning.
Computational intelligence is further closely associated with soft computing, connectionist systems and cybernetics.
人工知能研究の一分野であり、数理論理学に基づく従来的な人工知能とは一線を画すものである。計算知能の研究は、ファジィシステムやニューラルネットワークや進化的計算といったヒューリスティック的アルゴリズムを中心とする。その他にも、群知能、フラクタル、カオス理論、人工免疫系、ウェーブレットといった技法も利用する。
計算知能の研究では、学習や適応や進化やファジィ論理(ラフ集合)といった要素を駆使して、ある意味で知的なプログラムを作成することを目指している。計算知能の研究では、統計的手法を拒絶するものではなく、しばしば相補的な考え方を提供することもある(例えば、ファジィシステム)。ニューラルネットワーク研究は計算知能研究の一部であり、機械学習と密接に関連している。
計算知能はソフトコンピューティング、みすぼらしい(scruffy)AI、コネクショニズムのシステム、およびサイバネティックスと密接に関連している。
・課題補足
プログラムしたことしか、主張できないのか。
人間は遺伝子に組み込まれたことしか出来ない。だったら知的とはいえない。
主張の1と2がねじれてなかったら一貫する。
ずれていたら、どこがずれているのか?そこを良く分析する。
提出先の変更:63号館の1階
4月28日 Global COE Vijay Saswat Doctor
Programming for concurrency and distribution
マルチコアを使いこなすときの考え方:並列処理、並行処理、分散処理
今回は並行処理
今まで見たいなプログラムではいけない、という話。
X10という言語について。
IBMは、クラスターとか作ってる。javaの普及に貢献。
APGASという考え方に基づいて。
明日、X10の演習できる。
Ambient Global COE
--------------------------------------------
今日の目的:prologを使ってみよう。
疑問文から始まる。
最初はプログラムを読み込む。
コマンドpwd.
cd('c:/~~')
もしくはconsultボタン
list.
→読み込んだものを確認
家計図
赤 女、
青 男。
この家計図をコンピュータに入れるためには
述語部分に値する関数を作ってあげればよい。
is_parent_of(parent, chile).
female(human).
ex:
is_parent_of(pam, bob)
femail(pam).
↑ここまでが具体的な事実。
これらはデータみたいなもの。
prologはデータとプログラムの境目が薄い。
ある家計図のある家族のことが書ける。
辞書にはどういうことが書いてあるのか。
用語の意味の定義。
is_mother_of(X,Y) :- is_parent_of(X,Y) , female(X).
:- = ⇒ ⊂
, = ∧
is_sister_of(X,Y) :-
自分が自分の兄弟かどうかは適当に。
アンダーライン = ワイルドカード
XはYの祖先である。
父親、おじいちゃん、色々ある→再帰呼び出しにする必要がある。
is_ancestor_of() :- is_parent_of()
もうちょっと定義すると
is_ancestor_of(X,Y):-
is_parent_of(X,Y),
is_ancestor_of(Z,Y)
[bobの状況]
bobには子供が二人いるが、もしかしたらそれ以上の子供がいるかもしれない。
yes / noの処理系と(昔)
true / failの処理系がある。(今)
noとfailの違いは微妙。
証拠が無いという意味がfail。
Who, whatの場合:
Whoは変数みたいなもの。
is_parent_of(Who,bob).
Who = pam .
is_parent_of(Who,bob).
Who = pam ;
Who = tom ;
fail.(わかんない)
・もっと複雑な疑問
is_parent_of(X,Y).
データベースにあるものを片っ端から調べる。
→入れた順番に六通りの答えが存在する。
X=
Y=
X=
Y=
......
・条件を並べる
is_parent_of(X,Who), is_parent_of(X,pat).
共通の親がbobで
X = bob
Who = ann
自分が自分の兄弟としているので、
X= bob
Who = pat
・定義を見るとき
listing(is_mother_of).
・is_mother_of(Who,bob).
同じ格好のものを見つけて、当てはまるものを返すだけ。
→データベース検索と同じ
・デバッグ - 中の人が何やってるか知りたいとき
trace.
ワンステップずつ実行する。
Exit = 無事確認された。
・is_ancestor_of(Who,bob).
誰がbobの祖先ですか、と見えるが
子孫も同時に探索できる。
Ex
is_ancestor_of(pam, Who).
bob,ann,pat,jim
G507とかはシステム内部で作った変数。
子孫は二通りある。
Redo:一つ見つかったけど、それだけじゃ満足しないでやり直しをする。続きをする。
→子供の子孫を探しに行っている。
問い14,15は簡単なので各自やっておく。
・論理式
A&BもB&Aも同じ。
→兄弟もひっくり返しても良い
・is_ancestor_of(X,Y) :-
is_parent_of
is_ancestor_of
↑上と下を入れ替えても構わない。
・祖先の定義の仕方は一杯ある。
X ------ Z -------- Y
parent ancestor
X -------- Z ------ Y
ancestor parent
・問15
再帰呼び出しは、下手に書くと止まらない。
→is_ancestor_of -> is_ancestor_of -> is_ancestor_of ....... loop
・足し算のプログラム
非常に原始的な足し算が出来る。
→物事を根本から考える
add(0,Y,Y)
0の次と次は自然数
s(X) = sの次を読む。
xの次の数にyを足したらzの次の数になる。
= add(X,Y,Z).
multiply(0,_,0)
・読み込みコマンド
['prologファイル名']
add(s(s(0)),s(s(s(0))),X)
X = s(s(s(s(s(0))))))) = 5
add(X,Y,s(s(s(0)))).
X + Y = 3となるX,Yを出力できる。
・add(X,Y,Z).
プログラムはこうやって答える↓
X=0のとき
Y=Zが同じ。
X=s(0)
Z = s(Y)
…こんな感じで一般解を永遠と繰り返す。
→prologは一般解を扱う力がある。
変数を含んでいないものをground termという。
問:三つの足し算を計算するprologを書いてみよう!
勿論X is 1234+ 1234なんてことも出来るが、
足し算を根本的に計算すると、
遅い代わりに逆向きに走ることが出来る!
・半加算器と全加算器(half adder, full adder)
FA = 前の繰り上がりも考慮した加算器。
fa fa haという回路を作る。
加算器という述語。
これをつなげていけばaddが出来る。
・prologには二つあって
事実(fact)と規則(rule)がある。
if sentence:rule
足し算はruleで出来る。
3ビットだから2+3とかやってみる。
add(0,1,0 ,0,1,1, X3,X2,X1,X0)
add(X2, X1,X0, Y2,Y1,Y0, 0,1,0,1).
順番はともかくとして、答えが出てくる。
出力を入れると入力を出すこともできる!
house.pl
人工知能→モノが何故動くのか、何故動かないのかの診断に使う
炊く無い敗戦データベース
cd curcuit braiker
l light
w wire
s switch
dynamic宣言の説明は省略。
down(s1) = s1 is down
lit = 電気がつく
lit :- light(L) , ok(L), live(l)
live(outside)
live(Y)
この状態で初めて、家中に電気がつく!
lit(L) このうちで光るものはなんだ!
・switchを落とすには
データを書き換える→プログラムを書き換える。
retract(down(s1)). 入れた知識を引っ込める
assert(up(s1)). 新たな知識を入れる。
こんな感じで、家の状況を論理式で書くことが出来る。
w0とp1は繋がっているのか、とか質問できる。
2008-04-21
Computational Intelligence

風邪引いたっぽいorz
OS実践コースにどうやらGeekがいるみたい。
指定された教科書は既に読破済みみたいで、
(出版された年に既に読破?)
今は研究室でOSの研究を始めてるそうな。
CSの世界はほんと頭の回転が早い人が多すぎて困る。
でも、俺もそん中で負けないように、かつ、
そういう人達に追いついていかなくてはな。
Eyebotのプログラミングようやく終了です。
とりあえず言われた仕様は満たしているはず。
あとは、optionの機能とか追加してみようかと思ってるけど、
まぁ…、まずはレポートの必須項目書き始めてからかな。
時間が余ったら、考察で書きまくろう。
今年はフィルターみたいなレポートありませんように!
----- note ------
2008/04/21
Index
知的とは?
シンボルとは?
prologとは?
課題
---------------------------------
AIについて
認知科学とは cognitive science
知的機能の科学的研究。
科学のほう。コンピュータを使うとはかぎらない。
心理学とか言語学とか
知識工学とは knowledge engineering
expert system
30年ぐらい歴史があり、そこそこ役に立ってる。
Expert Systemとは
微分積分をプログラムにやらせるのは簡単。
難しいことは、小学校の友達の顔を見分ける。
二歳の子供が子供を覚えるプロセス。
→一般知能は実現困難。
でも分野を限定すれば役立つ知的機能が実現できる。。。はず
役立つためには知識量が重要。
実績がたくさんある。
例:化学の分子構造の同定、株価予測
電子回路故障診断、計算機operation監視、医療監視、
分子生物学実験実験計画、機械設計etc.
・特徴
知識ベースと推論エンジンの文理。
なぜ分離する必要があるか。
知識の管理がしやすくなってなくてはいけない
知識を組み立てるプログラムと
知識を組み合わせて推論するプログラム
を明確に分けなくてはいけない。
→簡単に改善できるようにするため
・ユーザーが聞きたいこと
推論の結果を聞いた場合、
どのようなプロセスを経てその結論を得たのか?
・思ったほど楽じゃない
原理的には可能だが、
専門家の頭の中にある知識を
知識エンジニアが入力する作業がとても大変!
→専門家の技術を、機械がモニタを通して盗むほうが効率的!
機械学習とdata mining
実世界から得た大量のデータから法則性を発見する。
・応用例
遺伝子情報処理
セールスデータの解析-コンビニとか
ビール買った人はつまみも買う。
→商売のチャンスが生まれるかもしれない
cf.コンビニの法則
ビールとつまみを同じ棚に置かない。
同時に買うと分かっているものは、なるべきはなれたところに置く。
→他の品もかってもらうため。
クレジットカードの与信 cf. e-commerce
天体の識別。
コンピュータが識別できなかった場合は、新発見の可能性が高い。
機械の自動診断・自動運転
紙は状況により性質が変わる。
インクも同じ。
→輪転機は職人技だが、職人が減っていき、職人の需要が増えてきていることから
expert systemの需要が高まっている。
Can Machines Think?
哲学者によく議論される。とても微妙。
Can machines fly?
Yes, airplanes can fly!
おk
Can machines swim?
Yes, ships can swim!
???
???
そもそもflyとかswimでも
われわれの認識は微妙である。
→定義をしなくては議論が進まない!
Turing Test
Turingの同期:上記の問いを科学的名(well-definedな)ものにしたい
・排除したい答えの例
人間は一種の人造機械なのだからyes
thinkは人間固有の行為であるからno
→議論がつまらなくなる
The Alan Turing Home Page
Who was Alan?
codebreaker = ドイツの暗号を破って貢献した。
strange visionary and a gay man.
1950, Turing test
Turing test - Imitation Game
男と女(同部屋)とsomeoneがチャットする。
最初の五分間ぐらいどちらかと話する。
次の五分間もう一方の人と話する。
女性は普通に話す。
男はなるべく女っぽく話す。
someoneが性別を見分けられたらsomeoneの勝ち
・次
someoneが男女とcomputerに順不同で5分間ずつチャットする。
見分けられたらsomeoneの勝ち。
2000年予測
10GBのメモリが乗ったstrageでimitation gameをやたら
3割以上不正解になるだろう。→当たってる?
大事なこと→プログラミング
Turing Test
"Computing machinery and intelligence"
5分間の会話では難しい。
自然言語をチャットだけで判断するのは難しいのでは?
Turing Testに勝つコンテストとかある
→生産性が無い?
知識のいろいろ
記号的でない知識→暗黙知
自分は分かるけど説明が難しいもの
EX自転車の乗り方、友達の顔
記号的名知識→形式知
言葉で説明できるもの
構成的な知識
方法を表現したもの
手続き型procedural = "how"の表現
例:逆行列を求めるプログラム
構成的でない知識
何であるかを表現したもの
宣言方:declarative = "what"の表現
例:逆行列の数学的な定義
これを聞いただけでは、
この授業でやりたいこと
howを言わなくても、コンピュータが推論でそこまで導いてくれる。
コンピュータは数値計算の需要から生まれた
コンピュータが登場すると、人間との類似性に注目して新たな使い方を考える人々が現れた。
→記号を扱う能力、具体的には、
・記号や記号の連鎖をコンピュータの中に気を駆使照り、読み出したり、変形したりする能力
・2つの記号が等しいかどうかの判別能力
記号Aと記号Bが同じかどうかを判断する処理をcomputerにもたせる
宣言的な知識:
"いとこ"って言葉を知らない人がいたとする。
家計図をinputさせて、この人はいとこかどうかを判断させる。
そのためには、定義を入れる必要がある。
コンピュータの中には記号を入れる。
記号=単語
名前の付け方には任意性がある。
例:12 vs. ⅩⅡ vs. twelve
りんごなら、りんごを表す概念があり、
りんごを表す記号自信がある。
動詞は名詞ではないが、"動詞"は名詞
""が付いている場合と付いていない場合では違う意味になる。
例:グ
レープフルーツはグレープとフルーツに分けられるか?
ばらしてしまってはそのものの意味がなくなってしまう。
動詞→動と詞では意味が伝わらない。
記号のつづり
記号≒単語
記号とは、概念をつけた名前のこと
記号を組み合わせることによって、より複雑な概念を表すことができる
単語動詞は相互に関係している
辞書:単語同士のポインターが張られている。
↑こんなようなことをコンピュータの中でやりたい!
単語は同じか違うか区別できれば良い。
javaのオブジェクトとかポインターに似ている。
中身はどうでもいい。何を指しているかが重要。
モデル化と解釈
問題→モデル化→プログラムデータ→計算結果→解決
物体の配置、光線状態→モデル化された物理状態と物理法則→二次元画像→情景
ソクラテスは人間、人間は皆死ぬ
計算機で記号を扱うための基本機能は
同意知性の判定
記号構造の形成と操作
記号のつづりは入出力用、内部の処理では使わない。
コンピュータが推論の作業をするときに使う。
同一性の判定が高速にできればよい。
Cf. heap
りんごが2回目にきたときには、オブジェクトへの参照を返す。
アドレス比較だけで済む。
外部から読み込んだ同一記号は常に同じ識別番号に変換される。
記号による知識表現
概念同士を関係付けることが知識表現の基本
現実世界での概念間の関係⇔計算機内での記号間の関係(link structure)
お互いに関係している。リンク構造で表現すればコンピュータの中で表現できる。
物理記号系(Newell an Simon)
6.5は自分で読むこと!
Ocamlという言語は物理記号系
今日の目標
知識をコンピュータに入れるとはどういうことなのか?
記号的名知識→構成的な知識、構成的でない知識。
辞書にはソートする方法とかは載ってない。
宣言的な知識が乗っている。
どういう風にコンピュータに入れればよいのか?
・個別的な知識 辞書に出ない
Tom is the father of Liz.
Pam is female.
・一般知識(辞書に出る)
a mother is a parent who is female.
a grandmother is a mother of a parent.
an ancestor is either (i) a parent or (ii) a parent of an ancestor
↑これらはすべて論理学の言葉でもかける!
個別知識。
Tom is the father of Liz.
is_father_of(tom, liz)
Pam is female.
is_female(pam)
特徴→述語 主語 目的語(目的格)
固有名詞が出現
単文
Tom and Liz and Pamなどの固有名詞は小文字からはじめる。
・一般知識
A mother is a parent whoo is female.
X is the mother of ' if X is a parent of Y and X is female.
is_mother_of(X,Y) ←
is_parent_of(X,Y) ∧ is_female(X)
A grandmother is a mother of a parent.
is_grandmother_of(X,Y) ←
is_mother_of(X,Z) ∧ is_parent_of(Z,Y)
・∀X∀Y(~~~)が抜けている!
→X,Y,Zという単語は全ての事象に対して成り立つという暗黙の了解がある
prologとは
PROgramming in LOGic = prolog
if文とは結論を実行するために、論理式を読む?
ocamlよりはるかに安定している処理系
-----------------------------------------------
レポートについては来週説明 5/8まで
主張1:「コンピュータが知的名はずが無い(P1),だって、プログラムされたことしか出来ない(Q1)のだから」
Q1は正しいか?Q1はP1を含意するか?
主張2:「人間が知的名はずが無い(P2),だって、遺伝子に組み込まれたことしか出来ない(Q2)のだから」
Q2は正しいか?Q2はP2を含意するか?
以上に関する自分の意見をレポートにまとめて提出。領主超の関係をよく分析してください。
主張1と主張2は全く同じ格好をしている。
同じロジックなら同じ答えになるはず。
答えが違っていたらどこかで言葉の認識のズレがある。
登録:
投稿 (Atom)