如何在Coq中为大步和小步语义定义一个配置?

时间:2018-12-22 16:20:41

标签: coq

我试图定义有助于语句/代码/程序/算术/布尔表达式的配置,但是我发现自己必须为每种类型定义一个配置,这似乎是不必要的。是否可以在Coq中合并所有不同的案例?

$.ajax({
 type: 'GET'
 url: 'http://localhost:8000/users',
 success: function(response) { 
  console.log(response);
 },
 error: function(xhr, status, err) {
   console.log(xhr.responseText);
 }
});

然后我注意到对于大步和小步,我也有单独的配置。是否可以将它们合并为1个单一配置?

Inductive BigConfig : Type :=
  | B_AExpConf : AExp -> State -> BigConfig
  | B_BExpConf : BExp -> State -> BigConfig
  | B_StmtConf : Statement -> State -> BigConfig
  | B_BlkConf : Block -> State -> BigConfig
  | B_StateConf : State -> BigConfig
  | B_PgmConf : Program -> BigConfig.

1 个答案:

答案 0 :(得分:0)

正如我在评论中说的,BigConfigSmallConfig + State,这意味着,如果您像这样定义SmallConfig

Inductive SmallConfig : Type :=
  | S_AExpConf : AExp -> State -> SmallConfig
  | S_BExpConf : BExp -> State -> SmallConfig
  | S_StmtConf : Statement -> State -> SmallConfig
  | S_BlkConf : Block -> State -> SmallConfig
  | S_PgmConf : Program -> SmallConfig.

然后定义BigConfig的一种方法是:

Definition BigConfig : Type := sum SmallConfig State.

然后,您必须在BigConfigsum / inl上进行模式匹配,而不是对inr构造函数(不再存在)进行模式匹配。和SmallConfig情况下的inl构造函数。

match bconf with
| inl (S_AExpConf a s) => ...
| inl (S_BExpConf b s) => ...
...
| inr s (* this represents B_StateConf *) => ...
end