DCG's (Definite Clause Grammars)

Gramáticas

Em Prolog é possível gerar analisadores sintácticos através das DCG's (Definite Clause Grammars). Neste formalismo, o fragmento de gramática
    <expressão-booleana> ::= <booleano> or <booleano>
    <booleano> ::= true | false
seria representado por
    expressão_booleana --> booleano, [or], booleano.

    booleano --> [true].
    booleano --> [false].
onde os símbolos não terminais são representados por átomos e os símbolos terminais aparecem como elementos de uma lista. Cada produção da gramática é traduzida pelo interpretador de Prolog para uma cláusula que sucede quando recebe como argumento uma lista de símbolos terminais (tokens) correspondentes a uma expressão sintacticamente correcta:
    expressão-booleana(A, B) :- booleano(A, C), C = [or|D], booleano(D, B).

    booleano([true|A], A).
    booleano([false|A], A).
Deste modo, a query
    ?- phrase(expressão_booleana, [true,or,false]).
que é traduzida internamente para
    ?- expressão_booleana([true,or,false], []).
sucede, indicando que a expressão true or false está sintacticamente correcta.

Acções semânticas

É possível associar atributos (argumentos) aos símbolos não terminais e incluir acções semânticas (golos Prolog) nas produções, e.g.:
    expressão_booleana(Valor) -->
        booleano(OpEsq), [or], booleano(OpDir), { ou(OpEsq, OpDir, Valor) }.

    booleano(true)  --> [true].
    booleano(false) --> [false].
Tudo o que aparece entre chavetas é incluído literalmente na cláusula:
    expressão_booleana(Valor, A, B) :-
        booleano(OpEsq, A, C),
        C = [or|D],
        booleano(OpDir, D, B),
        ou(OpEsq, OpDir, Valor).

    booleano(true, [true|A], A).
    booleano(false, [false|A], A).
Se ou/3 for um predicado com a definição adequada, o cálculo do valor de uma expressão poderia ser feito através da query
    ?- phrase(expressão_booleana(Valor), [true,or,false]).
que sucederia com Valor = true.

Produções-λ

Uma produção-λ escreve-se
    não-terminal --> [].