【发布时间】:2015-02-01 16:31:34
【问题描述】:
我刚开始使用 Isabelle,在完成 Concrete Semantics 的练习 3.3 时遇到类型统一错误:
定义一个替换函数
subst :: vname ⇒ aexp ⇒ aexp ⇒ aexp使得
subst x a e是在e中将变量x替换为a的结果。例如:subst ''x'' (N 3) (Plus (V ''x'') (V ''y'')) = Plus (N 3) (V ''y'')
这是我目前得到的:
theory Scratchpad
imports Main
begin
type_synonym vname = string
type_synonym val = int
type_synonym state = "vname ⇒ val"
datatype aexp = N int | V vname | Plus aexp aexp
fun subst :: "vname ⇒ aexp ⇒ aexp ⇒ aexp" where
"subst x (N a) (N e) = (N e)" |
"subst x (N a) (V e) = (if x=e then (N a) else (V e))" |
"subst x (N a) (Plus e1 e2) = Plus(subst(x (N a) e1) subst(x (N a) e2))"
end
当函数定义中的第三个case被注释掉时,运行测试用例
value "subst ''x'' (N 3) (N 5)"
value "subst ''x'' (N 3) (V ''x'')"
分别产生(N 5) 和(N 3),所以我知道前两行工作正常。添加最后一行导致错误
类型统一失败:类型“_ ⇒ _”和“_ list”的冲突
应用程序中的类型错误:运算符不是函数类型
运算符:x :: 字符列表
操作数:N a :: aexp
我认为这不是语法问题,尽管我还不能完全确定不同类型的引号的用途(例如双引号与两个单引号)。从this answer,我相信Isabelle 将x 指定为行右侧的函数类型,这不是我想要的。
错误消息的实际含义是什么(具体和一般),我该如何解决这个问题?
【问题讨论】:
标签: isabelle