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

用于识别上下文无关语法a^n b^n的Prolog程序,prolog,context-free-grammar,dcg,Prolog,Context Free Grammar,Dcg,使用Prolog我试图编写一个谓词,识别上下文无关语法,如果输入列表与CFG匹配,则返回true。 输入的字母表仅包括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

使用Prolog我试图编写一个谓词,识别上下文无关语法,如果输入列表与CFG匹配,则返回
true

输入的字母表仅包括
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^nb^n
规则

我会这样写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] ;
...

可能的副本,可以很容易地专门处理此问题;它的要点是“使用DCGs”。这个问题是昨天提出的。在询问之前,请花30秒钟搜索可能已经存在的答案。