Dies ist die CFG ist:prüfen, ob ein String in einer Sprache enthalten ist (Prolog)
S -> T | V
T -> UU
U -> aUb | ab
V -> aVb | aWb
W -> bWa | ba
so wird diese in irgendeiner Form annehmen:
{a^n b^n a^m b^m | n,m >= 1} U {a^n b^m a^m b^n | n,m >= 1}
Und hier ist der Code, den ich bin arbeiten mit:
in_lang([]).
in_lang(L) :-
mapS(L), !.
mapS(L) :-
mapT(L) ; mapV(L),!.
mapT(L) :-
append(L1, mapU(L), L), mapU(L1), !.
mapU([a|T]) :-
((append(L1,[b],T), mapU(L1)) ; (T = b)),!.
mapV([a|T]) :-
((append(L1,[b],T), mapV(L1)) ;
(append(L1,[b],T), mapW(L1))),
!.
mapW([b|T]) :-
((append(L1,[a],T), mapW(L1)) ;
(T = a)),
!.
Wie jetzt aus, das für die folgenden drei Saiten falsch zurückgibt:
[a,a,b,b,a,b] // this should be true
[a,a,a,b,b,a,a,b,b,b] // this should be true as well
[a,a,a,b,b,a,b,b,b] // this one IS false
Jede Hilfe oder Einsicht würde sehr geschätzt werden, ich bin nicht allzu vertraut mit Prolog, so dass das Debuggen von mir selbst eine Herausforderung war.
Alle diese Schnitte ('!'), wozu dienen sie? Ein Schnitt am Ende einer Prädikatdefinition ist ein sehr starker Code-Geruch. –