Types Agda:模式匹配相等变量?

Types Agda:模式匹配相等变量?,types,functional-programming,agda,dependent-type,Types,Functional Programming,Agda,Dependent Type,作为学习经验,我尝试在Agda中使用延续传递样式实现一个经过验证的正则表达式匹配器,该样式基于中提出的样式 我有一个正则表达式的类型,定义如下: 数据重新:设置位置 ε:RE ∅ : 重新 点亮:字符->重 _+_:RE->RE->RE _···:RE->RE->RE _*:RE->RE 以及一个类型,用于证明字符串与RE匹配,如下所示: 数据重新匹配:列表字符->重新->设置位置 空匹配:重新匹配[]ε LitMatch:(c:Char)->重新匹配(c∷ [])(轻c) ... Conca

作为学习经验,我尝试在Agda中使用延续传递样式实现一个经过验证的正则表达式匹配器,该样式基于中提出的样式

我有一个正则表达式的类型,定义如下:

数据重新:设置位置
ε:RE
∅ : 重新
点亮:字符->重
_+_:RE->RE->RE
_···:RE->RE->RE
_*:RE->RE
以及一个类型,用于证明字符串与RE匹配,如下所示:

数据重新匹配:列表字符->重新->设置位置
空匹配:重新匹配[]ε
LitMatch:(c:Char)->重新匹配(c∷ [])(轻c)
...
ConcatMatch:
(s1:列表字符)(s2:列表字符)(r1:RE)(r2:RE)
->重赛s1-r1
->重赛s2 r2
->重赛(s1++s2)(r1·r2)
我试图为我的matcher编写一个正确性证明,但在我尝试证明之前,我的模式匹配中出现了类型错误:

accorrect:
(r:RE)(s:List Char)(s1:List Char)(s2:List Char)(k:(List Char->Bool))
->((s1++s2)≡ (s)
->(重赛s1 r)
->(k)s2≡ (对)
->(acc r s k)≡ (对)
accCorrectε[][]k u empty匹配kproof=kproof
accCorrect(r1·r2)s s1 s2 k防分裂(ConcatMatch s1's1''r1'r2'子批次H1子批次H2)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
,则会出现“重复变量”错误

除了
ConcatMatch
构造函数之外,没有方法为
(r1·r2)
构造匹配

我的问题:


我如何说服类型检查器在模式匹配中,
r2
r2'
是相等的?任何类型的
重匹配s1(r1·r2)
的参数都必须使用
ConcatMatch
构造函数构造,使用参数
r1
r2
,但我不知道如何从模式匹配中证明这种情况。

这就是Agda具有点模式的原因:

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 (.r1 · .r2) s ._ s2 k splitProof (ConcatMatch s1' s1'' r1 r2 subMatch1 subMatch2 ) kproof = {!!}
accCorrect _ _ _ = {!!}
也就是说,只需将
放在应该推断的表达式之前。或者您可以(也应该)使用隐式参数:

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' s s2 k splitProof (ConcatMatch s1' s1'' r1 r2 subMatch1 subMatch2 ) kproof = {!!}
accCorrect' _ _ _ _ _ = {!!}
但是,您可能会遇到更复杂的问题,因为您接触到了绿色粘液(术语来源于Conor McBride):

返回类型中存在“green slime”定义的函数 对施工人员来说,这是一个危险的标志


下面是一个类似的示例。

这就是Agda有点图案的原因:

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 (.r1 · .r2) s ._ s2 k splitProof (ConcatMatch s1' s1'' r1 r2 subMatch1 subMatch2 ) kproof = {!!}
accCorrect _ _ _ = {!!}
也就是说,只需将
放在应该推断的表达式之前。或者您可以(也应该)使用隐式参数:

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' s s2 k splitProof (ConcatMatch s1' s1'' r1 r2 subMatch1 subMatch2 ) kproof = {!!}
accCorrect' _ _ _ _ _ = {!!}
但是,您可能会遇到更复杂的问题,因为您接触到了绿色粘液(术语来源于Conor McBride):

返回类型中存在“green slime”定义的函数 对施工人员来说,这是一个危险的标志

下面是一个类似的示例