Prolog程序识别上下文无关语法a ^ n b ^ n

时间:2013-05-08 10:00:38

标签: prolog context-free-grammar dcg

使用 Prolog 我正在尝试编写一个识别上下文无关语法的谓词,如果输入列表与CFG匹配,则返回true < / em>的。
输入的字母表仅包含a,b。 我试图匹配的CFG是

S-> TT
T -> aTb | ab

我不太确定如何实现这一点,主要是T规则。

s(S0,S):-t(S0,S),t(S1,S).
t(S0,S):-S0 = a, t(S1,S), S1 = b; S0 = a, S1 = b.

match([H|T] :- s(H,T).

因此,如果我查询[a, a, b, b],则应返回true。 但是,我只是得到一个无限循环。 我不太确定如何实施a^n b^n规则。

1 个答案:

答案 0 :(得分:2)

我会用这种方式写CFG:

S -> T
T -> a T b | {epsilon}

直接转换为DCG:

s --> t.
t --> [].
t --> a, t, b.

注意我交换了epsilon规则,以便能够生成短语。

手动翻译DCG:

s(S0,S) :- t(S0,S).
t(S0,S0).
t(S0,S) :- S0=[a|S1], t(S1,S2), S2=[b|S].

产量

?- phrase(s,L).
L = [] ;
L = [a, b] ;
L = [a, a, b, b] ;
L = [a, a, a, b, b, b] ;
...