{0,1}作为Isabelle中的函数类型

{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

我正在尝试编写一个函数,该函数接受第二个参数,该参数可以是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 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您刚才给了我一个关于布尔运算的非常好的想法,我现在将尝试一下,谢谢