Model Base

A.3.3 床屋のパラドックス

最終更新:

modelbase

- view
管理者のみ編集可

更新日2011-09-03
[ Alloy Analyzer ] / [ 抽象によるソフトウェア設計/付録 A 練習問題 解答例 ]


( a ) 解析器を使い、モデルが実際に矛盾していることを示せ

sig Man {shaves: set Man}
one sig Barber extends Man {}
fact {
Barber.shaves = {m: Man | m not in m.shaves}
}
 
run {}for 4 Man

村人4人の世界でインスタンスは発見されなかった。

Executing "Run run$1 for 4 Man"
  Solver=minisat(jni) Bitwidth=4 MaxSeq=4 SkolemDepth=1 Symmetry=20
  116 vars. 19 primary vars. 167 clauses. 297ms.
  No instance found. Predicate may be inconsistent. 0ms.

( b ) 村人を男(髭を剃る必要がある者)と女性(必要のない者)に分けた新たなモデルを作成し、今度は簡単な解があることを示せ

abstract sig Person{}
sig Woman extends Person{}
sig Man extends Person{shaves: set Man}
one sig Barber in Person {}
fact {
  Barber.shaves = {m: Man | m not in m.shaves}
  }
 
run {}for 4 Person

女性が床屋になってくれたことで解が現れた。


( c ) もっと抜本的な解がEdsger Dijkstraによって示された。それは、床屋がいない可能性を許容するというものだ。これに従って最初のモデルを書き直し、解が得られることを示せ

one sig Barber から one をとる。

sig Man {shaves: set Man}
sig Barber extends Man {}
fact {
  Barber.shaves = {m: Man | m not in m.shaves}
  }
 
run {}for 4 Man


( d) 最後に、元のモデルで複数の床屋がいるような変更を試して、やはり解が得られることを示せ

sig Man {shaves: set Man}
sig Barber extends Man {}
fact {
  -- 複数の床屋がいる
  #Barber > 1
  Barber.shaves = {m: Man | m not in m.shaves}
  }
 
run {}for 4 Man

なんだが、法規制の盲点をついた○○のようだ。。。






















記事メニュー
目安箱バナー