từ ngữ pháp không phải là trái đệ quy, chúng ta có thể sử dụng một DCG:
s --> a.
a --> [m], a, [n].
a --> [o].
sau đó chúng ta có thể phân tích cú pháp hoặc tạo ra tất cả các chuỗi chấp nhận. Ví dụ, tạo:
?- length(L, _), phrase(s, L).
L = [o]
L = [m, o, n]
L = [m, m, o, n, n]
...
để kiểm tra mã 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).
không append/3 yêu cầu, nhờ vào sự khác biệt liệt kê
chỉnh sửa sử dụng bổ sung/3
s(Z) :- a(Z).
a(Z) :- append([m|X],[n],Z), a(X).
a([o]).
SWI-Prolog đã thêm/2 (chỉ dựa trên ứng dụng cuối/3 xích đúng), mà cung cấp cho một thể đọc được thay thế hơn
a(Z) :- append([[m],X,[n]], Z), a(X).
dù sao, chúng ta phải gọi một/1 đệ quy sau danh sách đã được xây dựng/chia
Không ghi 'A (Z)', nhưng 'a (Z)'. Tương tự như vậy với tất cả các tên vị ngữ ... – repeat