我找到了64位浮点和32位有符号整数运算的基元。我没有找到64位无符号整数运算的原语。没有这些,在Agda上处理64位uint算法的正确方法是什么?
答案 0 :(得分:1)
似乎是present on 2.5.4
。 (正好比我使用的版本高一个版本。)
添加了对内置64位机器字的支持。
这些在Agda.Builtin.Word中定义,并带有两个基本操作来转换为自然数和从自然数转换。
Word64 : Set primWord64ToNat : Word64 → Nat primWord64FromNat : Nat → Word64
转换为自然数是一个简单的嵌入,从自然数转换为你提供模2 ^ 64的余数。这些定理的证明不是原始的,但可以使用primTrustMe在库中定义。
可以通过转换为自然数,执行相应的操作,然后转换回来在Word64上定义基本算术运算。编译器将优化这些以使用64位算术。例如,
addWord : Word64 → Word64 → Word64 addWord a b = primWord64FromNat (primWord64ToNat a + primWord64ToNat b) subWord : Word64 → Word64 → Word64 subWord a b = primWord64FromNat (primWord64ToNat a + 18446744073709551616 - primWord64ToNat b)
这些编译(在GHC后端)到Data.Word.Word64上的加法和减法