我是Isabelle的新手,我正在尝试定义原始递归函数。我已尝试过添加,但我遇到了乘法问题。
datatype nati = Zero | Suc nati
primrec add :: "nati ⇒ nati ⇒ nati" where
"add Zero n = n" |
"add (Suc m) n = Suc(add m n)"
primrec mult :: "nati ⇒ nati ⇒ nati" where
"mult Suc(Zero) n = n" |
"mult (Suc m) n = add((mult m n) m)"
上面的代码
我收到以下错误类型统一失败:类型“_⇒”和“nati”的冲突
应用程序中的类型错误:操作符不是函数类型
运营商:mult m n :: nati
操作数:m :: nati
有什么想法吗?
答案 0 :(得分:2)
问题在于您的mult
功能:它应如下所示:
primrec mult :: "nati ⇒ nati ⇒ nati" where
"mult Zero n = Zero" |
"mult (Suc m) n = add (mult m n) m"
函数式编程中的函数应用程序/ Lambda演算是绑定最强的操作,它与左侧相关联:f x y
表示应用于f
的{{1}},并应用了结果至x
' - 或者,相当于由于Currying:函数y
应用于参数f
和x
。
因此,y
之类的内容将被视为mult Suc(Zero) n
,即函数mult Suc Zero n
必须是一个带有三个参数的函数,即mult
,{{1 }和Suc
。这会给你一个类型错误。同样地,Zero
不起作用,因为它与n
相同,这意味着add ((mult m n) m)
是一个接受一个参数的函数,add (mult m n m)
是一个接受三个参数的函数。
最后,如果你修复了所有这些,你会得到另一个错误,说你在add
函数的左侧有一个非原始模式。您不能在mult
之类的模式匹配,因为它不是原始模式。如果您使用mult
代替Suc Zero
,则可以执行此操作,但这不是您要在此处执行的操作:您希望改为处理案例fun
和primrec
(看我的解决方案)。在您的定义中,Zero
甚至可能未定义。