使用 Cryptol 实现 MAA 算法
Implementing MAA algorithm using Cryptol
我尝试使用 Cryptol 实现 MAA 算法。这是我到目前为止所做的,但我并不幸运。有任何想法吗?
main: ([32], [32]) -> [32]
main (x , y) = add (x , y)x
where x = (take`{16} xy, drop`{16} xy)
where xy = mul1 (x , y)
mul1: ([32] ,[32]) -> [32]
mul1 (x , y) = xy
where xy = x * y
add: ([16] ,[16]) -> [16]
add (x , y) = xy
where xy = x + y
你的主要有一些错误。
add (x , y)x
说什么?参数过多
main (x , y) = ...
和 where x = ...
那么现在 x 等于多少?如果可以,请不要隐藏变量名。
where x = ...
和 where xy = ...
使用单个 `where 而不是嵌套只是为了保持整洁,嗯?
终于有类型错误了。 Add 给你一个 16 位数(看看类型签名)所以它的结果不能也是 main
谁的类型表明它的结果 returns 一个 32 位数。 32 不等于 16。我已经通过更改 main
的类型来解决这个问题和上面的问题,但这可能不是您想要的,因此您需要在此处添加您想要的任何逻辑(例如:零扩展或符号扩展?)。
代码:
main: ([32], [32]) -> [16]
main (x , y) = add xy16
where xy16 = (take`{16} xy, drop`{16} xy)
xy = mul1 (x , y)
mul1: ([32] ,[32]) -> [32]
mul1 (x , y) = xy
where xy = x * y
add: ([16] ,[16]) -> [16]
add (x , y) = xy
where xy = x + y
现在大概这是你原来问题的缩减版本,但如果没有注意到你真的不需要定义一个函数 add
只是为了使用 +
并且同样适用于 mul
。此外,您不需要 take
和 drop
上的显式类型注释,因为可以推断出这些类型。例如:
main2 : [32] -> [32] -> [16]
main2 x y = take xy + drop xy where xy = x * y
然后我们可以做显而易见的事情:
Main> :prove \x y -> main (x,y) == main2 x y
Q.E.D.
我尝试使用 Cryptol 实现 MAA 算法。这是我到目前为止所做的,但我并不幸运。有任何想法吗?
main: ([32], [32]) -> [32]
main (x , y) = add (x , y)x
where x = (take`{16} xy, drop`{16} xy)
where xy = mul1 (x , y)
mul1: ([32] ,[32]) -> [32]
mul1 (x , y) = xy
where xy = x * y
add: ([16] ,[16]) -> [16]
add (x , y) = xy
where xy = x + y
你的主要有一些错误。
add (x , y)x
说什么?参数过多main (x , y) = ...
和where x = ...
那么现在 x 等于多少?如果可以,请不要隐藏变量名。where x = ...
和where xy = ...
使用单个 `where 而不是嵌套只是为了保持整洁,嗯?
终于有类型错误了。 Add 给你一个 16 位数(看看类型签名)所以它的结果不能也是 main
谁的类型表明它的结果 returns 一个 32 位数。 32 不等于 16。我已经通过更改 main
的类型来解决这个问题和上面的问题,但这可能不是您想要的,因此您需要在此处添加您想要的任何逻辑(例如:零扩展或符号扩展?)。
代码:
main: ([32], [32]) -> [16]
main (x , y) = add xy16
where xy16 = (take`{16} xy, drop`{16} xy)
xy = mul1 (x , y)
mul1: ([32] ,[32]) -> [32]
mul1 (x , y) = xy
where xy = x * y
add: ([16] ,[16]) -> [16]
add (x , y) = xy
where xy = x + y
现在大概这是你原来问题的缩减版本,但如果没有注意到你真的不需要定义一个函数 add
只是为了使用 +
并且同样适用于 mul
。此外,您不需要 take
和 drop
上的显式类型注释,因为可以推断出这些类型。例如:
main2 : [32] -> [32] -> [16]
main2 x y = take xy + drop xy where xy = x * y
然后我们可以做显而易见的事情:
Main> :prove \x y -> main (x,y) == main2 x y
Q.E.D.