在Coq中使用semirings

时间:2014-10-08 18:45:40

标签: coq

这是一个简单的Coq语法新手问题。:)

我试图在semi_rings上定义简单的多项式函数:

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_ring_1),它将封装所有字段,如R,R0,Rplus,Rmult,用于给定类型。

1 个答案:

答案 0 :(得分:1)

是的,您可以将所有参数打包在一个结构中,然后将其作为参数传递,例如

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如何自动传递这些参数。