write unificacion sentencia reglas primer orden logica formularios explicados ejercicios prolog dcg prolog-assert

unificacion - Llamar hechos de la base de datos en prolog



unificacion prolog (2)

He insertado la gramática libre del contexto dado en la base de datos usando assert (....) Si la gramática es algo así como

S-->a,S,b S-->c

Esta gramática se inserta en la base de datos. Tengo que escribir un dcg para generar oraciones para el cfg en la base de datos. Por ejemplo, si defino el dcg de esta manera, myDcg (''S'', str) , el ''S'' (no terminal) debe llamarse o sustituirse por aSb o c | d o más.

El problema es cómo puedo llamar / sustituir ''S'' por hechos de la base de datos cada vez que se encuentra un no terminal (''S'') para generar oraciones.

Espero que hayas entendido mi pregunta, si no intentaré editar la pregunta.

A continuación (código de muestra) es lo que quería hacer exactamente Esto no es dcg.

myGrammar([], []):-!. myGrammar([T|Rest], [T|Sentence]):- myGrammar(Rest, Sentence). myGrammar([NT|Rest], Sentence):- grammar(NT, Rest1), append(Rest1,Rest, NewRest), myGrammar(NewRest, Sentence).

Siempre que se encuentre un terminal, debe imprimirse y cuando se encuentre un terminal que no sea, retrocederá.


En su predicado mygrammar/2 hay una lista de no terminales y terminales en el primer argumento y una lista de terminales en el segundo. Probablemente debería tener éxito si el segundo argumento es de la forma del primero. Entonces, lo que tienes aquí esencialmente es un meta intérprete para los DCG. Algunas sugerencias:

Su tokenizador produce actualmente [grammar(''S'',[a,''S'',b]),grammar(''S'',[....]),..]. Deje que produzca [grammar(''S'',[t(a),nt(''S''),t(b)]),grammar(''S'',[....]),..] lugar. De esta manera, es evidente lo que es un terminal y lo que no es un terminal. Y, oh, quítalo!

myGrammar([], []). myGrammar([t(T)|Rest], [T|Sentence]):- myGrammar(Rest, Sentence). myGrammar([nt(NT)|Rest], Sentence):- grammar(NT, Rest1), append(Rest1,Rest, NewRest), myGrammar(NewRest, Sentence).

Los DCG, por cierto, son un poco más generales que este intérprete.

La clasificación real entre no terminales y terminales tiene que ser hecha por el tokenizer.

uppercasecode(C) :- between(0''A,0''Z,C). lowercasecode(C) :- between(0''a,0''z,C).

Si está utilizando caracteres (átomos de un carácter), usará el char_code(Char, Code) para convertir entre ellos.

El soporte total de Unicode aún está en su infancia. Es muy complicado debido a todos los casos especiales para caracteres como Ⓐ que es mayúscula pero que aún no puede formar parte de un identificador. Pero aquí está cómo puedes hacerlo en SWI actualmente.

uppercasecode(C) :- ''$code_class''(C,upper), ''$code_class''(C,id_start). lowercasecode(C) :- ''$code_class''(C,id_start), ''$code_class''(C,id_continue), /+ ''$code_class''(C,upper).

Actualización: Mientras tanto, hay char_type/2 y code_type/2 para este propósito.

uppercasecode(C) :- code_class(C, upper), code_class(C, prolog_var_start).


Supongo que comenzó con Prolog recientemente. Sí, puede afirmar cosas en la base de datos, pero esto no es lo común que hace en primer lugar. Deseará usar esa característica mucho más tarde cuando se sienta seguro con el lenguaje base.

Lo que normalmente hace es escribir una gramática en un archivo como myfirstgrammar.pl y luego cargar ese archivo en su sistema Prolog.

Por favor, consulte este hilo reciente para obtener detalles sobre la gramática.