我正在尝试在Isabelle中表示投影椭圆曲线加法:
function proj_add :: "(real × real) × bit ⇒ (real × real) × bit ⇒ (real × real) × bit" where
"proj_add ((x1,y1),l) ((x2,y2),j) = ((add (x1,y1) (x2,y2)), l+j)"
if "delta x1 y1 x2 y2 ≠ 0"
| "proj_add ((x1,y1),l) ((x2,y2),j) = ((ext_add (x1,y1) (x2,y2)), l+j)"
if "delta' x1 y1 x2 y2 ≠ 0"
到目前为止,我已经学会了如何进行条件定义,并建议对{0,1}中的值使用位类型。这是第三个表示问题。假设以下定义:
definition "e_aff = {(x,y). e' x y = 0}"
definition "e_circ = {(x,y). x ≠ 0 ∧ y ≠ 0 ∧ (x,y) ∈ e_aff}"
投影椭圆曲线的定义如下:(请参见第12、13 here页):
沿着同构τ沿e_circ粘贴e_aff的两个副本。我们使用e_aff的第一个副本为E中的P∈e_aff的图像写(P,i)∈E,其中i∈{0,1}。胶合条件为P∈e_circ,(P,i) =(τP,i + 1)
我该如何在Isabelle中代表这个场景?我的想法是,这应该是一个由一个或两个元素组成的等价类的商集。但是,如何限制上述功能在这些等效类上起作用?
修改
等价关系是通过将该关系与使其成为反身的or条件组合而成的。
答案 0 :(得分:0)
这是我遵循的方法的草图:
definition "proj_add_class c1 c2 =
(((case_prod (λ x y. the (proj_add x y))) `
(Map.dom (case_prod proj_add) ∩ (c1 × c2)))
// gluing)"
definition "proj_addition c1 c2 = the_elem(proj_add_class c1 c2)"