Рассмотрим код DCG:
s-->[].
s-->[a],s,[b].
, чтобы запустить предикат, который вы определили в DCG, вам нужно добавить еще два аргумента в конце: «вход» и то, что осталось.Если вы хотите распознать весь список, просто поставьте [].Итак, когда вы запустите его, вы получите:
38 ?- s(C,[]).
C = [] ;
C = [a, b] ;
C = [a, a, b, b] ;
C = [a, a, a, b, b, b] ;
C = [a, a, a, a, b, b, b, b] ;
...
Если вам нужна какая-то строка «возврата», вы можете добавить ее в качестве дополнительного аргумента.Чтобы написать код пролога в предложении dcg, вы используете {}:
s('')-->[].
s(S)-->
[a],s(SI),[b],
{ atomic_list_concat([a,SI,b],S)}.
и получаете:
40 ?- s(R,X,[]).
R = '',
X = [] ;
R = ab,
X = [a, b] ;
R = aabb,
X = [a, a, b, b] ;
R = aaabbb,
X = [a, a, a, b, b, b] ;
R = aaaabbbb,
X = [a, a, a, a, b, b, b, b] ;
R = aaaaabbbbb,
...
мы сгенерировали все строки, которые распознаютсяэта грамматика;обычно вы просто хотите проверить, распознается ли строка по грамматике.чтобы сделать это, просто поместите его в качестве ввода:
41 ?- s([a,b],[]).
true
42 ?- s([a,b,b],[]).
false.
обратите внимание, что сначала мы ставим правило S :: = [], иначе пролог попадет в бесконечный цикл, если вы попросите сгенерировать все решения.Эта проблема не может быть тривиальной для решения в более сложных грамматиках.Чтобы получить решения, вы можете использовать length / 2:
?- length(X,_),s(X,[]).
X = [] ;
X = [a, b] ;
X = [a, a, b, b] ;
X = [a, a, a, b, b, b] ;
X = [a, a, a, a, b, b, b, b]
, даже если ваш код:
s-->[].
s-->[a],s,[b].