如何在Coq中定义特定字段

如何在Coq中定义特定字段,coq,abstract-algebra,Coq,Abstract Algebra,我试图在Coq中使用标准库对标准库的布尔实现上的字段定义来构造GF(2) 要明确的是: “true”应该是字段的“1”元素 “false”应该是字段的“0”元素 “xorb”应该是addititon “andb”应该是乘法 我希望我必须将这些信息传递给来自的一些记录,并提供正确性证明。但是,我不知道如何设置它 在标准库字段结构中,首先需要展示该字段所在的环形结构。对于这个环结构,我们需要弄清楚什么是相反的函数,什么是减法函数。答案是:相反的是恒等函数,减法也是xorb。所以我们首先要表示,f

我试图在Coq中使用标准库对标准库的布尔实现上的字段定义来构造GF(2)

要明确的是:

  • “true”应该是字段的“1”元素

  • “false”应该是字段的“0”元素

  • “xorb”应该是addititon

  • “andb”应该是乘法


我希望我必须将这些信息传递给来自的一些记录,并提供正确性证明。但是,我不知道如何设置它

在标准库字段结构中,首先需要展示该字段所在的环形结构。对于这个环结构,我们需要弄清楚什么是相反的函数,什么是减法函数。答案是:相反的是恒等函数,减法也是xorb。所以我们首先要表示,
false
true
xorb
和b
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\u理论
field\u理论
实际上是实施
ring
field
策略的中间工具。因此,您可以在
Add Field
命令中使用object GF2_字段,但是在GF(2)的情况下,这些策略不如在number字段中有用


如果你对代数结构感兴趣,我想你应该看看像或这样的发展。

我可能会回答你的问题,但在我想知道之前:你想用场论做什么?对不起,我没有及时看到这一点。我试图研究一些关于GF(2)上多项式的想法。基本上,我想在多项式和某个不动点之间找到一个双射。这很有帮助。给出一个场论证明,它会给你一组定理和符号吗?场论没有符号。对于定理,请尝试
检查Fdiv_def GF2_字段。
检查环理论.Radd_comm(F_R GF2_字段)。