agda:匹配相等变量的模式?

问题描述 投票:0回答:2

作为一种学习经验,我正在尝试使用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引起的):

types functional-programming agda dependent-type
2个回答
7
投票

here是一个相似且说明性的

问题。

avatar


HEADER1

HEADER2

细胞1


0
投票

细胞3细胞4
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.