Alloyさん
-
Upload
fukushima-national-college-of-technology -
Category
Documents
-
view
699 -
download
2
Transcript of Alloyさん
抽象による ソフトウェア設計
- Alloy - 福島工業高等専門学校 2年 馬目華奈 sugspi_c(きゃにー)
What
is Alloy?
ソフトウェアの 仕様のバグを 減らす
言語 ツール
仕様のバグとは
記入漏れ
矛盾
曖昧さ
要求を満たしていない
特徴
数理論理学 + 集合論
形式仕様記述
シミュレーション
Alloyのモデル定義
① シグネチャ
sig
しぐねちゃ {}
sig rean {}
Alloyのモデル定義
② 述語
pred
じゅつご {}
pred reanlife { # rean =1 # Twitter = 1 # life = 1 }
Alloyのモデル定義
③ 事実
fact じじつ {}
fact dokoiku {
favdragon_rean.(situation.go)=NCT ichigo_o_re.(situation.go)=NCT marin72_com.(situation.go)=NCT sugspi_c.(situation.go)=NCT everysick.(situation.go)=NCT }
Alloyのモデル定義
④ アサート
assert
あさーと {}
反例を検査。 つまり実行は
されない。
Alloyのモデル定義
⑤ コマンド
run じゅつご {}
check あさーと{}
run →述語を 満たす為の
具体的な例を 見つける。
Alloyのモデル定義
⑤ コマンド
run {}
check{}
check → アサートが 妥当かどうかを 検査する。
論理パズル
あるところに2組の3兄弟がいました。
その6人をそれぞれABCDEFとします。
(誰と誰が兄弟かは不明)
この6人のうち、3人は常に本当のことを
言い(正直者)、他の3人は常に
嘘をつきます(嘘つき)。
また、どちらの兄弟にも最低1人は嘘つきがいます。
以下の証言から、誰と誰が兄弟で、嘘つき・
正直者はそれぞれ誰なのかを当ててください
A B
C
E
D
F
条件:
A「私の兄弟は2人とも嘘つき」
B「私の兄弟は2人とも正直者」
C「AとBは両方とも嘘つき」
D「私はCと兄弟」
E「私とBは兄弟」
F「Eは正直者」
--------
問題元 URL:
http://quiz-tairiku.com/logic/q9.html
条件:
A「私の兄弟は2人とも嘘つき」
B「私の兄弟は2人とも正直者」
C「AとBは両方とも嘘つき」
D「私はCと兄弟」
E「私とBは兄弟」
F「Eは正直者」
--------
問題元 URL:
http://quiz-tairiku.com/logic/q9.html
条件:
A「私の兄弟は2人とも嘘つき」
B「私の兄弟は2人とも正直者」
C「AとBは両方とも嘘つき」
D「私はCと兄弟」
E「私とBは兄弟」
F「Eは正直者」
--------
問題元 URL:
http://quiz-tairiku.com/logic/q9.html
条件:
A「私の兄弟は2人とも嘘つき」
B「私の兄弟は2人とも正直者」
C「AとBは両方とも嘘つき」
D「私はCと兄弟」
E「私とBは兄弟」
F「Eは正直者」
--------
問題元 URL:
http://quiz-tairiku.com/logic/q9.html
条件:
A「私の兄弟は2人とも嘘つき」
B「私の兄弟は2人とも正直者」
C「AとBは両方とも嘘つき」
D「私はCと兄弟」
E「私とBは兄弟」
F「Eは正直者」
--------
問題元 URL:
http://quiz-tairiku.com/logic/q9.html
条件:
A「私の兄弟は2人とも嘘つき」
B「私の兄弟は2人とも正直者」
C「AとBは両方とも嘘つき」
D「私はCと兄弟」
E「私とBは兄弟」
F「Eは正直者」
--------
問題元 URL:
http://quiz-tairiku.com/logic/q9.html
条件:
A「私の兄弟は2人とも嘘つき」
B「私の兄弟は2人とも正直者」
C「AとBは両方とも嘘つき」
D「私はCと兄弟」
E「私とBは兄弟」
F「Eは正直者」
--------
問題元 URL:
http://quiz-tairiku.com/logic/q9.html
プログラム
enum Person{A,B,C,D,E,F}
one sig situation1
{ truth_teller : set Person,
Sato:set Person,
Suzuki:set Person,
brother: Person -> Person
}
プログラム
enum Person{A,B,C,D,E,F}
one sig situation1
{ truth_teller : set Person,
Sato:set Person,
Suzuki:set Person,
brother: Person -> Person
}
Person
truth_teller
プログラム
enum Person{A,B,C,D,E,F}
one sig situation1
{ truth_teller : set Person,
Sato:set Person,
Suzuki:set Person,
brother: Person -> Person
}
brother Person Person
プログラム {
#truth_teller=3 #Sato=3
#Suzuki=3
F in truth_teller <=> E in truth_teller
C in truth_teller <=>(not A in truth_teller and
not B in truth_teller)
D in truth_teller <=> C in brother.D
E in truth_teller <=> B in brother.E
A in truth_teller <=> brother.A in Person - truth_teller
B in truth_teller <=> brother.B in truth_teller
プログラム {
#truth_teller=3
#Sato=3
#Suzuki=3
F in truth_teller <=> E in truth_teller
C in truth_teller <=>(not A in truth_teller and
not B in truth_teller)
D in truth_teller <=> C in brother.D
E in truth_teller <=> B in brother.E
A in truth_teller <=> brother.A in Person -
truth_teller
B in truth_teller <=> brother.B in truth_teller
条件:
A「私の兄弟は2人とも嘘つき」
B「私の兄弟は2人とも正直者」
C「AとBは両方とも嘘つき」
D「私はCと兄弟」
E「私とBは兄弟」
F「Eは正直者」
--------
問題元 URL:
http://quiz-tairiku.com/logic/q9.html
プログラム
no Sato&Suzuki
Person=Sato+Suzuki
brother=
(Sato ->Sato)+
(Suzuki -> Suzuki)-iden }
run{}
Sato
Suzuki
Person
プログラム
no Sato&Suzuki
Person=Sato+Suzuki
brother=
(Sato ->Sato)+
(Suzuki -> Suzuki) - iden }
run{}
run
run
まとめ
手続きを記述するのではなく
制約を記述する。
仕様にバグがあるならば、
狭い範囲の中でも発見できる。
検証する範囲は最小の
有限である。