如何实现类型化的无标签解释器?

时间:2018-10-03 08:27:22

标签: isabelle

[1]描述了一种非常有趣的方法来定义语言语法和语义。想法是使用类而不是ADT来描述语法:

class ExpSYM =
  fixes lit :: "int ⇒ 'a"
    and neg :: "'a ⇒ 'a"
    and add :: "'a ⇒ 'a ⇒ 'a"

使用某个值域(int)的类实例化来描述语义:

instantiation int :: ExpSYM
begin
definition "lit_int (n :: int) ≡ n"
definition "neg_int (e :: int) ≡ -e"
definition "add_int (e1 :: int) (e2) ≡ e1 + e2"
instance ..
end

definition eval :: "int ⇒ int" where
  "eval ≡ id"

以下是一些示例:

term "add (lit 1) (lit 2)"
term "eval (add (lit 1) (lit 2))"
value "eval (add (lit 1) (lit 2))"

该方法可以轻松扩展语言:

class MulSYM =
  fixes mul :: "'a ⇒ 'a ⇒ 'a"

instantiation int :: MulSYM
begin
definition "mul_int (e1 :: int) (e2) ≡ e1 * e2"
instance ..
end

term "eval (mul (add (lit 1) (lit 2)) (lit 5))"
value "eval (mul (add (lit 1) (lit 2)) (lit 5))"

该方法还允许在没有值标签和模式匹配的情况下定义语言语义:

datatype val = BoolVal bool | IntVal int | StringVal string

问题是我无法在Isabelle HOL中从[2]中实现以下Haskell示例:

class Symantics repr where
    int :: Int → repr Int
    add :: repr Int → repr Int → repr Int
    lam :: (repr a → repr b) → repr (a → b)
    app :: repr (a → b) → repr a → repr b

作者称其为“ y ”,因为

  

类声明定义了嵌入式语言的语法(其   表达形式);类实例定义解释,或者   语义。

repr是代表类的类型实例的参数。此类型是参数性的。它可以采用Int作为参数(repr Int),也可以采用箭头类型(repr (a → b))。

以下是具有不同类型的语言表达的示例:

th1 = add (int 1) (int 2)
−− th1 :: (Symantics repr) ⇒ repr Int
th2 = lam (\x → add x x)
−− th2 :: (Symantics repr) ⇒ repr (Int → Int)
th3 = lam (\x → add (app x (int 1)) (int 2))
−− th3 :: (Symantics repr) ⇒ repr ((Int → Int) → Int)

以下是该语言的口译员:

newtype R a = R{unR :: a}

instance Symantics R where
    int x = R x
    add e1 e2 = R $ unR e1 + unR e2
    lam f = R $ unR ◦ f ◦ R
    app e1 e2 = R $ (unR e1) (unR e2)

−− eval :: R a → a
eval e = unR e

如何在Isabelle HOL中实现类似的解释器?似乎类和语言环境在这里不适用。

在讲义[3]中,也有一个类似的基于广义代数数据类型的无标签解释器:

data Exp env t where
    B :: Bool → Exp env Bool
    V :: Var env t → Exp env t
    L :: Exp (a,env) b → Exp env (a → b)
    A :: Exp env (a → b) → Exp env a → Exp env b

data Var env t where
    VZ :: Var (t, env) t
    VS :: Var env t → Var (a, env) t

eval :: env → Exp env t → t
eval env (V v) = lookp v env
eval env (B b) = b
eval env (L e) = \x → eval (x, env) e
eval env (A e1 e2) = (eval env e1) (eval env e2)

您能否建议如何在Isabelle HOL中实现这两个无标签解释器?


[1] Oleg Kiselyov。键入无标签最终解释器

[2]-//-。 3.4节使用高阶抽象语法的无标签最终嵌入。第29页

[3]-//-,第3.2节:无标记,初始和最终嵌入。第22-23页

0 个答案:

没有答案