【问题标题】:Regular Expressions in PrologProlog 中的正则表达式
【发布时间】: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

标签: regex prolog


【解决方案1】:

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

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

只是

match(star(R), []).

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

【讨论】:

  • 如果返回false,则不是stackoverflow。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
相关资源
最近更新 更多