やろーじだい

ブログです

Aizu SICP 第一回

 昨日は第一回 Aizu-SICP (読む会) を行った。 10 人集った。

タイムテーブル

  • 19:05 ~ 19:25: 読 P1~9 「1.1.3 組み合わせの評価」 前まで
  • 19:25 ~ 19:40: 質疑
  • 19:45 ~ 20:15: 読 P10~22 「1.1.7 ニュートン法による平方根」 前まで
  • 20:20 ~ 20:55: 質疑

読書内容

 参加者の @mizuki_sonoko さんが読んだ範囲をリアルタイムでまとめていたので貼る。 SICPを読む会に参加した
 練習問題に関しては,次回の読む会で答え合わせをするので簡単なコメントに留める。

1 手続きを用いた抽象化の構築

 計算プロセスについて学習して行く。プロセスは抽象的な存在であり別な抽象物であるデータを操作する。これはプログラング言語によって記号的表現で組み立てられる。そのプログラング言語には Lisp を用いる。

Lisp がメインストリームの言語でないとしたら、なぜそれをプログラミングの考察のための枠組みとして使うのでしょうか。それは、この言語が独特な特徴を持っているため、プログラミングの重要な構成とデータ構造について学び、それらを支える言語的特性と結びつけるのにとても便利な媒体だからです。 これらの特性の中でも最も意義深いものは、プロセスの Lisp による記述 (これは手続き (procedure) と呼ばれます) が、それ自身 Lisp のデータとして表され、 操作できるということです。これが重要なのは、“受動的な” データと “能動的 な” プロセスという伝統的な区別を曖昧にする能力を使った強力なプログラム設計のテクニックが存在するからです。これから見ていくように、Lisp は手続きをデータとして扱う柔軟性のおかげで、これらのテクニックを探求するのに 最も便利な言語のひとつになっています。手続きをデータとして表現する能力は、コンピュータ言語を支えるインタープリタコンパイラのような、ほかの プログラムをデータとして操作しなければならないプログラムを書くのにも、 Lisp をとても優れたものにしています。それに、こういったことを考えに入れなくても、Lisp でのプログラミングは本当に楽しいのです。

1.1 プログラミングの要素

 強力な言語は,3つのメカニズムである基本式・組み合わせ方法・抽象化方法がある。基本式は言語によって提供されている数値や関数などで,組み合わせと抽象化方法は基本式を組み合わせ,それに対して名前を付けるということが最も単純な例だと考えられる。

1.1.1 式

 特になし。

1.1.2 命名と環境

 値という単語からはイメージしづらいが, Lisp では手続きも値である。  変数と値はただのペアであり,変数は箱のようなものではない。

1.1.3 組み合わせの評価

 Lisp の基本は (f a1 a2 ... an) という式に対して,まず f を評価して手続きを取り出し,a1 a2 ... an を順に評価した結果を手続きに渡す。特殊形式はこの評価の規則に沿わないものである。

1.1.4 複合手続き

 関数では外の環境を引きついで,仮引数の名前を使ってローカルな環境を作成している。

1.1.5 手続き適用の置換モデル

 特になし。

1.1.6 条件式と述語

 and や or が特殊形式であることは注目する点である。これは C などと同様である。C における if( p1 && p2 ) で, p1 が偽だった場合は p2 は実行されない。

練習問題 1.1

 特になし。

練習問題 1.2

 特になし。

練習問題 1.3

 特になし。

練習問題 1.4

 式が手続きを返す例である。

練習問題 1.5

 if の評価規則が非常に重要である。

