poiché la grammatica non è lasciato ricorsiva, possiamo usare una DCG:
s --> a.
a --> [m], a, [n].
a --> [o].
allora possiamo analizzare o di generare tutte le sequenze accettati. Ad esempio, generare:
?- length(L, _), phrase(s, L).
L = [o]
L = [m, o, n]
L = [m, m, o, n, n]
...
per ispezionare il codice Prolog:
?- listing(s).
s(A, B) :-
a(A, B).
?- listing(a).
a([m|A], C) :-
a(A, B),
B=[n|C].
a([o|A], A).
senza accodamento/3 richiesto, grazie alla differenza elenca
modifica utilizzando aggiungere/3
s(Z) :- a(Z).
a(Z) :- append([m|X],[n],Z), a(X).
a([o]).
SWI-Prolog ha append/2 (basato semplicemente sull'app end/3 correttamente incatenato), che danno un più leggibile alternativa
a(Z) :- append([[m],X,[n]], Z), a(X).
in ogni caso, dobbiamo chiamare un/1 ricorsivamente dopo l'elenco è stato costruito/split
Non scrivere 'A (Z)', ma 'a (Z)'. Allo stesso modo con tutti i nomi dei predicati ... – repeat