在Isabelle中定义乘法的基本递归
我是伊莎贝尔的新手,我正在尝试定义基本的递归函数。我试过加法,但乘法有困难在Isabelle中定义乘法的基本递归,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 =
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)"
对于上面的代码,我得到以下错误
类型统一失败:类型冲突“\u”⇒ _" 和“国家”
应用程序中的类型错误:运算符不是函数类型
操作员:mult m n::nati
操作数:m::nati
有什么想法吗?问题在于您的
mult
函数:它应该是这样的:
primrec mult :: "nati ⇒ nati ⇒ nati" where
"mult Zero n = Zero" |
"mult (Suc m) n = add (mult m n) m"
函数编程/Lambda演算中的函数应用是绑定最强的操作,它与左边关联:类似于fxy
的东西意味着“f
应用于x
,结果应用于y
”——或者,由于Currying,等效地:函数f
应用于段落仪表x
和y
因此,类似于mult-Suc(Zero)n
的内容将被解读为mult-Suc-Zero n
,即函数mult
必须是一个包含三个参数的函数,即Suc
、Zero
和n
,这会导致类型错误。类似地,add((mult-m)m)
不起作用,因为这与add(mult m n m)
相同,这意味着add
是一个取一个参数的函数,而mult
是一个取三个参数的函数
最后,如果您解决了所有这些问题,您将得到另一个错误,即您在mult
函数的左侧有一个非基本模式。您无法在Suc Zero
之类的对象上进行模式匹配,因为它不是基本模式。如果您使用fun
而不是primrec
,您可以这样做,但它不是您在这里要做的是:您想处理Zero
和Suc
(参见我的解决方案)。在您的定义中,mult Zero n
甚至是未定义的