在Isabelle的情况下,没有递归的定义

时间:2016-07-28 11:15:41

标签: 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并返回germ x U ( -⇩a ⇘objectsmap U⇙ s )的函数。这里没有什么是递归的。

有没有解决这个问题的方法,或者通过允许我定义我想要的案例进行定义的更好方法?

1 个答案:

答案 0 :(得分:1)

请注意,这对Isabelle的语法来说并不奇怪,但if-condition与then-和else-branches之间没有任何联系。存在量词的范围自然以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 ...