在Coq中使用半环
这是一个简单的Coq语法新手问题。:) 我试图定义半环上的简单多项式函数:在Coq中使用半环,coq,Coq,这是一个简单的Coq语法新手问题。:) 我试图定义半环上的简单多项式函数: Require Import Vector. Import VectorNotations. Require Import Ring_theory. Section Polynomial_def. Variable Asring : Type. Variable (asr_0 asr_1 : Asring) (asr_add asr_mul: Asring->Asring->As
Require Import Vector.
Import VectorNotations.
Require Import Ring_theory.
Section Polynomial_def.
Variable Asring : Type.
Variable (asr_0 asr_1 : Asring) (asr_add asr_mul: Asring->Asring->Asring).
Variable SRth : semi_ring_theory asr_0 asr_1 asr_add asr_mul eq.
Fixpoint evalPolynomial {n} (a: t Asring n) (x:Asring) : Asring :=
match a with
nil => asr_0
| cons a0 p a' => asr_add a0 (asr_mul x (evalPolynomial a' x))
end.
End Polynomial_def.
例如,当我在Reals上使用它时,我必须这样做:
Require Import Reals.Rdefinitions.
evalPolynomial R R0 Rplus Rmult a v
我想应该有一种更简单的语法,我可以只传递单个数据结构(如Isabelle中的
comm\u ring\u 1
),它将封装给定类型的所有字段,如R、R0、Rplus、Rmult。是的,您可以将所有参数打包到一个结构中,然后将其作为参数传递,比如
Structure semiring := Semiring {
Asring : Type;
asr_0 : Asring;
asr_1 : Asring;
asr_add : Asring -> Asring -> Asring
(* Other fields... *)
}.
然后,您可以根据此结构重新表述您的开发:
Section Polynomial_def.
Variable sr := semiring.
Fixpoint evalPolynomial {n} (a: t (Asring sr) n) (x:Asring sr) : Asring sr :=
(* ... *)
稍后,当尝试使用它时,您只需构建这样一个结构并将其作为普通参数传递。您还可以使用Coq类型类或规范结构来告诉Coq如何自动传递此类参数 我需要使用
半环理论吗
?我没有想到Coq自己的半环理论
,因为我不太需要它。我的猜测是,这样做可能会有用,因为这些可以与环
战术系列一起使用,从而帮助您实现证明的自动化。是否最好将半环理论作为此结构的一部分,以确保此结构的每个实例都支持此理论?现在我可以在这个结构中加入不构成环的值。是的,或者你可以自己使用半环理论,因为你需要的大部分功能可能已经存在了。