【问题标题】:Combing odd and even regular expression to regular grammar?将奇偶正则表达式与正则语法结合起来?
【发布时间】:2017-10-27 22:08:46
【问题描述】:

我有这门课,我需要为其编写常规语法。语法是 {a,b,c},其中 a 和 c 有奇数个,但 b 有偶数个。

好字符串的例子:

  • babc
  • abcb
  • cbba
  • accaccac
  • 交流

错误的字符串

  • babcb
  • abc
  • cbbca
  • 阿卡卡
  • *空字符串

我连 b 的正则表达式都是 b∗(ab∗ab∗)∗b∗(我不知道在哪里包含 c)

我的奇数 a 的正则表达式是 (c|a(b|c)*a)*a(b|c)*

我的奇数 c 正则表达式是 (c|a(b|c)*c)*c(b|c)*

我认为常规语法看起来像这样:

s -> [a], a
s -> [c], c

a -> [a], a
a -> [b], b
a -> [c], c

b -> [b]
b -> [b], b
b -> [a], a
b -> [c], c

c -> [c], c
c -> [a], a
c -> [b], b

我认为很明显我很迷茫。任何帮助表示赞赏!

【问题讨论】:

  • 连 b 的正则表达式也匹配 a。
  • 我不知道你的符号,但我可以为你画一个 DFA(有 8 个状态)。
  • 请提供一些相应的自动机应该接受的样本输入!例如。 “aaabbc”等...
  • @repeat 添加:)
  • 这是最容易解决的问题之一,方法是从语言的 DFA 开始,然后将其转换为 RE。 DFA 微不足道,有 8 个状态,跟踪 a 的 b 和 c 的数量是奇数还是偶数(从偶-偶-偶状态开始,只有奇-偶-奇状态正在接受)。

标签: regex prolog grammar dcg


【解决方案1】:

这是 SWI-Prolog 中可能的解决方案:

:- use_module(library(clpfd)).
:- use_module(library(lambda)).

odd_even(Lst) :-
    variables_signature(Lst, Sigs),
    automaton(Sigs, _, Sigs,
              % start in s, end in i
              [source(s), sink(i)],
              % if we meet 0, counter A of a is incremented of one modulo 2
              % the others are unchanged
              [arc(s, 0, s, [(A+1) mod 2, B, C]),
               arc(s, 1, s, [A, (B+1)mod 2, C]),
               arc(s, 2, s, [A, B, (C+1) mod 2]),
               arc(s, 0, i, [(A+1) mod 2, B, C]),
               arc(s, 1, i, [A, (B+1)mod 2, C]),
               arc(s, 2, i, [A, B, (C+1) mod 2])],
              % name of counters
              [A, B, C], 
              % initial values of counters
              [0, 0, 0], 
              % needed final values of counters
              [1,0,1]).

% replace a with 0, b with 1, c with 2
variables_signature(Lst, Sigs) :-
    maplist(\X^Y^(X = a -> Y = 0; (X = b -> Y = 1; Y = 2)), Lst, Sigs).

例子:

?- odd_even([a,c,c,a,c,c,a,c]).
true.

?- odd_even([a,c,c,a,c,c,a]).
false.

【讨论】:

  • ~ variables_signature 中的杂质
  • @false : 我不明白你所说的“~impurity”是什么意思 :-( 。我不确定是否真正理解 Prolog 的“纯度概念” :-(((
  • 以你自己的例子:odd_even([a,c,c,a,c,c,a,c]). 成功。完美的。现在,让我们尝试一个通用查询:odd_even([a,c,c,a,c,c,a,X]).,它错误地失败了。
  • 好的,我明白了!另一个挑战。
  • 只是另一个建议:也许最好将您的实际关系放在一个单独的谓词中的 0..2 列表上。毕竟 variable_signature 东西强制执行一个简单的模式 - 只是接地。但是自动机约束的用途要广泛得多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
相关资源
最近更新 更多