抽象によるソフトウェア設計 付録A 練習問題 その5
付録A 練習問題続きます。
- A.1.9 閉包推移を公理化してみる
- 閉包推移は一階論理で公理化できない。のでできないのだけどやろうとして失敗してみるというもの
-- 推移被覆 pred transCover (R, r: univ -> univ) { r in R -- R は r を含む R.R in R -- R は推移的 } -- 推移閉包 pred transClosure (R, r: univ -> univ) { transCover [R, r] -- R は r の推移被覆であり no x, y: univ | x -> y in R and transCover [R - x -> y, r] -- R から取り除いても推移被覆であるようなタプルがない } assert Equivalence { all R, r: univ -> univ | transClosure [R, r] iff R = ^r } check Equivalence for 3
-
- r が2つの部分グラフに分割されるような関係で R が両者を繋ぐタプルを含んでいるような時に上記の記述では「最小の推移被覆である」ことをうまく表現できません
今日は試行錯誤で時間を使ってしまってここまでです。
解説によると、「有限領域における推移閉包は一階論理で公理化できる」そうです。