[英]Agda: pattern matching equal variables?
作為一個學習的經驗,我想用阿格達延續傳遞風格的基礎上提出的一個實施驗證的正則表達式匹配本文 。
我有一個正則表達式的類型定義如下:
data RE : Set where
ε : RE
∅ : RE
Lit : Char -> RE
_+_ : 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
,我得到一個‘重復的變量’錯誤。
除了ConcatMatch
構造函數外, ConcatMatch
為(r1 · r2)
構造匹配ConcatMatch
。
我的問題:
如何從模式匹配中說服類型檢查器r2
和r2'
相等? 任何類型REMatch 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):
“綠色泥”(在構造函數的返回類型中定義的函數)的存在是一個危險信號。
這是一個類似的說明性問題 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.