我想知道是否有可能实现这种依赖模式匹配。如您所见,我试图将多个值映射到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". *)
答案 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)