Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Isabelle类型统一/推断错误_Isabelle - Fatal编程技术网

Isabelle类型统一/推断错误

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

我刚刚开始学习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_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语句(外部语法)因此,虽然
“…”
是术语语言的一部分,但
“…”
不是

现在来看错误消息。它告诉您正在尝试使用list
x
(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章“内部语法-术语语言”。