将Maude代码翻译为Coq

时间:2018-02-03 13:39:24

标签: coq

我想将之前写过的Maude代码翻译成Coq,因为Coq比Maude具有更强大的表达能力。

我不知道如何表示以下代码: enter image description here

如上所示, GuardPostfix 有三个子类别: GuardPostfix1 GuardPostfix2 GuardPostfix3

我使用归纳类型来表示 GC组件。但是,在定义 GComponent 类型时, GComponent1 有两个构造函数,分别使用构造函数 GuardPostfix1 GuardPostfix2

如何在Coq中定义这些类型?

1 个答案:

答案 0 :(得分:2)

我认为通常的方法是将所有Maude排序转换为Coq类型,并将Maude子排关系表示为具有所有子排序的构造函数的超级输出(例如,subsort A B < C变为Definition C := A + B)。遵循这个一般规则,这是我如何翻译你的例子。请注意,我不知道Maude,所以我可能错过了关于示例本身的一些内容。另外,我强烈考虑为+GuardPostfix使用新的归纳类型(GComponent),但这取决于您。

Module GuardedComponent.

  Parameter BoolExp:Type.
  Parameter Assignment:Type.
  Parameter Program:Type.
  Parameter Index:Type.
  Parameter EndPoint:Type.
  Parameter Null:Type.
  Parameter EventGuard:Type.
  Parameter TimeControl:Type.

  Inductive AssignmentGuard :=
  | mkAssignmentGuard (_:BoolExp) (_:Assignment).

  Inductive GuardPostfix1 :=
  | mkGuardPostfix1 (_:Program) (_:Index).

  Inductive GuardPostfix2 :=
  | mkGuardPostfix2 (_:Program) (_:EndPoint).

  Inductive GuardPostfix3 :=
  | mkGuardPostfix3 (_:Program) (_:Null).

  Definition GuardPostfix : Type :=
    GuardPostfix1 + GuardPostfix2 + GuardPostfix3.

  Inductive GComponent1 :=
  | comp1_post1 (_:GuardPostfix1)
  | comp1_post2 (_:GuardPostfix2).

  Inductive GComponent2 :=
  | mkGComponent2 (_:EventGuard) (_:GuardPostfix3).

  Inductive GComponent3 :=
  | mkGComponent3 (_:TimeControl) (_:GuardPostfix3).

  Definition GComponent : Type :=
    GComponent1 + GComponent2 + GComponent3.

End GuardedComponent.