Я играю с формализацией сертифицированного регулярного выражения в Idris (я считаю, что та же проблема сохраняется в любом из методов теории доказательств, таких как Agda and Coq) m зациклился на том, как определить семантику операции дополнения. У меня есть следующий тип данных для представления семантики регулярных выражений:Формализация регулярных выражений с операцией дополнения
data InRegExp : List Char -> RegExp -> Type where
InEps : InRegExp [] Eps
InChr : InRegExp [ a ] (Chr a)
InCat : InRegExp xs l ->
InRegExp ys r ->
zs = xs ++ ys ->
InRegExp zs (Cat l r)
InAltL : InRegExp xs l ->
InRegExp xs (Alt l r)
InAltR : InRegExp xs r ->
InRegExp xs (Alt l r)
InStar : InRegExp xs (Alt Eps (Cat e (Star e))) ->
InRegExp xs (Star e)
InComp : Not (InRegExp xs e) -> InRegExp xs (Comp e)
Моя проблема заключается в представлении тип НЕВЫП конструктора, так как он имеет не строго положительное возникновение InRegExp
в связи с использованием Not
. Так как такие типы данных могут использоваться для определения функций без конца, они отбрасываются с помощью проверки завершения. Я хотел бы определить такую семантику так, чтобы она была принята с помощью проверки окончания Idris.
Есть ли способ, которым я мог бы представить семантику операции дополнения без отрицательных вхождений InRegExp
?
Спасибо. Вы абсолютно правы! Это простое и элегантное решение. –
@RodrigoRibeiro FYI, я исправил ошибку в определении конструктора 'NotInCat', который я определил. – gallais