世界を動かす技術を、日本語で。

プログラマーのための論理

概要

  • 本書は 数学ソフトウェア の関係に焦点を当てたプログラマ向けの実用書
  • 論理学 の基礎を使い、ソフトウェア設計や検証の手法を解説
  • 数学の予備知識は不要、 中級以上のプログラミング経験者 向け
  • PDF・EPUB でDRMフリー、Amazonでも購入可能
  • 実践例と理論 の両方をバランス良く収録

プログラマのための論理的ソフトウェア設計入門

  • 数学ソフトウェア、その相互作用によりプログラムの設計・検証・理解を深める書籍
  • 論理学 (特にブール代数)の基本を学ぶことで、現場で役立つテクニックを多数紹介
  • 実用性重視 :条件式の簡略化、API変更による影響検証、レースコンディション検出、分散処理の最適化など
  • 数学知識不要 :AND・OR・NOTなどプログラマが日常的に使う論理演算のみで理解可能
  • 対象読者 :ループやバージョン管理、テストなどの基本を理解した 中級〜上級プログラマ
    • 一部の章ではSQLやAPI設計など特定分野の知識も要求
    • 各章は独立しており、興味や必要に応じて選択可能

タイトルの「A」と「E」について

  • 論理記号 ∀(for all)と ∃(there exists)の英語表記をタイトルに採用
  • 例:∀p ∈ Person: ∃c ∈ Color: IsFavoriteColor(p, c) → all p in People: (some c in Color: IsFavoriteColor(p, c))
  • 数式記号を避け、英語表現で学習や検索を容易に

購入方法・フォーマット

  • PDF・EPUB 形式でスマホやPCで閲覧可能
  • 印刷版 は白黒印刷・広めの余白でAmazonで販売
  • DRMフリー で自由に利用可能

目次と主要トピック

  • 論理学入門 :述語、ブール値、集合、量化子
  • リファクタリング :書き換え規則の活用
  • テスト手法 :プロパティテスト
  • 正しいコード設計 :契約、サブタイピング
  • コード検証 :形式的検証、Dafny
  • データ操作 :データベース理論
  • 意思決定の解読 :決定表
  • ドメインモデリング :形式仕様記述、Alloy
  • システム設計 :時相論理、TLA+
  • 数理問題解決 :制約・SMTソルバー
  • 論理プログラミング :Prolog、アンサーセットプログラミング
  • 付録 :数学記法、書き換え規則集、論理学の発展的話題
  • GitHub で全コードサンプルと追加例を公開

ボリュームと内容量

  • 本文 約50,000語200ページ超
  • 追加課題でさらに 4,000語 収録

Pythonのall([])がTrueとなる理由

  • all関数 はリストのすべての要素がTrueか判定
  • 任意のリストxs, ysに対し all(xs . ys) == all(xs) && all(ys) という性質
  • ys = []の場合、all(xs) && all([]) == all(xs) となる
  • all([]) = Trueであれば、恒等式 all(xs) == all(xs) が成立
  • TrueはAND演算の単位元 であり、sum([])=0、any([])=False も同様の理由

サンプル・さらなる情報

  • 興味があれば サンプル章 を読んで雰囲気を確認可能
  • 実践的な論理学の応用例 を多数収録し、現場で役立つ知識を提供

Hackerたちの意見

大学時代、ちょっとした気分転換で哲学の授業を受けたことがあるんだ。シンボリックロジックの授業を受けたとき、他のみんなが苦労している中で、俺はすごく簡単に感じてた。だって、シンボリックロジックの証明をつなげるのって、プログラミングと同じ感覚だったから。スタート地点があって、到達したいゴールがあって、そこにたどり着くために基本的な操作をつなげていく。時にはそれを分解する必要もあって、例えばP AND Qを証明するなら、Pを別々に証明してQを別々に証明する方が簡単だったりする。Pを証明してQを証明すれば、P AND Qも証明できる。これって、大きな関数を二つの小さな関数にリファクタリングする感じに似てる。サンプル章を見てると、シンボリックロジックの授業を思い出すよ。逆転した形で、プログラミングを楽にするためにシンボリックロジックを知るって感じかな。結構役立ちそうだし、サンプル章をもう少しじっくり読んでみるつもり。

僕が今まで一緒に働いた中で一番のプログラマーは哲学の学位を持ってたんだ。彼は正式なコンピュータサイエンスのカリキュラムができる前に教育を受けた人で、テフユーザーグループの会議以外で『コンピュータプログラミングの技法』を読んだのは彼を含めて二人だけだった。彼はオペレーティングシステムとフルアプリケーションスイートを作って商業的に販売していて、聞かれるといつも問題に適用できる(素晴らしく文書化された)コードを持ってたんだ。

形式的な証明を構築することは、プログラミングと関係があるだけじゃなくて、実際には同じことなんだよね。カリー・ハワード対応っていうのがあって、「プログラミング言語理論と証明理論において、カリー・ハワード対応はコンピュータプログラムと数学的証明との直接的な関係を示している。これはカリー・ハワード同型または同値とも呼ばれ、証明はプログラム、命題や式は型として解釈される。」って感じ。

無料の部分を読んだよ。面白そうだけど、数学的な背景が強いね。ちょっと優秀なジュニア開発者や多忙なシニアには壊れやすい、コンパクトで効率的なコードを好んでるみたい。楽しいプロジェクトではスマートなコードが好きだけど、仕事では読みやすくて理解しやすいコードがいいな。派手にしようとしないでほしい。だから、これは自分の考えを挑戦する本になるかも。いいね、ありがとう。

それはカーニハンの法則として知られてるね。シニアが時間をかけて学ぶことみたいだ。 https://github.com/dwmkerr/hacker-laws#kernighans-law 「デバッグはプログラムを書くよりも二倍難しいってみんな知ってる。だから、もしプログラムを書くときにできるだけ賢くなったら、どうやってそれをデバッグするんだ?」

シェアしてくれてありがとう!Hillelのコンテンツ、ほんとに感謝してるよ!

目次を見たけど、ゲーデルや不完全性定理、制限についての言及がないのはあまり良くないサインだね。構成はしっかりしてるけど、「論理入門」タルスキ著や「メタロジック:標準一階論理のメタ理論入門」ハンター著をおすすめするかな。これらは俺には役立ったし、数学者じゃない人でもわかりやすいと思う(個人的に)。それか、プロログに直接飛び込むのもありだね(「Art of Prolog」や「Craft of Prolog」)。

ゲーデルの不完全性定理は、現役のプログラマーにとってどんな意味があるの?

「タルスキの『論理学入門』と『メタ論理学』をおすすめするよ。プログラマー向けじゃないから、全然違うし代わりにはならないけど。ウェブサイトの無料サンプルを見てみて。あと、不完全性定理はプログラマーにはあんまり関係ないと思う。」

毎日仕事でProlog(まあ、Mercuryだけど)をやってたのに、『Art of Prolog』の最初の数章を越えるのに苦労したよ :( 今はもっと成長したと思うから、もう一度挑戦してみるつもりだけど…自信はないな!

この本を買いたいけど、条件を簡略化する例を読むのが難しい。これに適用されるルールがわからないんだ。他にこのルールを説明している本を知ってる?

一つだけすぐにはわからないのは、https://en.wikipedia.org/wiki/De_Morgan%27s_laws

Hacker Newsで議論の続きを見る