質疑まとめ

 以下は決められた範囲を読んだ上でその後疑問点を誰かが挙げ,誰かが答えるという形で質疑応答を行った。読んだ部分の内容だけでなく LispScheme に関する話が多かった。現状の知識でのやりとりであるため間違いが含まれている可能性が高い。また,ここではの話題はあくまで Scheme における話,さらには Racket 特有の話である場合があり Lisp 全般に共通するとは限らない。(Scheme 特有の話としては #t#f が,Racket 特有の話としては #<void> などが良い例である。)

  • difine とは何か? 関数?

 特殊形式であり関数ではない。 (多分) マクロで定義されており,グローバル環境に値とシンボルの組み合せを追加するようなもの。特殊形式自体は値を持たない。(> define) また評価規則が通常とは違っている。特殊形式には処理系によって提供されているもの (if など) の他に,マクロを用いることで作成できる。つまりマクロは評価規則を操作できると考えることができる。

  • ここでいう式とは?

基本的な式のひとつとして,数値があります
基本的な手続きを表す式 (例えば +*) と組み合わせることで複合式を作り P6

  • Racket とは何か?

Racket is a full-spectrum programming language. It goes beyond Lisp and Scheme with dialects that support objects, types, laziness, and more. Racket enables programmers to link components written in different dialects, and it empowers programmers to create new, project-specific dialects. Racket's libraries support applications from web servers and databases to GUIs and charts. http://racket-lang.org/

 私は Scheme の処理系のひとつという認識だったが,「Scheme の仕様を満たした上で拡張された別な言語」という認識の方が正しいかもしれない。

  • definecond 式で条件に当てはまらなかった場合はなにを返しているのか

 Racket では #<void> というものを返しているようだ。参考 Scheme の仕様上, #f 以外は全て真として扱われるため注意が必要な場面があることが予想できる。

  • 適用順序評価と遅延評価は同じものであるか?

 正規順序評価の方が遅延評価に近いものである。ただし全くのイコールではない (はずである)。この辺りの理解は正確でない。遅延評価は引数の評価を遅らせることを指し,正規順序評価はある式を,ある一つの値まで評価する際の流れを定義したものだと考えている。

  • 環境とは?

値と記号を関連づけ,後から取り出すことができるということは,名前とオブジェクトのペアを記録しておくために何らかのメモリを持っておかないといけません。このメモリは環境 (environment) と呼ばれます P9

  • +-define することは可能か?

 Lisp における +- というのは,ひとつの名前とオブジェクトの組み合わせにすぎないため容易に可能である。ただしインタプリタ上で (define + -) を行った場合,他で + の処理を別な名前で定義していなかった場合 ((define sum +)など) インタプリタの再起動が必要になると思われる。

  • #t#f とは

 0 や 9と同じような定数であり,それぞれ真・偽を表すものであり,インタプリタ> #t とすると #t と評価される。Scheme では #f 以外は全て真として扱われることに注意をする必要がある。また,(#f)インタプリタに渡したところエラーが出たという話がでたが,Lisp では (f a1 a2) のように括弧で渡した場合は最初の f の値は手続きでなければならない。

 できるようである。http://d.hatena.ne.jp/reinyannyan/20100624/p1

  • 角括弧は使える?

 Scheme では角括弧は丸括弧と同じく使用できる。

読書会進行方法と感想

  •  まず私が適当にページを決め Slack にその範囲と終了時間を書き,全員で同時に黙読を始めた後,終了した人はその Slack に Add reaction するという形で進行した。その Slack のチャンネルはこれのためだけにひとつ用意することで, Add reaction では通知が行かず,周りの進行状況を気にせず読むことができる。ただ Add reaction を忘れると進行に影響がでるので,必ず忘れないようにすることを直前に注意した方がよい。
  •  この日は読書中の質問は出なかったが,読書中の発言も可とした。ただ,それ以降を読み進めること影響がでる疑問でなければ,範囲の終了後に質問する方が全員しっかり会話に参加できるので良いかと思った。
  •  質問者は,自分の質問とそれへの解答を簡単にまとめたものを Slack に記入するようにした。これは純粋に,読書会におけるもっとも価値のある議論・会話を記録することと,その日に参加することができなかった人たちへの共有のためであり,少々手間ではあるが必ず行うべきたと感じた。
  •  疑問に対する返答で少し自分が出しゃばりすぎた。質問とそれへの解答は手を挙げてから話しをするようにした方が良いかもしれない。
  •  ある疑問に対して,「それはここに書いてあるのでは?」と指摘してもらえることは読書会の利点のひとつだと感じた。しっかり読んでいるつもりでも無意識に読み飛ばしてしまっているところを補完することができた。

Aizu SICP - Aizu Advent Calendar 2015

挨拶

 Aizu advent calendar 一日目を担当します @cl_yaho です。
明日は @stringamp さんによる ストレスフリーな進捗生成のために - stringamp's blog です。

SICP 読む会 in Aizu

 大学生の内に読破したい本 No.1 に輝いた SICP を読む会を会津大学で行います。以下ではその具体的な方法などを挙げます。興味ある方はぜひ記事の最後の atnd より参加登録をしていただければと思います。

SICP とは

 見付けたスライドを利用します。 SICPの紹介
 今回は上で紹介されている id:minghai さんによる翻訳ではなく,今年の 10 月末に id:takeda25 さんによって新しく翻訳されたものを使用します。sicp-pdf

形式や注意

 まず私は今回の読書会が始めての主催・参加となります。更に通常の読書会とは異なり主催者の私も未読の状態となります。そのため時間の配分・進め方など思考錯誤しながら進めていくことになり,スムーズに進行させることは難しいことが予想できます。
 今回の読書会は主に私が未読という理由からエクストリームリーディングを採用します。正確な定義はわかりませんが,こちらのスライドで書かれている流れで行います。IT技術系書籍読書会のしおり エクストリームリーディングという単語は次のブログでほとんど同様な方式で行う読書会に対して使用されていました。 読書会(エクストリームリーディング)を開催 この方式は輪講形式などとは違い,毎回担当者などを設定して事前に準備をする必要が無いため,参加者の負担が少なく気軽に参加することができるという利点があります。すでに読んだ方が誰もいない状況で全員で同時に読み解いていく形になるため,ページあたりの必要な時間はかなり増えるという短所もありますが,これに関しても実際にその場で時間をかけて議論ができるという利点と見ることも可能でしょう。
 このエクストリームリーディングを採用するにあたって人数はある程度少ない方が良いとのことですが,種々の理由から途中で来れなくなる方もいることを考慮して最大 10 名としたいと思います。また,参加したいが今年で卒業してしまうという方がいることがわかったため,この読書会で利用する Slack のみへの参加も可能とします。Slack にはできる限りそれを読んだだけでもある程度流れがわかるように読書会中のやりとりなどを記録したいと思います。それにより,急遽参加できなかった場合でもそれを見ながら欠席分を補うことも狙いです。また毎回ブログなどでその日の内容をまとめたいと考えています。
 興味がある方・参加希望者は Slack へ招待を送るため s1200191@u-aizu.ac.jp までお手数ですがメールを送ってください。(その内自動ログインを可能にしたいと思っています。) Slack には無制限に誰でも (会津の方以外でも) 参加可能にしたいと思います。メールのタイトルに [Aizu-SICP] と付けていただければ空メールで問題ありませんのでお願いいたします。
 連絡などは以降すべて Slack で行います。

追記:  会津大学内のネットワークなどを利用するため,参加者は会津大生に限ります。

日程 (予定)

  • 来週 12/10 (木) の夜
    希望者で集まり,その後読書会を行う頻度やどの曜日のどの時間が良いかなどを話し合う。
  • その翌週より
    設定した日付で実際に読書会を行う。年末前に一度くらいやっておきたい。
  • 終了予定
    全く未定。

atnd

少し雑に書いてしまったので,何かあればメールまたは Twitter にお願いします。

参考資料・サイト

SICP 読書ノート - 目次
IT技術系書籍読書会のしおり
非公式PDF版SICPの全訳を公開しました
sicp-pdf

留学 23-26 日目と会津向け告知

日常

  • 23 日は大雨で大変だった。折り畳み傘だけではだめだった。
  • オンラインで Markdown を管理するために個人で esa.io を利用し始めた。(\( ⁰⊖⁰)/)
  • チーム向けのものだがフォルダの管理などが便利そうだったので使ってみた。Blog の下書きやメモに使っている。
  • 現実世界の紙以上にデータの管理は難しいく面倒なので,階層やテンプレート機能などとても助かる。
  • 教授がポルトガルに到着したが,会話中の英語を助けてくれるわけではないのでつらさが増した。
  • 殆ど留学が関係ない記事になってきている。

これからの豊富

  • 自分に最も必要なこと (統計処理や機械学習) については Clojure でここ1, 2年で良さそうな本が出ているし,Common Lisp でもできるので,ひとまず 1 年間この二つ集中してみようと思っている。
  • SICP に向けてちょっと Scheme もやる。
  • Lisp が吐くバイトコードを読みたいというのと,後期の OS 論の TA をやるので復習したいというモチベーションから初めて読む 486パタヘネを読んでいる。
  • ソフトウェアの基礎は年単位で少しづつ進める。

研究

  • 留学もラストの二週間となり,教授の持っている実際のデータを使った ILP の実験を始めた。
  • 具体的には人の生体組織検査 (biopsy) の結果などを数値化したもの。
  • ひとまず課題のような形で,何か新しいことを考えたわけではないので,研究というよりは学習という感じになった。
  • 今後発展させるかもしれないし,どうなるかは今一見通しが立っていない。
  • 午前と寝る前は完全に個人的なこと。昼から夜にかけては研究という感じで毎日過している。
  • 今一うまくいっていない。

告知

 後期 (11 月頃予定) から前期から計画していた会津 SICP 読む会を開く予定です。1 年以上かかる計画のため参加者が少ないと思いますが,個人ではなくイベントとして行うことで定期的に取り組むことを強要することが主な目的です。具体的な形式などは後程別な記事かそのまま atnd を立てて詳細を書きますのでそちらからどうぞ。またメールなどいただければ募集開始の旨をメールします。s1200191@会津 まで。会場は会津大学を利用する予定なので,インターネットなど大学のものを利用できる人に限ります。

留学 17-22 日目

日常

  • 謎のテンションで Amazon で本を買いまくって読みまくっている。買う速度 >>>> 読む速度という状況なので反省したい。
  • 自制心が無いので Kindle に踊らされている。こっちに来てから 2 万円ほど使った。反省したい。
  • 別な大学からの文学部への日本人留学生二人と話した。一年間の単位互換留学らしい。
  • 週末に船のツアーに行ったり,ポルトワインを飲んだりした。

Lisp

  • 今の今まで違うネームスペースのシンボルが eq で nil になることを知らなかった。キーワードを使うべきところでなぜか間違えてシンボルを使ってしまい,それに長いこと気がつかず時間をつぶした。
  • パターンマッチを書くときは,ちゃんと otherwise ケースを書いた方が結果的に無駄な時間の浪費を防げる可能性が高い。
  • ILP システムである Aleph で適用するためにデータを Prolog にするコードを書く必要があり,予想外に,こっちに来てから Common Lisp ばかり書いてる。

研究

  • Aleph の仕組みを理解するのは大変なので,とりあえずツールとしてみることになった。
    • Prolog で表現したデータベースから,ある規則を導くための機械学習ツールだ。
    • SVM や ELM などの 2 クラス分類でよく使われる他の分類器と比べた時の違いは,決定境界が具体的 (判別基準を言葉で説明可能) であること。
  • 決定境界の具体化?のようなことをメインに今後の研究を進めたいと考えている。
    • 決定境界の具体化ができると,過去のデータから判断基準を作ることができ,様々な応用が考えられる(と思う)。
      • 医療系ではこの症状がある場合はこの病気の危険性が高いので病院に行って精密な検査を行った方が良い。さらにこの症状もある場合は危険度が増すなど。
      • 肝心の情報系の適用方法が思いつかなかった。
  • ポルトガルの知り会いの学生が殆ど博士課程であることや,教授と話しをする機会が多かったため博士課程についていろいろな情報を得た。その結果,海外での博士課程を目指す選択肢もありだと考え始めた。
    • まず金銭的な面で博士は選択肢に無かったのだが,こちらでは給料を基本的に貰えること,日本の奨学金も合わせて使えるかもしれないことなど,奨学金を貰えればその心配がほとんど無いとわかり,今後の選択肢が増えて良かった。
    • 留学による意識の向上による一時的なものかもしれないので一年ほどしっかり考えたい。

写真

  • 修学旅行である。

f:id:lhcpr:20150913022239j:plain f:id:lhcpr:20150912235517j:plain f:id:lhcpr:20150913004252j:plain f:id:lhcpr:20150912235523j:plain

留学 14,15,16 日目

日常

  • こちらに来てから二週間以上が過ぎた。残りは約三週間である。
  • 留学は慣れた頃に終わるという話しをよく聞くが,寮は一人部屋・買い物には特に困らない・研究室に自由に出入りできるなど日本にいる時と大きな差が殆どないので,単純に初めての環境に来たという程度の緊張感があるだけだった。この留学の中で一番緊張したのは一人で乗る飛行機だったと思う。(今も若干帰りの飛行機が心配だ。)
  • おいしいリゾットを食べれるところを見つけたので米を毎日食べることがきるようになった。こっちの人はあまりリゾットが好きではない人が多いような気がする。
  • ポルト大学で博士課程に行くと毎月千ユーロの給料が貰えるらしい。日本の学振みたいなものかと思ったけど普通に仕事の給料のように貰えるようだ。ただ,資料を少し探してみたが見つからなかった。
  • 土日も学校に来ていたと言うと結構本気で心配された。この土日は休むためにあるものという感覚は学生も教授も同じ雰囲気だった。忘れがちだが土日は休日である。
  • 何となく日本にいるときより色々なことをゆっくり考える時間が増えた気がする。原因はよくわからない。
  • インプットがかなり増えて,アウトプットをしようという気分が湧いてきた。Blog を書くようになったのと,前に増して紙にいろいろ書くことが増えたおかげか頭がすっきりしている。アウトプットは継続したいと思うが何度もそう思ってきてやめているのでなんとかしたい。
  • なぜか睡眠の習慣が日本にいるときよりも格段に良くなった。夜になにもなかった日は 23-24 時に寝て 5-7 時に起きている。頭がすっきりしているのはよく考えたらこれが理由かもしれない。

研究・プログラム

  • ILP の既存のデータセットへの適応の仕方・またその結果をみるために実験をしてみることにした。
  • 何か必要になったら Common Lisp で書いている。今はデータを Prolog に変換するプログラムを無理やり書いている。
  • 日本の大学では現在ペアで研究をしている状態で,その人も使う場合は Clojure を使っていた。 Leiningen さえ入れてもらえれば簡単に使ってもらえる。加えて単純に使ってみたかったという理由だった。
  • Roswell がある今簡単に環境が作れるので Common Lisp でも良い気がしてきたが,多分両方使い続ける気がする。
  • 最近になって C やアセンブリをもっと理解する必要があるのではないかという気がしてきている。今まで OS やアセンブリといった計算機科学?の基礎の部分に対する興味がなさすぎた。

留学二週間の英語を中心にした感想

 留学を英語を学ぶという目的で行くと楽しくないのでやめた方が良いという結論に至った。自分はほとんど英会話の経験が無かったため,今回の留学の狙いの一つに無理やり英語を使わざるを得ない状況に身を置くというのがあった。今日までの結果としては中学英語の文法 (正確に範囲を理解していないが) を理解していれば,旅行などの短期間の海外生活は何とでもなるという感覚を覚えた。なぜなら場面場面で質問される内容はある程度決まっており,もし完全に聞きとれなくても回りの状況から補完することができるからだ。しかし,普段の会話では,話を盛り上りあげるのが難しい・ジョークを聞きとれなかった時に聞きなおすのが申し訳ないなど,コミュニケーションが楽しめない場面が非常に多い。その結果会話に積極的にまざるのが億劫になってしまい,会話をする回数も減ってしまっている。なので,留学前にもう少し英語が余裕な状態にしておくべきだったと感じている。英語に慣れるという目的で海外に行く必要性は全くなく日本でも簡単にできたはずである。
 結果として英語をもっと本気でやろうという気になることができたので良い経験ができたとも考えられるが,事前にその気になって準備をしてから来た方が明らかに得るものは多かったし,何よりもっと日常生活を楽しめたと思う。もともと,自分はそういった毎日がんばるぞいというような感情を自分で起こすのが苦手なのでこれが目的ではあったのだが,今回は少し後悔している。

留学 11,12,13 日目とあの人の誕生日なので Lisp

日常生活

  • 異様におなかが空く。太りそう。
  • 研究室が時々学生の溜まり場になっている。元気な (声が大きい) 上,ポルトガル語なのでまったく何を言っているかわからないため日本語で ok という気分になってきた。
  • Summer School 一日目に参加した。Big Data に関する話で stream processing などのワードが多く出てきたり,Scala のライブラリなど紹介されていた。この辺の知識はさっぱり無いのでふむふむという感じだった。次は四日目に参加する。
  • 私より日本が好きな人がいっぱいいる。特にドラゴンボールの人気がすごい。ピッコロがサタンという名前になっていた。
  • るろうに剣心の名前が (少くとも) ポルトガルでは Samurai X になっていて笑った。
  • よく話に出てくるのはポケモンドラゴンボール・ナルト・ワンピース・るろうに剣心と大体予想通り。
  • 今日本で若者に人気なアニメは Charlotte ですと答えておいた。(見てない。)

プログラミング

研究

  • 指導教員が Summer School で忙しくここ三日反応を貰えていない
  • いろいろ課題・問題などをリストアップしている。
  • 今回勉強していることを自分の研究に適用しようと思っているが、これうまくいかないのでは?という感じが出てきた。
  • ;(

留学 7,8,9,10 日目

日常生活

  • もう 10 日経った。
  • 研究室への入出が普通の鍵で一本しかなく必要な時は警備の人に声をかけなければならない。会津大学は学生証がカードキーになっていて自由に開け閉めできるのでかなり面倒くさい。
  • ペドロという名前の人がとても多く日本でいう佐藤とかのような存在のよう。これまで知りあった人の内二人の学生と二人の教授がペドロさんだった (さらに自分が宿泊しているところの道路の名前にもペドロが含まれている。)
  • 指導してくれている教授とその息子さんと動物園のようなところに行った。私が一番楽しんでいた。http://www.parquebiologicodevinhais.com/
  • Big Data Summer School http://www.ecmlpkdd2015.org/summer-school/about が始まった。

英語

  • ンァー!
  • 英語の論文を読んで日本語で自分の言葉でまとめ,それを英語で説明するために英語でまとめなおすというのがすごくつらい。
  • 質問を何度も繰り返させてしまうのも本当につらい。

研究

  • 処理系は Yap Prolog を使う。SWI Prolog でもいいみたいだが Yap の方を指定された。
  • Induction Logic Prolgram (ILP) とは?

    • Induction concept learning のひとつで記述する言語に Logic Programming を利用しているもの。
    • ある背景知識 (複数の患者のデータ) を元にある事実の例 (この人はガン・この人はそうではない) を満すような,その判別の判断基準となる性質 (例えば年齢が何歳以上・体重がいくつ以上・ある症状があるかないかなど) の仮説を導き出す。
    • その仮説の導出には様々な手法がある。http://www.doc.ic.ac.uk/~shm/ilp.html
  • 今回の研究で ILP には Aleph (A Learning Engine for Proposing Hypotheses) というものを使う。

    • 約一万行からなる Prolog プログラムである。
    • 仮説の導出には Inverse Entailment を利用している。(理解していない。)
    • 背景知識 (filename.b)・真となる例 (filename.f)・偽となる例 (filename.n) の 3 つの Prolog で書かれたプログラムを利用する。
  • Aleph の流れ

    • 事実の例の中からひとつ選択する。
    • その例を満たす具体的な (多くの body からなる) 節を作る。"bottom clause" と呼ばれる。またこのステップ自体を "saturation" と呼ぶ。
    • Bottom clause よりも一般的な節を探す。これは bottom clause のリテラルのサブセットとなり、最もうまく事実の例に合致するものが選択される。このステップは "reduction" と呼ばれる。
    • 冗長性を取り除く。最も良いものは current theory に加えられ、他の例は取り除かれる。このステップは cover removal と呼ばれる。
  • 実行例

YAP 6.3.3 (i386-darwin14.4.0): 2015年 8月31日 月曜日 17時31分41秒 WEST
 ?-  % consulting /Users/iyahoo/Dropbox/Program/prolog/Aleph/aleph.pl...


A L E P H
Version 5
Last modified: Sun Mar 11 03:25:37 UTC 2007

Manual: http://www.comlab.ox.ac.uk/oucl/groups/machlearn/Aleph/index.html

 % consulted /Users/iyahoo/Dropbox/Program/prolog/Aleph/aleph.pl in module user, 49 msec 0 bytes
yes
 ?- read_all(family2).
 % reconsulting /Users/iyahoo/Dropbox/Program/prolog/Aleph/family2.b...
 % reconsulted /Users/iyahoo/Dropbox/Program/prolog/Aleph/family2.b in module user, 1 msec 0 bytes
[consulting pos examples] [family2.f]
[consulting neg examples] [family2.n]
yes
 ?- induce.
[select example] [1]
[sat] [1]
[grandparent(bob,laura)]

[bottom clause]
grandparent(A,B) :-
   father(A,C), mother(A,D), mother(D,B).
[literals] [4]
[saturation time] [0.0]
[reduce]
[best label so far] [[1,0,2,1]/0]
grandparent(A,B).
[4/5]
grandparent(A,B) :-
   father(A,C).
[4/2]
grandparent(A,B) :-
   mother(A,C).
[4/2]
grandparent(A,B) :-
   father(A,C), mother(A,D).
[4/2]
grandparent(A,B) :-
   mother(A,C), mother(C,B).
[2/0]
[-------------------------------------]
[found clause]
grandparent(A,B) :-
   mother(A,C), mother(C,B).
[pos cover = 2 neg cover = 0] [pos-neg] [2]
[clause label] [[2,0,3,2]]
[clauses constructed] [5]
[-------------------------------------]
grandparent(A,B) :-
   father(A,C), mother(A,D), mother(D,B).
[clauses constructed] [6]
[search time] [0.0020000000000000018]
[best clause]
grandparent(A,B) :-
   mother(A,C), mother(C,B).
[pos cover = 2 neg cover = 0] [pos-neg] [2]
[atoms left] [2]
[positive examples left] [2]
[estimated time to finish (secs)] [0.0020000000000000018]
[select example] [2]
[sat] [2]
[grandparent(bob,ken)]

[bottom clause]
grandparent(A,B) :-
   father(A,C), mother(A,D), father(D,B).
[literals] [4]
[saturation time] [0.0]
[reduce]
[best label so far] [[1,0,2,1]/0]
grandparent(A,B).
[2/5]
grandparent(A,B) :-
   father(A,C).
[2/2]
grandparent(A,B) :-
   mother(A,C).
[2/2]
grandparent(A,B) :-
   father(A,C), mother(A,D).
[2/2]
grandparent(A,B) :-
   mother(A,C), father(C,B).
[2/0]
[-------------------------------------]
[found clause]
grandparent(A,B) :-
   mother(A,C), father(C,B).
[pos cover = 2 neg cover = 0] [pos-neg] [2]
[clause label] [[2,0,3,2]]
[clauses constructed] [5]
[-------------------------------------]
[clauses constructed] [5]
[search time] [0.000999999999999987]
[best clause]
grandparent(A,B) :-
   mother(A,C), father(C,B).
[pos cover = 2 neg cover = 0] [pos-neg] [2]
[atoms left] [0]
[positive examples left] [0]
[estimated time to finish (secs)] [0.0]

[theory]

[Rule 1] [Pos cover = 2 Neg cover = 0]
grandparent(A,B) :-
   mother(A,C), mother(C,B).

[Rule 2] [Pos cover = 2 Neg cover = 0]
grandparent(A,B) :-
   mother(A,C), father(C,B).

[Training set performance]
         Actual
       +        - 
     + 4        0        4 
Pred 
     - 0        5        5 

       4        5        9 

Accuracy = 1.0
[Training set summary] [[4,0,0,5]]
[time taken] [0.00399999999999999]
[total clauses constructed] [11]
yes