[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页