作为一种学习经验,我正在尝试使用AGDA中的持续通话风格来实现经过验证的常规表达匹配器,这是基于 我有这样定义的正则表达式的类型:
data RE : Set where
ε : RE
∅ : RE
Lit : Char -> RE
_+_ : RE -> RE -> RE
_·_ : RE -> RE -> RE
_* : RE -> RE
和一种类型的证明字符串与这样匹配的证明:
data REMatch : List Char -> RE -> Set where
EmptyMatch : REMatch [] ε
LitMatch : (c : Char) -> REMatch (c ∷ []) (Lit c)
...
ConcatMatch :
(s1 : List Char) (s2 : List Char ) (r1 : RE) (r2 : RE)
-> REMatch s1 r1
-> REMatch s2 r2
-> REMatch (s1 ++ s2) (r1 · r2)
我正在试图为我的匹配器编写正确的证明,但是在我尝试获得证明之前,我的模式匹配项会遇到类型错误:
accCorrect :
(r : RE) (s : List Char) (s1 : List Char) (s2 : List Char) (k : (List Char -> Bool))
-> ( (s1 ++ s2) ≡ s)
-> (REMatch s1 r)
-> (k s2 ≡ true)
-> (acc r s k ≡ true )
accCorrect ε [] [] [] k _ EmptyMatch kproof = kproof
accCorrect (r1 · r2) s s1 s2 k splitProof (ConcatMatch s1' s1'' r1' r2' subMatch1 subMatch2 ) kproof = ?
,这给出以下错误:
r2' != r2 of type RE
when checking that the pattern
ConcatMatch s1' s1'' r1' r2' subMatch1 subMatch2 has type
REMatch s1 (r1 · r2)
,但是,如果我用
r2'
替换下强调
r2
,我会得到一个“重复变量”错误。
除了
(r1 · r2)
构建器外,无法构建匹配。 我的问题:
我如何说服类型检查器,从模式匹配中,
ConcatMatch
和r2
是相等的?任何类型的参数都必须使用参数r2'
和REMatch s1 (r1 · r2)
构建
ConcatMatch
构造函数,但是我不知道如何在模式匹配中证明这种情况。
为什么AGDA具有点模式:
r1
I.E。只是放在应该推断的表达式之前。或者,您可以(并且应该)使用隐式参数:
r2
如何遇到更多复杂的问题,因为您已经触摸了绿色史莱姆(术语是由于Conor McBride引起的):