Prolog,语法分析器

时间:2014-11-18 01:11:23

标签: prolog dcg

对于prolog来说,我是一个非常环保的人,但基本上我要做的是实现递归来解析语法规则。我的逻辑似乎是正确的,但显然不是因为我没有得到预期的结果。

以下是我要解析的规则:

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

这是prolog代码:

match(X, [X|T], T).

xs(X0, X):- match(a, X0, X).
xs(X0, X):- xs(X0, X).
ys(X0, X):- match(b, X0, X).
ys(X0, X):- ys(X0, X).
zs(X0, X):- match(c, X0, X).
zs(X0, X):- zs(X0, X).

s(X0, X):- xs(X0, X1), ys(X1, X2), zs(X2, X).

非常感谢任何有助于理解我所做错事的帮助。

干杯。

2 个答案:

答案 0 :(得分:1)

可能必须完成语法翻译,例如

xs(X0, X):- match(a, X0, X).
xs(X0, X):- match(a, X0, X1), xs(X1, X).
...

我建议你看看DCG提供的翻译:

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

咨询并列出

中的结果
z(A, C) :-
    (   A=[c|B],
        y(B, C)
    ;   A=[c|C]
    ).

y(A, C) :-
    (   A=[b|B],
        y(B, C)
    ;   A=[b|C]
    ).

x(A, C) :-
    (   A=[a|B],
        x(B, C)
    ;   A=[a|C]
    ).

s(A, D) :-
    x(A, B),
    y(B, C),
    z(C, D).

答案 1 :(得分:0)

在每个XS YS ZS方法中,递归调用时需要再次调用匹配。