トップ «前の日記(2009-05-05) 最新 次の日記(2009-05-08)» 月表示 編集

日々の流転


2009-05-06 [長年日記]

λ. Haskell→Isabelle

ranhaさんが書いていた Haskabelle*1に少し興味を持つ。 HaskellプログラムをIsabelleに変換するものらしい。 マニュアルによると、例えば以下のようなHaskellプログラム

module Classes where

class Monoid a where
  nothing :: a
  plus :: a -> a -> a

instance Monoid Integer where
  nothing = 0
  plus = (+)

-- prevent name clash with Prelude.sum
summ :: (Monoid a) => [a] -> a
summ [] = nothing
summ (x:xs) = plus x (summ xs)

class (Monoid a) => Group a where
  inverse :: a -> a

instance Group Integer where
  inverse = negate

sub :: (Group a) => a -> a -> a
sub a b = plus a (inverse b)

theory Classes
imports Nats Prelude
begin
class Monoid = type +
  fixes nothing :: 'a
  fixes plus :: "'a => 'a => 'a"

instantiation int :: Monoid
begin
  definition nothing int :: "int"
  where
    "nothing int = 0"
  definition plus int :: "int => int => int"
  where
    "plus int = (op +)"
instance ..
end

fun summ :: "('a :: Monoid) list => ('a :: Monoid)"
where
"summ Nil = nothing"
| "summ (x # xs) = plus x (summ xs)"

class Group = Monoid +
  fixes inverse :: "'a => 'a"

instantiation int :: Group
begin
  definition inverse int :: "int => int"
  where
    "inverse int = uminus"
instance ..
end

fun sub :: "('a :: Group) => ('a :: Group) => ('a :: Group)"
where
  "sub a b = plus a (inverse b)"
end

というIsabelleの記述に変換されるとか。 Isabelleの構文をきちんと知らないので、良くは分からないけど。

ただ、Haskellのデータ型や関数をIsabelleの普通のデータ型や関数に変換しているため、変換結果はIsabelleに停止しない関数として拒絶されることがあるそうだ。 (その辺りはどうしているのかなぁ、と思ったら案の定)

調べてみると、HaskellからIsabelleへの変換の試みは他にもいくつかあるみたいだな。 Implementation of a Pragmatic Translation from Haskell into Isabelle/HOL はHaskabelleと同じくそのまま単純に変換している。 一方、Paolo Torrini, Christoph Lueth, Christian Maeder, Till Mossakowski. Translating Haskell to Isabelle は、Isabelle用の領域理論のライブラリであるIsabelle/HOLCFを使った領域理論的な記述へと変換しているので、扱いは面倒だけど、停止しない関数が拒絶されるといった問題は無い。

*1 綴りが難しいよ (><)