0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Alloyで書こう:私は彼?

Last updated at Posted at 2020-03-06

Alloyでパズル(1)、(3) に解説を加筆した流れで。
ふだん言葉にしていない部分もしっかり書こうという話。
仕事を海外発注する場合に限らず、言ってない・書いてないところにバグは潜むもの。
さすがにパズルではなさすぎるので、Alloyでパズルシリーズとは別とした。

問題

Alloy本 A.3.1 驚くような三段論法 より

Doris Day の歌に、次のような節がある。
  “Everybody loves my baby
   but my baby don’t love nobody but me."

  みんな私の彼が好き
  でも彼は私以外好きじゃない。
David Gries が指摘したところによると、論理的に厳密な立場からすれば、これは「私は私の彼だ」を含意しているそうだ。
(中略) Doris Day が言いたかったであろう形に記述し直し、今度はアサーションが反例を持つことを示せ。

書いてみる

例1

できる限り勝手な解釈を入れずに、そのまま書くとこうなるだろう。

sig Person {loves: set Person} { MyBaby in loves }
one sig Me in Person {}
one sig MyBaby in Person {} { no loves & Person-Me }

run {}
check { Me = MyBaby }

確かに言葉通りなら、彼は(彼が好き かつ 私以外好きじゃない)ので「私=彼」でないと成り立たない。
mybaby.png

例2

常識的に考えると「言いたかったであろう形」はこんな感じか。

sig Person {loves: set Person-this}     // 自己愛について話してない
one sig Me,MyBaby extends Person {}     // 私と彼は別人

pred everybodyLovesMyBaby {             // (彼以外の)みんなは彼が好き
    (Person-MyBaby) in loves.MyBaby
}
run everybodyLovesMyBaby

pred myBabyLovesNobodyButMe {
    MyBaby.loves = Me                   // 彼は私だけが好き
}
run {
    everybodyLovesMyBaby && myBabyLovesNobodyButMe
} for 5

mybaby2.png

例3

しばらくして思った。
いや違う、そんなにくどい解釈が言いたかったことじゃない。
こうか。

let everybody = Girl            // "everybody" means "every girls"
sig Girl {loves: set Boy}       // loves: lone Boy の方が気持ちに合っているかも
sig Boy {loves: set Girl}
one sig Me in Girl {}
one sig MyBaby in Boy {}

fact {
    everybody in loves.MyBaby   // Everybody loves my baby
    MyBaby.loves = Me           // my baby don’t love nobody but me (He loves only me)
}

run {} for 4 but exactly 4 Girl
check { Me = MyBaby }

BoyとGirlという概念が現れた(今の時代なら同性愛も念頭におくかもしれないが..)
mybaby2.png

例4

ちなみにあえて空気を読まずに「私以外好きじゃない」に戻すと

let everybody = Girl            // "everybody" means "every girls"
sig Girl {loves: set Boy}       // loves: lone Boy の方が気持ちに合っているかも
sig Boy {loves: set Girl}
one sig Me in Girl {}
one sig MyBaby in Boy {}

fact {
    everybody in loves.MyBaby   // Everybody loves my baby
    no MyBaby.loves & (Girl-Me) // my baby don’t love nobody but me
}

run {} for 4 but exactly 4 Girl
check { Me = MyBaby }

私も好かれてなかったという身もふたもない解釈が出る(私が好きとは言ってない)。
mybaby4.png

なお、例1以外では check は「左辺と右辺は=になりえないって定義してるよね」と警告される。

== is redundant, because the left and right expressions are
always disjoint.
Left type = {this/Me}
Right type = {this/MyBaby}

まとめ

言葉にされていない部分を仕様化・実装すると、例え意図をくみ取ろうとしてもこれだけ解釈が揺れる。
だから人に何かを頼むときは、できる限り正確で曖昧さのない仕様を書こう。
たぶんそれは、日本語や英語だけでは難しい。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?