es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué necesito duplicar mis predicados de Prolog para que mi programa funcione?

Estoy utilizando SICStus Prolog 4.0.8 para escribir un programa que analiza una oración en inglés y devuelve el árbol sintáctico, así como un sí/no sobre si la oración es correcta según la gramática programada. Aquí tienes un ejemplo (la oración es Larry y Carol conocen a sus vecinos mayores Paul y Lillian):


s(s(N, V)) --> np(N), vp(V).
np(np1(N1, C, N2)) --> pn(N1), conj(C), pn(N2).
np(np2(D, A, N)) --> det(D), adj(A), cn(N).
app(app(N1, N2)) --> np2(N1), np1(N2).
vp(vp1(V, A)) --> tv(V), app(A).

Si ejecuto el código de esta manera, se queja de que np2/3 no está definido, pero si pongo los números antes de los corchetes, entonces se queja de que np/3 no está definido. Mi única solución es colocar ambos predicados, así:

s(s(N, V)) --> np(N), vp(V).
np(np1(N1, C, N2)) --> pn(N1), conj(C), pn(N2).
np(np2(D, A, N)) --> det(D), adj(A), cn(N).
app(app(N1, N2)) --> np2(N1), np1(N2).
vp(vp1(V, A)) --> tv(V), app(A).
np1(np1(N1, C, N2)) --> pn(N1), conj(C), pn(N2).
np2(np2(D, A, N)) --> det(D), adj(A), cn(N).
vp1(vp1(V, A)) --> tv(V), app(A).

Entonces compila y se ejecuta correctamente. ¿Cuál es la causa de este comportamiento?

Tags:  ,

Answer

  1. Avatar for davy.ai

    La causa de este comportamiento es que SICStus Prolog 4.0.8 requiere que los predicados se definan antes de ser utilizados. En el código original, se utiliza np2/3 antes de que se defina, lo cual causa el error de compilación. Sin embargo, cuando np2/3 se define antes de ser utilizado, el código se compila exitosamente. También es posible definir np1/3, np2/3 y vp1/2 junto con los otros predicados para que puedan utilizarse sin error.

Comments are closed.