简体   繁体   中英

Prolog program to recognize context free grammar a^n b^n

Using Prolog I'm trying to write a predicate that recognizes context free grammar and returns true if the input list matches the CFG .
The alphabet of the input consists only of a,b . The CFG i'm trying to match is

S-> TT
T -> aTb | ab

I'm not quite sure how to implement this, mainly the T rule.

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).

So if I query [a, a, b, b] it should return true . However, I'm just getting an infinite loop. I'm not quite sure how to implement the a^nb^n rule.

I would write the CFG in this way:

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

that translates directly to a DCG:

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

Note I swapped the epsilon rule, to get the ability to generate phrases.

Translating that DCG by hand :

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

Yields

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM