在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
甚至是未定义的