Prolog 中的正则表达式

Regular Expressions in Prolog

提问人: 提问时间:11/9/2012 更新时间:11/9/2012 访问量:3422

问:

为了了解 Prolog 中的正则表达式,我正在尝试编写函数来确定输入是否符合模式;我的功能如下:

split(W, [[], W]).

split([X|W], [[X|W1], W2]) :- split(W, [W1, W2]).

match(eps, []).
match(symb(A), [ A ]).
match(union(R1, R2), W) :- match(R1, W).
match(union(R1, R2), W) :- match(R2, W).
match(conc(R1, R2), W)  :- split(W, [W1, W2]), W1 \= [], W2 \= [], match(R1, W1), match(R2, W2).
match(star(R), W)       :- match(R, eps).
match(star(R), W)       :- split(W, [W1, W2]), W1 \= [], match(R, W1), match(star(R), W2).

我在SWIPL中输入以下内容,并得到以下结果:

?- match(star(symb(a)),[a,a,a,a]).
false.

?- match(star(symb(b)),[b]).
false.

据我所知,其他功能工作正常。有人能告诉我我在处理星星时哪里出了问题吗?

谢谢!

正则表达式 序言

评论

1赞 nhahtdh 11/9/2012
你跟踪过你的程序吗?
0赞 nhahtdh 11/9/2012
请注意,您的程序将无法将字符串与正则表达式匹配。如果您已经了解了剪切,您还可以使程序输出为 true 并结束,而无需经历所有其他可能的情况。bbbbbba*b
0赞 CapelliC 11/9/2012
您应该检查一些带有 [DCG] 标签的答案
0赞 false 11/10/2012
您的实现效率低下,因为您在查看序列是否可以匹配之前就拆分了它。搜索这三个标签以查看更好的解决方案。
0赞 Guy Coder 1/15/2020
感兴趣的:SWI-Prolog 包正则表达式

答:

0赞 user766650 11/9/2012 #1

啊,没关系,我是个傻瓜。我需要改变

match(star(R), W) :- match(R, eps).

到只是

match(star(R), []).

我不断收到堆栈溢出,因为没有基本情况。我猜是生活和学习!

评论

0赞 nhahtdh 11/9/2012
如果它返回 false,则它不是 stackoverflow。