Coq:麻烦与依赖模式匹配

时间:2017-05-26 20:33:38

标签: pattern-matching coq

我想知道是否有可能实现这种依赖模式匹配。如您所见,我试图将多个值映射到nul(并指示输出具有所需类型w / return子句)。类型N是垃圾收集器,我只是想在

之后删除所有值
| P, c => phy
| P, b => phy
| Ii, b => inf

(在此特定设置中,使用option类型似乎非常笨拙。)请注意,如果Coercion在这里不可能,我也很高兴w / Definition < / p>

Inductive R := P | Ii | S | N.
Parameter rp:> R -> Prop.
Inductive X: Type := | c {z:P} :> X | b {z:P} {y:Ii} :> X.
Parameter (phy:P) (inf:Ii) (sen:S) (nul:N).

Check phy: id P.
Fail Coercion xi(y:R)(x:X): id y := match y, x with
| P, c => phy
| P, b => phy
| Ii, b => inf
| _, _ => match _ return N with _ => nul end end.
(* The term "nul" has type "rp N" while it is expected to have type "rp Ii". *)

2 个答案:

答案 0 :(得分:1)

你说“我只是试图摆脱......之后的所有值”,我有点担心有多个默认值没有区别特征,我怀疑你的代码不会做您认为它会怎样,但您可以这样做:

Inductive R := P | Ii | S | N.
Parameter rp:> R -> Prop.
Inductive X: Type := | c {z:P} :> X | b {z:P} {y:Ii} :> X.
Parameter (phy:P) (inf:Ii) (sen:S) (nul:N).

Check phy: id P.
Definition xi(y:R)(x:X): id y
  := match y, x with
     | P, c => phy
     | P, b => phy
     | Ii, b => inf
     | Ii, _ => inf
     | S, _ => sen
     | N, _ => nul
     end.

请注意,您也可以这样做:

Definition xi(y:R)(x:X): id y
  := match y with
     | P => phy
     | Ii => inf
     | S => sen
     | N => nul
     end.

你不能强迫这一点,因为无法从y推断x

如果你关心的是值而不是类型,你可以使用依赖类型来获得你想要的返回类型:

Inductive R := P | Ii | S | N.
Parameter rp:> R -> Prop.
Inductive X: Type := | c {z:P} :> X | b {z:P} {y:Ii} :> X.
Parameter (phy:P) (inf:Ii) (sen:S) (nul:N).

Check phy: id P.
Definition xi_type(y:R)(x:X)
  := match y, x return Type with
     | P, c
     | P, b
     | Ii, b
       => y
     | _, _
       => N
     end.
Definition xi(y:R)(x:X): xi_type y x
  := match y, x return xi_type y x with
     | P, c => phy
     | P, b => phy
     | Ii, b => inf
     | _, _ => nul
     end.

答案 1 :(得分:0)

一个较短的解决方案,其定义返回“匹配类型”:

this.onClickSave = this.onClickSave.bind(this);

找到了想法here