我正在尝试在集合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
并返回germ x U ( -⇩a ⇘objectsmap U⇙ s )
的函数。这里没有什么是递归的。
有没有解决这个问题的方法,或者通过允许我定义我想要的案例进行定义的更好方法?
答案 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 ...