没有递归的定义,按案例,在伊莎贝尔

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 假设和后面的术语之间建立联系,所以虽然我确实在条件语句中绑定了 Us,但显然将下一次出现的 Us(在 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 ...