Isabelle类型统一/推断错误
我刚刚开始学习Isabelle,在练习3.3的过程中,我遇到了一个类型统一错误: 定义替换函数Isabelle类型统一/推断错误,isabelle,Isabelle,我刚刚开始学习Isabelle,在练习3.3的过程中,我遇到了一个类型统一错误: 定义替换函数 subst :: vname ⇒ aexp ⇒ aexp ⇒ aexp 因此subst x a e是将x变量的每次出现替换为e中的a的结果。例如: subst ''x'' (N 3) (Plus (V ''x'') (V ''y'')) = Plus (N 3) (V ''y'') 以下是到目前为止我得到的信息: theory Scratchpad imports Main begin type
subst :: vname ⇒ aexp ⇒ aexp ⇒ aexp
因此subst x a e
是将x
变量的每次出现替换为e
中的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
当函数定义中的第三个用例被注释掉时,运行测试用例
value "subst ''x'' (N 3) (N 5)"
value "subst ''x'' (N 3) (V ''x'')"
分别生成(n5)
和(n3)
,因此我知道前两行工作正常。添加最后一行将导致错误
类型统一失败:类型冲突“\u”⇒ _" 和“uu列表”
应用程序中的类型错误:运算符不是函数类型
操作员:x::字符列表操作数:NA::aexp 我不认为这是一个语法问题,尽管我还不完全确定不同类型的引号的用途(例如双引号和双单引号)。从中,我相信Isabelle将
x
指定为行右侧的函数类型,这不是我想要的
错误消息的实际含义是什么(具体和一般),我该如何解决这个问题?回答您关于引号的问题:Isabelle/HOL中使用了两个单引号(更准确地说是其内部语法)表示字符串文字。也就是说,通过
“abc”
我们表示包含三个字符的字符串a
、b
、和c
(如果必须按字面输入,这将再次使用一些特殊语法)。另一方面,双引号主要用于分隔Isar语句(外部语法)因此,虽然“…”
是术语语言的一部分,但“…”
不是
现在来看错误消息。它告诉您正在尝试使用listx
(type\ulist
)作为函数(type\u=>\ u
)。为什么Isabelle认为您想使用x
作为函数?因为并列(即,将术语写在彼此旁边,用空格分隔)表示函数应用。因此x(na)
被解释为将函数x
应用于参数(na)
(正如fy
是f
应用于参数y
).为了给你的定义正确的含义,你必须在正确的位置使用括号。我猜你在第三条中的意图是:
Plus (subst x (N a) e1) (subst x (N a) e2)
这里有两次函数subst
应用于三个参数(所以这毕竟是一个语法问题;)
另一个注释。
subst
的实现可能更一般。subst
的第二个参数总是固定为某个数字a
(因为您使用了构造函数N
)。但是,如果您允许使用任意类型的表达式,那么一切都应该正常工作。aexp
这值得投票支持,但我还没有15%的声誉。我必须记得在投票后回来。括号中的错误您很清楚。我实际上注意到并在更简单的情况下修复了它,但看不到在这种情况下,这是令人发狂的。一个后续问题:你能定义“术语语言”这个短语吗?我对Isabelle、HOL和Isar之间的区别以及语法层次充其量还不清楚。为了回答你关于术语语言的问题,我参考了本书第7章“内部语法-术语语言”。