这是语法:
<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).
这段代码有什么问题?它给出了真实,但当你追踪。它不起作用。
答案 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,