【发布时间】:2012-10-29 09:32:04
【问题描述】:
为了了解 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.
据我所知,其他功能工作正常。谁能告诉我我在处理星星时哪里出错了?
谢谢!
【问题讨论】:
-
你跟踪你的程序了吗?
-
请注意,您的程序将无法将字符串
bbbbbb与正则表达式a*b匹配。如果你学过cut,你也可以让程序输出为真并结束,而不用经历所有其他可能的情况。 -
你应该用 [DCG] 标签检查一些答案
-
您的实现效率低下,因为您在查看它是否完全匹配之前拆分了一个序列。搜索 these three tags 以查看更好的解决方案。
-
感兴趣的:SWI-Prolog 包regex