クイズ! 存在的多相型
しばらくつまらない問題&解答ばかりだったので、もう少し面白いやつを。存在型と再帰関数のある多相λ計算で、次の2つの値は文脈等価でしょうか? できれば証明ないし反例も。
v1 = pack (unit, λf:unit→unit. (f (); true)) as τ
v2 = pack (bool, λf:bool→bool. (f true) ∧ ¬(f false)) as τwhere
τ = ∃α.(α→α)→bool
OCamlで書くと、
module type T = sig type t val g : (t -> t) -> bool end module V1 : T = struct type t = unit let g = fun f -> (f (); true) end module V2 : T = struct type t = bool let g = fun f -> (f true) && not (f false) end
に対して、
module A1 = F(V1)
は無限ループして
module A2 = F(V2)
は無限ループしないようなFはあるか、という話。ただし参照とか例外とか、pureでない言語機構は使用禁止。っていうとわかっちゃうかもしれないけど。
ちなみにデレック・ドレイヤー博士(ttic.uchicago.edu/~dreyer/)やアンドリュー・ピッツ教授(www.cl.cam.ac.uk/~amp12/)は間違えました。っていうかそういうメールを送りつけてきたので突っ込みを入れて切り返した。検索されないようにカタカナ表記。
追記:polymorphic equalityも禁止。とかいうと、ますますヒントになりますが。