在Isabelle中为乘法定义Primtive Decursion

时间:2017-01-23 18:45:07

标签: isabelle

我是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

有什么想法吗?

1 个答案:

答案 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应用于参数fx

因此,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,则可以执行此操作,但这不是您要在此处执行的操作:您希望改为处理案例funprimrec(看我的解决方案)。在您的定义中,Zero甚至可能未定义。