Expansão do DCG: A firmeza é ignorada?
Suponha que eu tenha a seguinte regra do DCG:
factor(X) --> "(", expr(X), ")".
Normalmente isso seria traduzido para:
factor(X, A, B) :-
[40|C] = A, expr(X, C, D), [41|B] = D.
Será permitido a um sistema Prolog traduzi-lo da seguinte forma, ou seja,
fundir as unificações na cabeça e no objetivo?
factor(X, [40|A], B) :-
expr(X, A, [41|B]).
Se a expansão do DCG não fosse firme, não seria permitido
colocar [41 | B] no terceiro argumento da chamada expr.
Mas eu acho que a firmeza está no lugar, então tudo deve ficar bem?
Tchau
P.S .: Para uma definição informal de firmeza veja:
Richard O'Keefe, 2009:
"Como o inventor do termo" firme "na programação Prolog,
Eu deveria ser a favor disso. Firmeza basicamente
significa que você não pode forçar um predicado no caminho errado
preenchendo os argumentos de saída erroneamente. "
http://blog.gmane.org/gmane.comp.ai.prolog.swi/month=20090301
P.S .: Para a outra tradução do DCG, veja, por exemplo, o mais novo
Proposta padrão do DCG. O apêndice contém um tradutor DCG
Código fonte:
ISO / IEC DTR 13211-3: 2006
Regras de gramática de cláusula definida
Klaus Daessler
20 de novembro de 2012
Projeto N238 DIN 2012-11-20