在prolog中编写解析器

时间:2014-11-16 00:32:56

标签: parsing prolog context-free-grammar dcg

这是语法:

<S>-><X><Y><Z>
<X>->a<X>|a
<Y>->b<Y>|b
<Z>->c<Z>|c

我需要在这个语法中编写一个解析器。

当测试S([a,a,b,c,c,c],[])时。 它应该返回true。 在我的代码中,我定义了匹配规则来检查列表元素。


match(H,[H|T],T).
na(X0,X1):-match(a,X0,X2). 
nb(X0,X1):-match(b,X0,X2). 
nc(X0,X1):-match(c,X0,X2).
ns(X0,X1):-na(X0,X2),nb(X2,X3),nc(X3,X1).

这段代码有什么问题?它给出了真实,但当你追踪。它不起作用。

1 个答案:

答案 0 :(得分:1)

:- set_prolog_flag(double_quotes, chars).

s --> x, y, z.
x --> "a",x|"a".
y --> "b",y|"b".
z --> "c",z|"c".

在这里,按长度排序:

?- length(Xs,N),phrase(s, Xs).
Xs = [a, b, c],
N = 3 ;
Xs = [a, a, b, c],
N = 4 ;
Xs = [a, b, b, c],
N = 4 ;
Xs = [a, b, c, c],
N = 4 ;
Xs = [a, a, a, b, c],
N = 5 ;
Xs = [a, a, b, b,