我正在尝试使用标准库的布尔实现上的字段的标准库定义在Coq中构造GF(2)。
要明确:
“true”应该是字段的“1”元素。
“false”应该是字段的“0”元素。
“xorb”应该是addititon。
“andb”应该是乘法。
我希望我必须将此信息传递给here的某些记录并提供正确性证据。但是,我无法弄清楚如何设置它。
答案 0 :(得分:1)
在标准库字段结构中,首先需要展示此字段所在的环结构。对于这个环结构,我们需要弄清楚什么作为相反的函数和什么作为减法函数。答案是:相反的是身份函数,减法也是xorb
。因此,我们首先要表达的是false
,true
,xorb
,andb
,xorb
和(fun x => x)
构成一个环。在Coq的情况下,我们还需要指定我们将使用什么等价关系来识别环的两个项,在这种情况下,我们选择普通等式@eq bool
。为了描述这样的环结构,我们需要创建一个类型的对象。
Ring_theory.ring_theory false true xorb andb xorb (fun x => x) (@eq bool).
最简单的方法是,只是说我们想要这样做,而不提供结构的价值,并使用证明模式来帮助发现需要的所有命题验证。
Definition GF2_ring :
Ring_theory.ring_theory false true xorb andb xorb (fun x => x) (@eq bool).
系统的答案只是重复预期的类型。我们现在可以告诉Coq我们想要应用记录构造函数。
apply Ring_theory.mk_rt.
这创建了9个目标,每个目标都验证了一个环的预期属性:中性元素属性,关联性,交换性,分布性和相反函数的属性。
您可以搜索表达所有这些属性的现有定理,但另一种可能性是通过检查所有变量的所有可能情况来验证这些属性。这是在以下完整证明中完成的。
Require Import Field.
Definition GF2_ring :
Ring_theory.ring_theory false true xorb andb xorb (fun x => x) (@eq bool).
Proof.
apply Ring_theory.mk_rt;
solve[now intros [] | now intros [] [] | now intros [] [] []].
Qed.
可以使用类似的证明结构来完成字段结构。
Definition GF2_Field :
field_theory false true xorb andb xorb (fun x => x) andb (fun x => x) (@eq bool).
constructor; try solve[exact GF2_ring | now easy ].
now intros [] abs; auto; try case abs.
Qed.
现在,给你的是什么? ring_theory
和field_theory
实际上是用于实施ring
和field
策略的中间工具。因此,您可以在Add Field
命令中使用对象GF2_Field,但在GF(2)的情况下,这些策略并不像数字字段那样有用。
如果您对代数结构感兴趣,我认为您应该考虑mathematical components或math classes等发展。