haskell - Haskell 函数来检查正则表达式是否为空
问题描述
嗨,我有以下用于正则表达式的数据类型:
data RE a -- regular expressions over an alphabet defined by 'a'
= Empty -- empty regular expression
| Sym a -- match the given symbol
| RE a :+: RE a -- concatenation of two regular expressions
| RE a :|: RE a -- choice between two regular expressions
| Rep (RE a) -- zero or more repetitions of a regular expression
| Rep1 (RE a) -- one or more repetitions of a regular expression
deriving (Show)
我需要设计一种方法来检查该正则表达式是否包含空字符串。例如 (Rep (Sym 'a' :+: Sym 'b')) 为真, (Sym 'a') 为假。我将如何让这个方法返回一个布尔值?
解决方案
计算 Salomaa 的空字属性(有时也称为“可空”)通常是通过将正则表达式转换为正常形式来完成的,该形式利用代数属性来删除多余的 Kleene 星,然后检查表达式中是否仍有星运算符或如果表达式具有或本身Empty
就是您所定义的。这是一个例子。
-- decide if the language defined by r contains ε, i.e.
-- nullable (r) ⇔ ε ∈ ℒ(r)
-- Also know as Salomaa's Empty Word Property (EWP)
nullable ∷ (Ord s) ⇒ RegExp s → Bool
nullable = nullable' . normalize
where nullable' Zero = False
nullable' One = True
nullable' (Lit _) = False
nullable' (α :| β) = nullable' α || nullable' β
nullable' (α :. β) = nullable' α && nullable' β
nullable' (Star _) = True
添加一个案例Rep1
看起来像nullable' (Rep1 α) = nullable' α
.
推荐阅读
- cygwin - Cygwin 未通过 ssh 显示 Vi 编辑器内容
- python - 获取带有访问令牌的 URL
- prolog - 如何将旅行/3写入路径/2
- odoo-14 - 在 addons /odoo 的现有员工模块中创建新角色
- android-studio - KMM:找不到 embedAndSignAppleFrameworkForXcode 任务
- dataframe - 如何克服 Spark 中单列值的 2GB 限制
- pandas - 为什么我得到一个空的数据框?
- android - 想要在从firebase收到后台通知时启动前台服务,以便像whatsapp一样调用
- ruby-on-rails - ruby 版本未使用 rbenv 更新
- python - 熊猫数据框中的重采样和计算均值