在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

这是一个简单的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->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自己的
半环理论
,因为我不太需要它。我的猜测是,这样做可能会有用,因为这些可以与
战术系列一起使用,从而帮助您实现证明的自动化。是否最好将半环理论作为此结构的一部分,以确保此结构的每个实例都支持此理论?现在我可以在这个结构中加入不构成环的值。是的,或者你可以自己使用
半环理论
,因为你需要的大部分功能可能已经存在了。