Isabelle Real数据类型-定义格式错误:顺序模式中不允许使用非构造函数模式

Isabelle Real数据类型-定义格式错误:顺序模式中不允许使用非构造函数模式,isabelle,Isabelle,我正在创建表单的一个函数 y(t+h)=y(t)+h/y(t) 其中y(0)=1 fun y::“真的⇒ 真正的“哪里 “y 0=Suc(0)”| “y(t+h)=y(t)+h*(1/y(t))” 不幸的是,我得到了一个错误 定义格式错误:顺序模式中不允许使用非构造函数模式 y 0=实际值(Suc 0) 谷歌告诉我,我没有遵循某些真正数据类型的构造函数模式,但我无法找到该模式是什么以及应该如何更改我的函数 实数不是代数数据类型,因此无法使用fun对其进行模式匹配。您必须使用“普通”等式定义或函数

我正在创建表单的一个函数

y(t+h)=y(t)+h/y(t)

其中y(0)=1

fun y::“真的⇒ 真正的“哪里
“y 0=Suc(0)”|
“y(t+h)=y(t)+h*(1/y(t))”

不幸的是,我得到了一个错误

定义格式错误:顺序模式中不允许使用非构造函数模式

y 0=实际值(Suc 0)


谷歌告诉我,我没有遵循某些真正数据类型的构造函数模式,但我无法找到该模式是什么以及应该如何更改我的函数

实数不是代数数据类型,因此无法使用
fun
对其进行模式匹配。您必须使用“普通”等式定义或函数包的一些更高级的功能,但这也使事情变得更加困难,因为您必须自己证明一些定义良好的属性

此外,右侧的
suc0
是一个自然数,而不是实数。(只需写
1

然而,你的定义最大的问题是你写下它的方式太不正式了。我甚至不明白这是什么意思

  • 您对
    h
    有什么假设
  • 第二个等式对什么是有效的
  • 当为
    t
    输入负值时会发生什么情况?(你写的方式:不终止)
  • 0
    时会发生什么

一旦你对你想要定义的函数有了一个精确的数学描述,你就可以用
函数
命令写下它,而不必太头疼实数不是代数数据类型,所以你不能用
乐趣来匹配它们。您必须使用“普通”等式定义或函数包的一些更高级的功能,但这也使事情变得更加困难,因为您必须自己证明一些定义良好的属性

此外,右侧的
suc0
是一个自然数,而不是实数。(只需写
1

然而,你的定义最大的问题是你写下它的方式太不正式了。我甚至不明白这是什么意思

  • 您对
    h
    有什么假设
  • 第二个等式对什么是有效的
  • 当为
    t
    输入负值时会发生什么情况?(你写的方式:不终止)
  • 0
    时会发生什么

一旦你对你想要定义的函数有了一个精确的数学描述,你就可以用
函数
命令把它写下来,而不必太头疼。实际的等式是dy/dt=1/y。我试图用欧拉方法来找到一个解决方案。因此方程n变成(y(t+h)-y(t))/h=1/y。h是一个非常小的数字。hWell,你仍然必须回答这个问题:你试图定义一个函数
y
,而
h
是一个小的正实数。
t的
y
值是多少∈ (0;h)
?是否可以定义一个增量步骤h,使(t+h)成为下一个最小值?抱歉,但鉴于我甚至不理解抽象数学层次上的函数
y
应该是什么,我真的无法帮你理解Isabelle。至于Euler的方法,我想说它并没有定义一个完整的函数y:ℝ→ℝ, 而是一系列数字(即y:ℕ→ℝ) 在时间点0、h、2h、3h等处实际函数的连续近似。您可以将其作为函数
nat写入Isabelle⇒ real
或a
real stream
,但前者可能更适合这种情况。实际方程为dy/dt=1/y。我试图使用Euler方法来找到解决方案。因此方程为(y(t+h)-y(t))/h=1/y。h是一个非常小的数字。不过,你必须回答这个问题:你正在试图定义一个函数
y
,而
h
是一个小的正实数。对于
t,
y
的值是多少∈ (0;h)
?是否可以定义使(t+h)增加的增量步骤h下一个可能的最小值?抱歉,但鉴于我甚至不理解函数
y
在抽象数学层面上应该是什么,我真的无法帮助你理解Isabelle。至于Euler的方法,我想说它没有定义整个函数y:ℝ→ℝ, 而是一系列数字(即y:ℕ→ℝ) 在时间点0、h、2h、3h等处实际函数的连续近似。您可以将其作为函数
nat写入Isabelle⇒ real
real stream
,但前者可能更适合这种情况。