theory AReg imports Main begin
datatype ('v)regexp = Alp 'v| Alter "('v) regexp" "('v) regexp" (infix "||" 55) | Dot (".")|
Star "'v regexp" ("_*") | Plus "('v) regexp"("_+") | Ques "('v) regexp"("_?")
inductive_set star :: "'a list set \<Rightarrow> 'a list set"
for r :: "'a list set" where
"[] \<in> star r"|
"x \<in> r\<Longrightarrow> x@x \<in> star r"
primrec sem_reg :: "('a) regexp \<Rightarrow> 'a \<Rightarrow> 'a list set" where
"sem_reg (Alp a) v = (if a = v then {[v]} else {})"|
"sem_reg (Dot) a= {[a]}"|
"sem_reg (v1||v2) a = (sem_reg v1 a) \<union> (sem_reg v2 a)"|
"sem_reg (Star a) v = star (sem_reg a v)"|
"sem_reg (Plus a) v = star (sem_reg a v) - {[]}"|
"sem_reg (Ques v) a = {[]} \<union> (sem_reg v a)"
value "sem_reg (Star a) v"
value "sem_reg Dot (1::nat)"我试图定义正则表达式的语义。但是当我测试星号函数时,它警告说没有恒星的代码方程。怎么修呢?
发布于 2022-05-02 08:46:12
错误信息告诉你,伊莎贝尔不知道如何计算星号。考虑到无穷大中的集合,您将无法定义返回所有可能值的函数。
一种可能的解决办法是使用另一种评估,即简化器:
value [simp] "sem_reg (Star (a::nat regexp)) v"
value [simp] "sem_reg Dot (1::nat)"这避免了对代码生成器的依赖。但是,正如你所期望的那样,星号并没有被评估。
https://stackoverflow.com/questions/72082036
复制相似问题