我想将之前写过的Maude代码翻译成Coq,因为Coq比Maude具有更强大的表达能力。
如上所示, GuardPostfix 有三个子类别: GuardPostfix1 , GuardPostfix2 和 GuardPostfix3 。
我使用归纳类型来表示 GC组件。但是,在定义 GComponent 类型时, GComponent1 有两个构造函数,分别使用构造函数 GuardPostfix1 和 GuardPostfix2 。
如何在Coq中定义这些类型?
答案 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.