da die Grammatik nicht linksrekursiv wird, können wir eine DCG verwenden:
s --> a.
a --> [m], a, [n].
a --> [o].
dann können wir alle akzeptierten Sequenzen analysieren oder erzeugen. Zum Beispiel Erzeugungs:
?- length(L, _), phrase(s, L).
L = [o]
L = [m, o, n]
L = [m, m, o, n, n]
...
den Prolog-Code zu inspizieren:
?- listing(s).
s(A, B) :-
a(A, B).
?- listing(a).
a([m|A], C) :-
a(A, B),
B=[n|C].
a([o|A], A).
keine append/3 erforderlich, dank Differenz listet
bearbeiten anhängen mit/3
s(Z) :- a(Z).
a(Z) :- append([m|X],[n],Z), a(X).
a([o]).
SWI-Prolog hat append/2 (einfach basierend auf App Ende/3 richtig verkettet), die eine besser lesbare Alternative
a(Z) :- append([[m],X,[n]], Z), a(X).
sowieso geben, müssen wir eine/1 rekursiv nach rufen die Liste/split
Schreiben Sie nicht 'A (Z)', aber 'a (Z)'. Ähnlich mit allen Prädikatnamen ... – repeat