Class Coq:将表达式解析为多个实例

Class Coq:将表达式解析为多个实例,class,type-inference,coq,Class,Type Inference,Coq,在这样的场景中,我希望一个表达式解析为多个实例: Inductive SR: Prop := Sen | Inf. Parameter CA S: Prop. Parameter X: SR -> CA -> Prop -> Prop. Parameter X': SR -> CA -> Prop -> Set. Parameter XP: SR -> CA -> Prop -> Type. Definition iX' (t:bool):

在这样的场景中,我希望一个表达式解析为多个实例:

Inductive SR: Prop := Sen | Inf.
Parameter CA S: Prop.
Parameter X: SR -> CA -> Prop -> Prop.
Parameter X': SR -> CA -> Prop -> Set.
Parameter XP: SR -> CA -> Prop -> Type.

Definition iX' (t:bool): SR -> CA -> Prop -> Type := if t then X' else XP.

Context `{b:bool}`{c:bool}`{d:bool}`{s:SR}`{t:SR}`{u:SR}`{k:CA}`{l:CA}`{m:CA}`{o:Prop}`{p:Prop}`{q:Prop}.
Parameter foo: iX' b s k o.
Parameter foo'': iX' d u m q.
Parameter ss: S.

Class CON (f:bool) := an: if f then iX' b s k o -> iX' c t l p -> iX' d u m q else S -> S -> S.
Instance coni: CON true := fun (_:iX' b s k o) (_:iX' c t l p) => foo''.
Instance conj: CON false := fun (_:S) (_:S) => ss.

Check (_: CON false) ss.
Check (_: CON true) foo.
Check (_: CON _) ss.
Check (_: CON _) foo. (*Error: The term "foo" has type "iX' b s k o" while it is expected to have type "S".*)

有没有一种方法可以同时使用
(:CON)foo
(:CON)ss
?如果没有,请尝试在类和/或实例不同的情况下成功,同时在
中检查。。。ss
检查。。。foo
是相同的,并且分别解析为函数
fun(\uus:S)=>ss
fun(\uix'b S k o)(\uix'c t l p)=>foo'

有什么理由限制自己在这里使用实例吗?如果你已经在做这么多的黑客工作,那么你最好更进一步,在符号方面使用策略

Ltac mkcon arg :=
  match constr:(Set) with
  | _ => exact ((_ : CON false) arg)
  | _ => exact ((_ : CON true) arg)
  end.

Notation CON_ arg := ltac:(mkcon arg) (only parsing).

Check (_: CON false) ss.
Check (_: CON true) foo.
Check CON_ ss.
Check CON_ foo.

谢谢,这个技巧w/
匹配=>…|=>超出了我的知识范围是的,这是一个有用的设计模式,用于回溯类型检查失败。不过,在本例中,
首先[exact…| exact…]
也可以使用,而且可能更为传统。是否有一个简单的场景,
与|=>…|=>可以工作,但第一个[精确…|精确…][/code>失败?您可以始终在
constr:(ltac:(…)
中包装第二个,使其返回一个constr,但是编写
匹配constr:(Set)和=>constr:(x:T1)| u=>constr:(x:T2)end