Function 错误:';顺序模式下不允许使用非构造函数模式';(伊莎贝尔)

Function 错误:';顺序模式下不允许使用非构造函数模式';(伊莎贝尔),function,sum,syntax-error,isabelle,Function,Sum,Syntax Error,Isabelle,我试图定义一个函数,它将f从0到k-1求和,这样 Sum f k = f 0 + ⋯ + f (k - 1). 我将其定义如下: fun Sum :: "(nat => nat) => nat => nat" where "Sum f 1 = f 0" | "Sum f k = f (k-1) + Sum f (k-1)" 但是,这会给出以下错误消息: Malformed definition: Non-constructor pattern not allowed i

我试图定义一个函数,它将f从0到k-1求和,这样

Sum f k = f 0 + ⋯ + f (k - 1).
我将其定义如下:

fun Sum :: "(nat => nat) => nat => nat" where
  "Sum f 1 = f 0"
| "Sum f k = f (k-1) + Sum f (k-1)"
但是,这会给出以下错误消息:

Malformed definition:
Non-constructor pattern not allowed in sequential mode.
⋀f. Sum f 1 = f 0
当我定义
Sum f0=f0
时,此错误消息消失,但这不是我试图定义的函数。我也可以使用
函数
并亲自进行可靠性验证,但如果有必要的话,我会非常惊讶


是否有人可以解释错误消息并建议解决方法/更正?

您只能在模式匹配中使用构造函数。
nat
的构造函数是
0
Suc
。因此,如果你把
1
写成
(suc0)
,它应该可以工作。

谢谢,我听从了你的建议,但现在它有了“未完成的子目标”。我希望这意味着我需要使用
函数
,尽管我不想这样做。好吧,我尝试了
有趣的求和::“(nat=>nat)=>nat=>nat”,其中“Sum f0=0”|“Sum f(Suc k)=fk+Sum fk”
,这似乎奏效了!我想它应该是
Suc
无处不在(现在“基本情况”更有意义了)。您得到了未完成的子目标,因为您最初的定义没有终止:
sumf0=f(0-1)+sumf(0-1)=f0+sumf0=…
。添加0的案例修复了此问题。