没有递归的定义,按案例,在伊莎贝尔
Definition without recursion, by cases, in Isabelle
我试图在集合 stalk x
上定义一元运算,其典型元素的形式为 germ x U s
。在这种情况下,无法以减少到我想要的方式定义与 germ x U s
相同类型的一般事物的操作,所以看起来我真的必须求助于案例定义.我尝试了以下
definition stalk_mop2 :: "'a ⇒( ('a set × 'a) set ⇒ ('a set × 'a) set ) " where
"stalk_mop2 x y = ( (λ z . if (∃ U s. y= germ x U s ) then
(germ x U ( -⇩a ⇘objectsmap U⇙ s ) ) else undefined) z ) " ,
并得到 U s
是 RHS 上的额外变量的错误消息。似乎通过使用这种语法,Isabelle 并没有在 if
假设和后面的术语之间建立联系,所以虽然我确实在条件语句中绑定了 U
和 s
,但显然将下一次出现的 U
和 s
(在 then
之后)解释为自由变量。
我真正想要的只是一个采用 x
以及 germ x U s
和 returns germ x U ( -⇩a ⇘objectsmap U⇙ s )
形式的函数。这里没有什么是递归的。
是否有解决此问题的方法,或者是否有更好的方法来根据案例进行定义,让我可以定义我想要的内容?
请注意,这对 Isabelle 的语法来说并不奇怪,但是,if 条件与 then 和 else 分支之间没有任何联系。存在量词的范围自然以then
.
结尾
如果你想为你知道存在的东西获得见证,你可以使用希尔伯特的选择运算符,例如,SOME (U, s). y = germ x U s)
给你一对 (U, s)
满足 y = germ x U s
如果这样的话一对存在(您通过 if 条件确定),否则未定义。
那么怎么样:
definition stalk_mop2 :: "'a ⇒(('a set × 'a) set ⇒ ('a set × 'a) set)"
where
"stalk_mop2 x y = ((λz .
if ∃U s. y = germ x U s then
let (U, s) = (SOME (U, s). y = germ x U s) in
germ x U (-⇩a ⇘objectsmap U⇙ s)
else undefined) z)"
更新:您可以通过以下方式之一使用多个let
let x1 = e1 in let x2 = e2 in ...
或
let x1 = e1; x2 = e2; ... in ...
我试图在集合 stalk x
上定义一元运算,其典型元素的形式为 germ x U s
。在这种情况下,无法以减少到我想要的方式定义与 germ x U s
相同类型的一般事物的操作,所以看起来我真的必须求助于案例定义.我尝试了以下
definition stalk_mop2 :: "'a ⇒( ('a set × 'a) set ⇒ ('a set × 'a) set ) " where
"stalk_mop2 x y = ( (λ z . if (∃ U s. y= germ x U s ) then
(germ x U ( -⇩a ⇘objectsmap U⇙ s ) ) else undefined) z ) " ,
并得到 U s
是 RHS 上的额外变量的错误消息。似乎通过使用这种语法,Isabelle 并没有在 if
假设和后面的术语之间建立联系,所以虽然我确实在条件语句中绑定了 U
和 s
,但显然将下一次出现的 U
和 s
(在 then
之后)解释为自由变量。
我真正想要的只是一个采用 x
以及 germ x U s
和 returns germ x U ( -⇩a ⇘objectsmap U⇙ s )
形式的函数。这里没有什么是递归的。
是否有解决此问题的方法,或者是否有更好的方法来根据案例进行定义,让我可以定义我想要的内容?
请注意,这对 Isabelle 的语法来说并不奇怪,但是,if 条件与 then 和 else 分支之间没有任何联系。存在量词的范围自然以then
.
如果你想为你知道存在的东西获得见证,你可以使用希尔伯特的选择运算符,例如,SOME (U, s). y = germ x U s)
给你一对 (U, s)
满足 y = germ x U s
如果这样的话一对存在(您通过 if 条件确定),否则未定义。
那么怎么样:
definition stalk_mop2 :: "'a ⇒(('a set × 'a) set ⇒ ('a set × 'a) set)"
where
"stalk_mop2 x y = ((λz .
if ∃U s. y = germ x U s then
let (U, s) = (SOME (U, s). y = germ x U s) in
germ x U (-⇩a ⇘objectsmap U⇙ s)
else undefined) z)"
更新:您可以通过以下方式之一使用多个let
let x1 = e1 in let x2 = e2 in ...
或
let x1 = e1; x2 = e2; ... in ...