{0,1}作为Isabelle中的函数类型
我正在尝试编写一个函数,该函数接受第二个参数,该参数可以是0或1:{0,1}作为Isabelle中的函数类型,isabelle,Isabelle,我正在尝试编写一个函数,该函数接受第二个参数,该参数可以是0或1: typedef f_2 = "{0::nat,1}" function proj_add :: "(real × real) × f_2 ⇒ (real × real) × f_2 ⇒ (real × real) × f_2" where "proj_add ((x1,y1),l) ((x2,y2),j) = ((add (x1,y1) (x2,y2)), (l+j) mod 2)" if "delta x1 y
typedef f_2 = "{0::nat,1}"
function proj_add :: "(real × real) × f_2 ⇒ (real × real) × f_2 ⇒ (real × real) × f_2" where
"proj_add ((x1,y1),l) ((x2,y2),j) = ((add (x1,y1) (x2,y2)), (l+j) mod 2)"
if "delta x1 y1 x2 y2 ≠ 0"
| "proj_add ((x1,y1),l) ((x2,y2),j) = ((ext_add (x1,y1) (x2,y2)), (l+j) mod 2)"
if "delta' x1 y1 x2 y2 ≠ 0"
如果我直接写{0::nat,1}
我会得到内部语法错误
如果我写f_2
我会得到错误的未定义类型名f_2
在Isabelle中编写此定义的正确方法是什么?理论
HOL库中有类型bit
。bit
包含两个元素0
和1
。这包含了使0
和1
符号适用于位
s(包括模式匹配)所需的所有设置。我可以想到几个选项,但如果不知道如何使用函数,很难说出最佳选项。1). 使用布尔值代替nat,并在函数应用前后应用转换;2). 使用普通的nat
,只在证明函数行为的定理中担心输入;3). 使用HOL库中的一种数字类型。数字类型
(例如1::2
)。我很难理解为什么需要为此应用程序定义新的类型构造函数。然而,当然,如果您决定这样做,您需要证明命令typedef
所实现的目标,然后才能使用它:typedef_2=“{0::nat,1}”by auto
。但是,在这种情况下,您还需要为它提供基础设施(例如定义加法、乘法等)-查看主库中的理论Nat
和Int
,了解如何实现这一点。@xanonec您刚才给了我一个关于布尔运算的非常好的想法,我现在将尝试一下,谢谢