\ + se puede utilizar para crear gramáticas que son menos ambiguas. ¡La ventaja de usar \ + más! por ejemplo, es una determinada declaratividad de \ +, de modo que, por ejemplo, las reglas DCG resultantes se pueden reordenar.
Vamos a hacer un ejemplo, considere la siguiente gramática:
s([X|Y]) --> t(X), s(Y). % 1
s([]) --> []. % 2
t(2) --> [a,a]. % 3
t(1) --> [a]. % 4
La gramática anterior es muy ambigua, por ejemplo consigo múltiples un análisis sintáctico para la siguiente entrada:
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
A = [2,1,2] ;
A = [2,1,1,1] ;
etc..
Supongamos ahora que desea preferir el análisis largo de t sobre el brevemente t. Puedo hacer esto con un corte de la siguiente manera:
t(2) --> [a,a], !. % 5
t(1) --> [a]. % 6
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No
Lamentablemente no puedo reordenar. Dado que hacer lo siguiente no da el resultado deseado. Aunque s (A) produce ahora los resultados en un orden diferente, estamos de vuelta al punto de partida, ya que la gramática es ambigua nuevo:
t(1) --> [a]. % 7
t(2) --> [a,a], !. % 8
?- phrase(s(A),[a,a,a,a,a]).
A = [1,1,1,1,1] ;
A = [1,1,1,2] ;
A = [1,1,2,1] ;
etc...
Ahora vamos a intentar lo mismo con \ +. Podemos reemplazar el corte por la siguiente negación:
t(2) --> [a,a]. % 9
t(1) --> [a], \+ [a]. % 10
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No
Ahora vamos a tratar si podemos reordenar. Nos reordenar las reglas de la gramática de t // 1:
t(1) --> [a], \+ [a]. % 11
t(2) --> [a,a]. % 12
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No
El declarativity es muy útil. Significa por ejemplo que podemos usar \ + en un analizador sintáctico de derecha a izquierda que elige las reglas gramaticales en un orden arbitrario. La declaratividad asegura que el encadenamiento ascendente del analizador de diagrama produce el mismo resultado independientemente de el orden de entrada de las reglas DCG.
Entonces es posible aplicar la técnica DCG en grandes proyectos de lenguaje natural (NL) y se escala bien. Las gramáticas NL se pueden ajustar empíricamente al determinismo. Cuanto más determinista es una gramática, más eficaz es su análisis sintáctico. Las gramáticas complejas de NL que de lo contrario son intratable, se vuelven factibles.
adiós
1, pero yo soy muy * * escépticos acerca de su declaración de declaratividad: 'frase (s ([1]), [a]).' tiene éxito, pero 'frase (s ([1]), L)' falla. Exactamente ese tipo de impureza es lo que me molesta. – false
Es decir: ¿cómo se traza la línea entre usos legítimos y no legítimos? – false
No reclamo declaratividad general. Escribí "cierta declaratividad". Puede establecer declaraciones contra un adorno (= jerga de la base de datos para la declaración del modo Prolog). Las técnicas también se pueden aplicar a gramáticas. Ver también: ftp://ftp.inf.ethz.ch/doc/tech-reports/1xx/177.pdf –