Alloyで第二次誤信念課題
Alloyでミステリーのネタを作れないかな、とは前々から思っていたのだけどミステリーのテレビ番組を見ながら少し固まってきた
Alloyでミステリーのネタを作るのは一足飛びにはモデリングできる気がしないので、まずは第二次誤信念課題でもモデリングするかな。 第二次誤信念課題は初見の時に正解できなかったから、一般にこのレベルの問題を僕が正解できないのか、たまたま間違えただけなのかを知るためにもっとたくさん問題がほしいのであった。 ミステリー的には、登場人物それぞれの知っていることと読者の知っていることにギャップが出来て、それからごく少ないヒントを元にギャップが解消される必要があるのかな。 誤信念の一種として、登場人物Xが自分はYの妻だと思い込んでいて、その人の話を聞いた読者がそれを事実だと勘違いするけども実は事実ではない、というのもアリなんだな。 そうか、本人が明示的に嘘をつくなら嘘をつく動機は何なのか、という意図が説明されないといけないけど、本人が見られていることを自覚していないなら妄想日記を介して誤信念が伝わるのなら意図は必要ないのか。
というわけでまずは第二次誤信念課題をモデリングした。第二次誤信念課題ってのはこういうもの:
アリスとボブが公園にいるときに、アイスクリーム屋さんが「今日はずっとここにいるよ」と言う。ボブはお金がなかったので家に取りに戻る。アリスだけしかいない時にアイスクリーム屋さんが「やっぱ駅前に行くよ」と言う。アリスは家に帰る。アイスクリーム屋さんは移動中にボブに出会い「駅前に行くよ」と伝える。アリスがボブの家に行くと、ボブの母から「アイスクリームを買いに行った」と伝えられる。アリスはボブをどこに探しに行くか?
Alloyのコードはこちら
// 誤信念課題 open util/ordering[Time] sig Time {} abstract sig Belief {} // アイスクリーム屋はどこにいる? abstract sig InWhere extends Belief {} one sig InPark extends InWhere {} one sig InStation extends InWhere {} abstract sig Person { belief: Belief -> Time, others_belief: Person -> Belief -> Time } one sig Alice extends Person {} one sig Bob extends Person {} // 最初はみんな何も信念がない pred init(t: Time){ all p: Person { no p.belief.t no p.others_belief.t } } pred step(now, prev: Time, b: InWhere, targets: Person){ all p: Person { (p in targets) => { p.belief.now = p.belief.prev - InWhere + b p.others_belief.now = ( p.others_belief.prev ++ ((targets - p) -> b) ) }else{ p.belief.now = p.belief.prev p.others_belief.now = p.others_belief.prev } } } run { some times: seq Time{ #times = 4 all i: times.butlast.inds { times[i].next = times[plus[i, 1]] } init[times[0]] step[times[1], times[0], InPark, Alice + Bob] step[times[2], times[1], InStation, Alice] step[times[3], times[2], InStation, Bob] } } for 4 Time
実行してみるとアリスは「ボブは公園にアイスクリーム屋がいると思っている」という誤信念を抱いていることがわかる。
こんな感じで登場人物がそれぞれの信念を持って行動していて、読者はそれを1ステップを除いて全部観測していて、それによって推論される結論が現実と異なるような実例を探せばよいと思う。ついでに言えば登場人物Xの意見を聞くとYが犯人で、Yの意見はXが犯人というものだがXの意見とあわせて考えると犯人はZ。で、Zの意見を聞いてもZが犯人としか思えないが、実は通りすがりの人が観測した情報をくわえて検討するとXが真犯人、とかのケースを探せるとストーリーにしやすくていいのか?続きはまた今度。