Por lo que entiendo, en el prólogo a capturar al analizar las características de este modo:Prolog DCGs ¿Características múltiples?
foo(feature(X)) --> [X], bar.
¿Es esta DCG común en el diseño?
foo(featureA(X), featureB(Y)) --> [X], [Y], bar.
Por lo que entiendo, en el prólogo a capturar al analizar las características de este modo:Prolog DCGs ¿Características múltiples?
foo(feature(X)) --> [X], bar.
¿Es esta DCG común en el diseño?
foo(featureA(X), featureB(Y)) --> [X], [Y], bar.
DCG describen las relaciones entre las listas y los argumentos de los no terminales. Sin embargo, estos argumentos son solo términos. Se pueden usar para representar características pero no las representan directamente. Para ver la diferencia, imagine que desea asociar un número de función a cada nodo. En los DCG, ahora tiene que decidir, caso por caso, cómo representar esa característica. En un nodo es feature(X, singular)
y en otro nodo podría ser diferente. O puede decidir representar todas las características de manera uniforme con una lista, por lo tanto, [nodename=idx,..., numerus=singular,...]
.
Es perfectamente válido y bastante útil. Como ejemplo, considere esta regla, tomada del libro clásico (y ahora gratis!) PNLA, que utiliza dos argumentos para capturar la inflexión y el "significado" (la forma lógica, LF
) de un verbo transitivo tv
:
tv(nonfinite, LF) --> [TV], {tv(TV, _, _, _, _, LF)}.
tv(finite, LF) --> [TV], {tv(_, TV, _, _, _, LF)}.
tv(finite, LF) --> [TV], {tv(_, _, TV, _, _, LF)}.
tv(past_participle, LF) --> [TV], {tv(_, _, _, TV, _, LF)}.
tv(pres_participle, LF) --> [TV], {tv(_, _, _, _, TV, LF)}.
un verbo entonces se puede definir como
tv(write, writes, wrote, written, writing, X^Y^ `writes(X,Y) ).
Solo para señalar que la búsqueda por el formulario de palabras (por ejemplo, "escrito") será lenta a menos que los hechos (por ejemplo, 'tv/6') estén indexados por todos los argumentos. Una representación del léxico más rápida sería 'tv (written, past_participle, X^Y^write (X, Y))'. – Kaarel
@Kaarel: buen punto, no pensé en indexar. –
cuáles son las ventajas/desventajas de representar de manera uniforme como una lista en lugar de como un compuesto (?) plazo? – dnolen
Es más uniforme: por lo tanto, las funciones de extracción son mucho más simples. Al poner características en los argumentos de algunos términos compuestos, significa que debe escribir el código de acceso para cada tipo de término compuesto. – false