Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ゆとりが数週間でC++を  始めるようです  えりっく さーとる
すみません 数週間もやってないです
ゆとりが数日間でC++を  始めるようです  えりっく さーとる
ゆとりが数日間でC++を         始めるようです•    えりっく さーとる(@siritori)•    ここの情報科学類2年生•    C++わかんない•    論理やったり(Alloy)•    分散しようとしたり(Erlang)...
ゆとりが数日間でC++を         始めるようです•    水曜日(23日)から勉強開始•    C++歴 : 3日•    コケたとことか挙げてみます•    勉強がてら作ったものとか紹介します
なんで勉強始めたの•  Boost勉強会のためだけじゃない•  いろいろCで書くの好きなんだけど –  型がガバガバで書いてて不安 –  C99に走ったもののそろそろ我慢の限界 –  staticでnamespace絞って –  関数ポインタで...
なんで勉強始めたの•  Boost勉強会のためだけじゃない•  いろいろCで書くの好きなんだけど –  型がガバガバで書いてて不安 –  C99に走ったもののそろそろ我慢の限界 –  staticでnamespace絞って –  関数ポインタで...
つらかった ところ その1
「使うな!」  っていう仕様が大杉   把握してるだけでも   ・auto_ptr   ・独立参照   ・const_cast   ・protected
「使うな!」  っていう仕様が大杉   把握してるだけでも   ・auto_ptr   ・独立参照   ・const_cast   ・protected   お前は   ハウルの動く城か
つらかった ところ その2
「これでもか!!」 ってくらいのエラーメッセージ    ちょっと間違えた    だけじゃん(́;ω;`)    そりゃ、メッセー    ジは細かいほうが    いいけどさ...
とりあえず•  2日で『独習C++』を読み終えた•  『C++ Coding Standards』をさらっと   だけ読んでわかった気になった•  なんかいい題材無いかな...•  JavaもどきじゃなくてちゃんとC++でき   るなにかがいい...
とりあえず
とりあえず
で。•  「論理と形式化」という大学の講義のプ   リントを偶然発見。•  ふと証明木に目が行く。• うん。これ書こう。
で。•  「論理と形式化」という大学の講義のプ   リントを偶然発見。•  ふと証明木に目が行く。• うん。これ書こう。
自然演繹法(Natural Deduction)?
自然演繹法(Natural Deduction)?•  すみません調子乗りました•  9つの規則に基づく証明理論の手法•  プログラミング言語の型システムとかはこ   れで論じるとわかりやすいんだとか•  命題論理に対応する自然演繹の体系NKを...
証明木の例  こやつを証明したい      とするA∧B⇒B∧A
証明木の例          仮定aからB Aが導け          ればOK[a:A∧B]	⊃I,a	         A∧B⇒B∧A
証明木の例                   A BなんだからBは成                   り立つよね        [a:A∧B]	∧E2	           B	        ⊃I,a	                 ...
証明木の例A BなんだからAは成り立つよね          [a:A∧B]	 [a:A∧B]	  ∧E2	            ∧E   1	             B	       A	          ⊃I,a	          ...
証明木の例           BもAも成り立つから、           B Aっていえるよね   [a:A∧B]	 [a:A∧B]	∧E 2	            ∧E              1	          B	       ...
証明木の例   [a:A∧B]	 [a:A∧B]	∧E 2	            ∧E              1	          B	        A	 ∧I	      ⊃I,a	               B∧A	      ...
で、なにをつくるの•  ゴールと仮定があって、それに規則を適用   する感じのsomethingをつくる•  Coqの超絶劣化版•  自動証明器まではさすがにぼくの技量と時   間ではどうしようもありませんでしたorz
設計•  命題を表すPropクラス•  証明を表すTheoremクラス•  規則たちをまとめたnamespace, Rule•  PropもTheoremも挿入子(<<)が使えるよ   うに書く•  Theoremは仮定と結論からなる•  仮定...
Propclass	 Prop	 {public:	 	 	 virtual	 PropType	 type()	 const	 =	 0;	 	 	 friend	 ostream	 &operator<<(ostream	 &stream,...
PropOrProp	 :	 public	 Prop	 {	 	 	 const	 Prop	 *lp_;	 	 	 const	 Prop	 *rp_;public:	 	 	 explicit	 OrProp(const	 Prop	 *...
Theorem•  ちょっと複雑なのでコード割愛•  仮定(Asp)と結論(Con)を受け取るコンス   トラクタ何種類か用意 –  ハイチュウ排中律とか –  右と左の仮定のマージとか –  仮定単体とか•  もうポインタ嫌い(́;ω;`)
Rule•  Theoremとなにかを受け取って新しい   Theoremを返すなにか•  Aの証明とBの証明を受け取ってA Bとい   う結論の証明を返す   Theorem *and_intro(Theorem *t1,   Theorem...
で、どんなのできたのTheorem	 *a	 =	 new	 Theorem(	 	 	 new	 AndProp(	 	 	 	 	 	 new	 AtomicProp(A),	 new	 AtomicProp(B)	 	 	 ),a);co...
で、どんなのできたのTheorem	 *a	 =	 new	 Theorem(	 	 	 new	 AndProp(	 	 	 	 	 	 new	 AtomicProp(A),	 new	 AtomicProp(B)	 	 	 ),a);co...
で、どんなのできたのTheorem	 *a	 =	 new	 Theorem(       [a:A B]から	 	 	 new	 AndProp(                 BとAを導く	 	 	 	 	 	 new	 AtomicPr...
で、どんなのできたのTheorem	 *a	 =	 new	 Theorem(	 	 	 new	 AndProp(	 	 	 	 	 	 new	 AtomicProp(A),	 new	 AtomicProp(B)	 	 	 ),a);co...
で、どんなのできたのTheorem	 *a	 =	 new	 Theorem(	 	 	 new	 AndProp(	 	 	 	 	 	 new	 AtomicProp(A),	 new	 AtomicProp(B)	 	 	 ),a);co...
実行するとTheorem	 *a	 =	 new	 Theorem(	 	 	 new	 AndProp(	 	 	 	 	 	 new	 AtomicProp(A),	 new	 AtomicProp(B)	 	 	 ),a);cout	 <...
実行するとTheorem	 *t1	 =	 Rule::and_elim2(a);cout	 <<	 t1	 <<	 endl;Theorem	 *t2	 =	 Rule::and_elim1(a);cout	 <<	 t2	 <<	 endl;
実行するとTheorem	 *t3	 =	 Rule::and_intro(t1,	 t2);cout	 <<	 t3	 <<	 endl;
実行するとTheorem	 *con	 =	   Rule::implication_intro(t3,	 a);cout	 <<	 con	 <<	 endl;
仮定なしで導けた→証明完了                                  ,.へ 	   ___                             ム  i 	  「 ヒ_i〉                     ...
おぼえたこと•  演算子オーバーロードってすごい –  泣きながら関数定義してたCがバカみたい•  clang++の優しさに泣く –  ありがとう、キミのお陰でめげずにいられた•  すみません... constを前置してすみません...•  い...
で、結局のところBoostは使ってないの?
ご清聴ありがとうございました(ノ)・ω・(ヾ)   https://gist.github.com/2782220大々的に添削していただけるととても嬉しいです!
ゆとりが数週間でC++を始めるようです
Upcoming SlideShare
Loading in …5
×

ゆとりが数週間でC++を始めるようです

3,436 views

Published on

Boost勉強会@つくば で発表したときの資料です

Published in: Technology
  • Be the first to comment

ゆとりが数週間でC++を始めるようです

  1. 1. ゆとりが数週間でC++を 始めるようです えりっく さーとる
  2. 2. すみません 数週間もやってないです
  3. 3. ゆとりが数日間でC++を 始めるようです えりっく さーとる
  4. 4. ゆとりが数日間でC++を 始めるようです•  えりっく さーとる(@siritori)•  ここの情報科学類2年生•  C++わかんない•  論理やったり(Alloy)•  分散しようとしたり(Erlang)•  自然言語処理しようとしたり•  こういうタイトルで発表するのって どうかと思いますよねorz
  5. 5. ゆとりが数日間でC++を 始めるようです•  水曜日(23日)から勉強開始•  C++歴 : 3日•  コケたとことか挙げてみます•  勉強がてら作ったものとか紹介します
  6. 6. なんで勉強始めたの•  Boost勉強会のためだけじゃない•  いろいろCで書くの好きなんだけど –  型がガバガバで書いてて不安 –  C99に走ったもののそろそろ我慢の限界 –  staticでnamespace絞って –  関数ポインタで柔軟に書いて –  もう...ゴールしてもいいよね...•  それに「C++書けます!」って
  7. 7. なんで勉強始めたの•  Boost勉強会のためだけじゃない•  いろいろCで書くの好きなんだけど –  型がガバガバで書いてて不安 –  C99に走ったもののそろそろ我慢の限界 –  staticでnamespace絞って –  関数ポインタで柔軟に書いて –  もう...ゴールしてもいいよね...•  それに「C++書けます!」って
  8. 8. つらかった ところ その1
  9. 9. 「使うな!」 っていう仕様が大杉 把握してるだけでも ・auto_ptr ・独立参照 ・const_cast ・protected
  10. 10. 「使うな!」 っていう仕様が大杉 把握してるだけでも ・auto_ptr ・独立参照 ・const_cast ・protected お前は ハウルの動く城か
  11. 11. つらかった ところ その2
  12. 12. 「これでもか!!」 ってくらいのエラーメッセージ ちょっと間違えた だけじゃん(́;ω;`) そりゃ、メッセー ジは細かいほうが いいけどさ...
  13. 13. とりあえず•  2日で『独習C++』を読み終えた•  『C++ Coding Standards』をさらっと だけ読んでわかった気になった•  なんかいい題材無いかな...•  JavaもどきじゃなくてちゃんとC++でき るなにかがいいな...
  14. 14. とりあえず
  15. 15. とりあえず
  16. 16. で。•  「論理と形式化」という大学の講義のプ リントを偶然発見。•  ふと証明木に目が行く。• うん。これ書こう。
  17. 17. で。•  「論理と形式化」という大学の講義のプ リントを偶然発見。•  ふと証明木に目が行く。• うん。これ書こう。
  18. 18. 自然演繹法(Natural Deduction)?
  19. 19. 自然演繹法(Natural Deduction)?•  すみません調子乗りました•  9つの規則に基づく証明理論の手法•  プログラミング言語の型システムとかはこ れで論じるとわかりやすいんだとか•  命題論理に対応する自然演繹の体系NKを 実装する。•  ※ガチ勢じゃないのであんまり突っ込ま ないで下さい(́・ω:;.:...
  20. 20. 証明木の例 こやつを証明したい とするA∧B⇒B∧A
  21. 21. 証明木の例 仮定aからB Aが導け ればOK[a:A∧B] ⊃I,a A∧B⇒B∧A
  22. 22. 証明木の例 A BなんだからBは成 り立つよね [a:A∧B] ∧E2 B ⊃I,a A∧B⇒B∧A
  23. 23. 証明木の例A BなんだからAは成り立つよね [a:A∧B] [a:A∧B] ∧E2 ∧E 1 B A ⊃I,a A∧B⇒B∧A
  24. 24. 証明木の例 BもAも成り立つから、 B Aっていえるよね [a:A∧B] [a:A∧B] ∧E 2 ∧E 1 B A ∧I ⊃I,a B∧A A∧B⇒B∧A
  25. 25. 証明木の例 [a:A∧B] [a:A∧B] ∧E 2 ∧E 1 B A ∧I ⊃I,a B∧A A∧B⇒B∧A
  26. 26. で、なにをつくるの•  ゴールと仮定があって、それに規則を適用 する感じのsomethingをつくる•  Coqの超絶劣化版•  自動証明器まではさすがにぼくの技量と時 間ではどうしようもありませんでしたorz
  27. 27. 設計•  命題を表すPropクラス•  証明を表すTheoremクラス•  規則たちをまとめたnamespace, Rule•  PropもTheoremも挿入子(<<)が使えるよ うに書く•  Theoremは仮定と結論からなる•  仮定が無しで結論が言えたらQ.E.D
  28. 28. Propclass Prop {public: virtual PropType type() const = 0; friend ostream &operator<<(ostream &stream, const Prop *p) { return p->print(stream); } private: virtual ostream &print(ostream &stream) const = 0;};
  29. 29. PropOrProp : public Prop { const Prop *lp_; const Prop *rp_;public: explicit OrProp(const Prop *lp, const Prop *rp):lp_(lp),rp_(rp){}private: ostream &print(ostream &stream) const { if(OR >= lp_->type()) stream << "(" << lp_ << ")"; else stream << lp_; stream << " ∨ "; if(OR > rp_->type()) stream << "(" << rp_ << ")"; else stream << rp_; return stream; } };
  30. 30. Theorem•  ちょっと複雑なのでコード割愛•  仮定(Asp)と結論(Con)を受け取るコンス トラクタ何種類か用意 –  ハイチュウ排中律とか –  右と左の仮定のマージとか –  仮定単体とか•  もうポインタ嫌い(́;ω;`)
  31. 31. Rule•  Theoremとなにかを受け取って新しい Theoremを返すなにか•  Aの証明とBの証明を受け取ってA Bとい う結論の証明を返す Theorem *and_intro(Theorem *t1, Theorem *t2) とかいうの書きました
  32. 32. で、どんなのできたのTheorem *a = new Theorem( new AndProp( new AtomicProp(A), new AtomicProp(B) ),a);cout << a << endl;Theorem *t1 = Rule::and_elim2(a);cout << t1 << endl;Theorem *t2 = Rule::and_elim1(a);cout << t2 << endl;Theorem *t3 = Rule::and_intro(t1, t2);cout << t3 << endl;Theorem *con = Rule::implication_intro(t3, a);cout << con << endl;
  33. 33. で、どんなのできたのTheorem *a = new Theorem( new AndProp( new AtomicProp(A), new AtomicProp(B) ),a);cout << a << endl;Theorem *t1 = Rule::and_elim2(a);cout << t1 << endl; [a : A B]をつくるTheorem *t2 = Rule::and_elim1(a);cout << t2 << endl;Theorem *t3 = Rule::and_intro(t1, t2);cout << t3 << endl;Theorem *con = Rule::implication_intro(t3, a);cout << con << endl;
  34. 34. で、どんなのできたのTheorem *a = new Theorem( [a:A B]から new AndProp( BとAを導く new AtomicProp(A), new AtomicProp(B) ),a);cout << a << endl;Theorem *t1 = Rule::and_elim2(a);cout << t1 << endl;Theorem *t2 = Rule::and_elim1(a);cout << t2 << endl;Theorem *t3 = Rule::and_intro(t1, t2);cout << t3 << endl;Theorem *con = Rule::implication_intro(t3, a);cout << con << endl;
  35. 35. で、どんなのできたのTheorem *a = new Theorem( new AndProp( new AtomicProp(A), new AtomicProp(B) ),a);cout << a << endl; BとAからTheorem *t1 = Rule::and_elim2(a);cout << t1 << endl; B Aを導くTheorem *t2 = Rule::and_elim1(a);cout << t2 << endl;Theorem *t3 = Rule::and_intro(t1, t2);cout << t3 << endl;Theorem *con = Rule::implication_intro(t3, a);cout << con << endl;
  36. 36. で、どんなのできたのTheorem *a = new Theorem( new AndProp( new AtomicProp(A), new AtomicProp(B) ),a);cout << a << endl;Theorem *t1 = Rule::and_elim2(a);cout << t1 << endl; B Aと仮定aからTheorem *t2 = Rule::and_elim1(a);cout << t2 << endl; A B B Aを導くTheorem *t3 = Rule::and_intro(t1, t2);cout << t3 << endl;Theorem *con = Rule::implication_intro(t3, a);cout << con << endl;
  37. 37. 実行するとTheorem *a = new Theorem( new AndProp( new AtomicProp(A), new AtomicProp(B) ),a);cout << a << endl;
  38. 38. 実行するとTheorem *t1 = Rule::and_elim2(a);cout << t1 << endl;Theorem *t2 = Rule::and_elim1(a);cout << t2 << endl;
  39. 39. 実行するとTheorem *t3 = Rule::and_intro(t1, t2);cout << t3 << endl;
  40. 40. 実行するとTheorem *con =   Rule::implication_intro(t3, a);cout << con << endl;
  41. 41. 仮定なしで導けた→証明完了                                  ,.へ   ___                             ム  i  「 ヒ_i〉                            ゝ 〈  ト ノ                           iニ(()  i  {              ____           |  ヽ  i  i           /__,  , ‐-\           i   }  |   i         /(●)   ( ● )\       {、  λ  ト‐┤.      /    (__人__)    \    ,ノ  ̄ ,!  i   ゝ、_     |     ´ ̄`       | ,. ´ハ   ,! . ヽ、    `` 、,__\              /" \  ヽ/    \ノ ノ   ハ ̄r/:::r―--―/::7   ノ    /        ヽ.      ヽ::〈; . ::. : |::/   /   ,. "         `ー 、    \ヽ::. ;:::|/     r"      / ̄二二二二二二二二二二二二二二二二ヽ      |   |  動作確認                │|      \_二二二二二二二二二二二二二二二二ノ
  42. 42. おぼえたこと•  演算子オーバーロードってすごい –  泣きながら関数定義してたCがバカみたい•  clang++の優しさに泣く –  ありがとう、キミのお陰でめげずにいられた•  すみません... constを前置してすみません...•  いろんな書き方ができるせいで流儀を身に 付けるまでに結構な時間がかかりそう•  闇の軍団の人たち優しい(何度も助けられ ながらお勉強しました)
  43. 43. で、結局のところBoostは使ってないの?
  44. 44. ご清聴ありがとうございました(ノ)・ω・(ヾ) https://gist.github.com/2782220大々的に添削していただけるととても嬉しいです!

×