Prolog 将小型正则表达式转换为DCG

Prolog 将小型正则表达式转换为DCG,prolog,dcg,Prolog,Dcg,我知道Prolog程序员通常使用DCG而不是正则表达式来匹配字符串中的模式。在Perl中,可以编写 if ( '... accd' =~ /a+b*c{2,4}d$/ ) { say "matched"; } 在序言中如何匹配相同的模式?我已经扩展了答案 那么您的正则表达式匹配可能是 ?- phrase(rexp([a+, b*, range(c,2,4), d]), [a,c,c,d]), writeln(matched). 请注意,通过这种方式,我们匹配的是原子,而不是

我知道Prolog程序员通常使用DCG而不是正则表达式来匹配字符串中的模式。在Perl中,可以编写

if ( '... accd' =~ /a+b*c{2,4}d$/ ) {
    say "matched";
}
在序言中如何匹配相同的模式?

我已经扩展了答案

那么您的正则表达式匹配可能是

?-  phrase(rexp([a+, b*, range(c,2,4), d]), [a,c,c,d]),
    writeln(matched).
请注意,通过这种方式,我们匹配的是原子,而不是单个字符

编辑在false'注释之后,我认为第一条应该是

rexp(C) --> {atomic(C)}, [C].
例如避免

?- phrase(rexp([a+]), [a+]).
true ;
事实上,在修正之后,我们得到了预期的结果:

?- phrase(rexp([a+]), [a+]).
false.
完成编辑

该模式可以“硬编码”(更容易)而不是解释正则表达式

然后


这里我们匹配单个字符(Prolog中的一个字符串,它是一个字符代码列表)

由于
rexp(C)-->[C],您的答案是默认的。
仍然是默认的。尝试
短语(rexp([]),Xs)。
。。。还有许多其他问题。
?- phrase(rexp([a+]), [a+]).
false.
% I prefer the equivalent clause below
% p1 --> "a", p1 ; "a", p2.
p1 --> "a", (p1 ; p2).
p2 --> "b", p2 ; p3.
p3 --> ("cc" ; "ccc" ; "cccc"), "d".
?- phrase(p1, "accd").
true