Alloyさん

29
抽象による ソフトウェア設計 - Alloy - 福島工業高等専門学校 2年 馬目華奈 sugspi_c(きゃにー)

Transcript of Alloyさん

Page 1: Alloyさん

抽象による ソフトウェア設計

- Alloy - 福島工業高等専門学校 2年 馬目華奈 sugspi_c(きゃにー)

Page 2: Alloyさん

What

is Alloy?

ソフトウェアの 仕様のバグを 減らす

言語 ツール

Page 3: Alloyさん

仕様のバグとは

記入漏れ

矛盾

曖昧さ

要求を満たしていない

Page 4: Alloyさん

特徴

数理論理学 + 集合論

形式仕様記述

シミュレーション

Page 5: Alloyさん

Alloyのモデル定義

① シグネチャ

sig

しぐねちゃ {}

sig rean {}

Page 6: Alloyさん

Alloyのモデル定義

② 述語

pred

じゅつご {}

pred reanlife { # rean =1 # Twitter = 1 # life = 1 }

Page 7: Alloyさん

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 }

Page 8: Alloyさん

Alloyのモデル定義

④ アサート

assert

あさーと {}

反例を検査。 つまり実行は

されない。

Page 9: Alloyさん

Alloyのモデル定義

⑤ コマンド

run じゅつご {}

check あさーと{}

run →述語を 満たす為の

具体的な例を 見つける。

Page 10: Alloyさん

Alloyのモデル定義

⑤ コマンド

run {}

check{}

check → アサートが 妥当かどうかを 検査する。

Page 11: Alloyさん

論理パズル

あるところに2組の3兄弟がいました。

その6人をそれぞれABCDEFとします。

(誰と誰が兄弟かは不明)

この6人のうち、3人は常に本当のことを

言い(正直者)、他の3人は常に

嘘をつきます(嘘つき)。

また、どちらの兄弟にも最低1人は嘘つきがいます。

以下の証言から、誰と誰が兄弟で、嘘つき・

正直者はそれぞれ誰なのかを当ててください

A B

C

E

D

F

Page 12: Alloyさん

条件:

A「私の兄弟は2人とも嘘つき」

B「私の兄弟は2人とも正直者」

C「AとBは両方とも嘘つき」

D「私はCと兄弟」

E「私とBは兄弟」

F「Eは正直者」

--------

問題元 URL:

http://quiz-tairiku.com/logic/q9.html

Page 13: Alloyさん

条件:

A「私の兄弟は2人とも嘘つき」

B「私の兄弟は2人とも正直者」

C「AとBは両方とも嘘つき」

D「私はCと兄弟」

E「私とBは兄弟」

F「Eは正直者」

--------

問題元 URL:

http://quiz-tairiku.com/logic/q9.html

Page 14: Alloyさん

条件:

A「私の兄弟は2人とも嘘つき」

B「私の兄弟は2人とも正直者」

C「AとBは両方とも嘘つき」

D「私はCと兄弟」

E「私とBは兄弟」

F「Eは正直者」

--------

問題元 URL:

http://quiz-tairiku.com/logic/q9.html

Page 15: Alloyさん

条件:

A「私の兄弟は2人とも嘘つき」

B「私の兄弟は2人とも正直者」

C「AとBは両方とも嘘つき」

D「私はCと兄弟」

E「私とBは兄弟」

F「Eは正直者」

--------

問題元 URL:

http://quiz-tairiku.com/logic/q9.html

Page 16: Alloyさん

条件:

A「私の兄弟は2人とも嘘つき」

B「私の兄弟は2人とも正直者」

C「AとBは両方とも嘘つき」

D「私はCと兄弟」

E「私とBは兄弟」

F「Eは正直者」

--------

問題元 URL:

http://quiz-tairiku.com/logic/q9.html

Page 17: Alloyさん

条件:

A「私の兄弟は2人とも嘘つき」

B「私の兄弟は2人とも正直者」

C「AとBは両方とも嘘つき」

D「私はCと兄弟」

E「私とBは兄弟」

F「Eは正直者」

--------

問題元 URL:

http://quiz-tairiku.com/logic/q9.html

Page 18: Alloyさん

条件:

A「私の兄弟は2人とも嘘つき」

B「私の兄弟は2人とも正直者」

C「AとBは両方とも嘘つき」

D「私はCと兄弟」

E「私とBは兄弟」

F「Eは正直者」

--------

問題元 URL:

http://quiz-tairiku.com/logic/q9.html

Page 19: Alloyさん

プログラム

enum Person{A,B,C,D,E,F}

one sig situation1

{ truth_teller : set Person,

Sato:set Person,

Suzuki:set Person,

brother: Person -> Person

}

Page 20: Alloyさん

プログラム

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

Page 21: Alloyさん

プログラム

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

Page 22: Alloyさん

プログラム {

#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

Page 23: Alloyさん

プログラム {

#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

Page 24: Alloyさん

条件:

A「私の兄弟は2人とも嘘つき」

B「私の兄弟は2人とも正直者」

C「AとBは両方とも嘘つき」

D「私はCと兄弟」

E「私とBは兄弟」

F「Eは正直者」

--------

問題元 URL:

http://quiz-tairiku.com/logic/q9.html

Page 25: Alloyさん

プログラム

no Sato&Suzuki

Person=Sato+Suzuki

brother=

(Sato ->Sato)+

(Suzuki -> Suzuki)-iden }

run{}

Sato

Suzuki

Person

Page 26: Alloyさん

プログラム

no Sato&Suzuki

Person=Sato+Suzuki

brother=

(Sato ->Sato)+

(Suzuki -> Suzuki) - iden }

run{}

Page 27: Alloyさん

run

Page 28: Alloyさん

run

Page 29: Alloyさん

まとめ

手続きを記述するのではなく

制約を記述する。

仕様にバグがあるならば、

狭い範囲の中でも発見できる。

検証する範囲は最小の

有限である。