nl es un lenguaje declarativo lógico de propósito general, simple pero muy
poderoso, distrubuído bajo una licencia abierta.

El patrón de uso de nl consiste en definir términos, usar estos términos para
componer conjuntos de reglas y hechos, extender estos conjuntos a todas sus
consecuencias lógicas, y consultar los conjuntos resultantes.

En estas lineas voy a intentar describir brevemente el uso de nl mediante
unos cuantos ejemplos simples, sin entrar en detalles, y dejando fuera partes
importantes como la aritmética o el tratamiento del tiempo. Estos ejemplos se
pueden probar siguiendo las instrucciones en esta página.

Términos.

A los tipos de términos esenciales, atómicos, en nl, les llamaremos nombres
comunes, nombres propios y verbos.

Nombres comunes y nombres propios.

Existe un nombre común primitivo, predefinido, “thing”. Definimos nuevos
nombres comunes relacionándolos con “thing” (o con nombres derivados de
“thing”) mediante la palabra reservada “are”.

01) animal are thing.
02) person are animal.

Para definir nombres propios, los relacionamos con nombres comunes mediante
la palabra reservada “isa”.

03) john isa person.
04) anne isa person.

Los nombres comunes y los nombres propios forman una estructura de clases.
Esto quiere decir que las definiciones 01, 02 y 03 implican también que
“john isa animal” y que “john isa thing”. También implican que
“person are thing”. Estas implicaciones tienen sentido en el contexto de las
consultas o las reglas. Cuando, por ejemplo en una consulta, se pida un
nombre propio que “isa thing”, “john” valdrá.

Verbos.

La definición de verbos es algo más complicada. En esta definición se limitan
los hechos en los que el verbo puede formar parte, por lo que parece
conveniente adelantar algo sobre la forma de los hechos.

Un hecho está compuesto por un sujeto y un predicado. El sujeto ha de ser un
término atómico (nombre propio, común, o verbo). El predicado está compuesto
de un verbo y una serie de modificadores, compuestos éstos a su vez de un
nombre y un término (nombre propio, común, verbo, o predicado). Un ejemplo
de hecho sería “john [meets who anne, where paris]“, donde “john” sería el
sujeto, “meets” el verbo, y “anne” y “paris” dos modificadores cuyos nombres
respectivos (en el ámbito del predicado) serían “who” y “where”.

De modo que para definir un verbo, hemos de decir qué tipo de término puede
actuar de sujeto en un hecho que use ese verbo, y además, el nombre y tipo de
los modificadores que le pueden ayudar a formar un predicado.

Cuando digo ‘tipo de término’, me refiero a un término “x”, que determina un
conjunto de términos “y”, “z”… para los que se cumple que “y isa x”,
“z isa x”…  Entonces, “y”, “z”… serían términos de tipo “x”.  Así, “john”
sería un término del tipo “person”, porque “john isa person”.

En este sentido, podemos asumir que cualquier predicado se relaciona mediante
“isa” con su verbo (es decir, que un predicado es un término -compuesto- cuyo
tipo es su verbo), e -introduciendo dos nuevos términos predefinidos, – que
todos los nombres comunes son de tipo “noun” y todos los verbos de tipo
“verb”.

Para empezar, hay un verbo primitivo, “exists”, sin modificadores definidos.
Definiríamos otro verbo así:

05) knows is exists withsubject person andcanbe who a person.

En esta definición, “is”, “withsubject”, “andcanbe” y “a” son palabras
reservadas. En conjunto, especifican que “knows” es un verbo, derivado de
“exists”, que puede formar parte de hechos que tengan por sujeto un nombre de
tipo “person” (un nombre propio que “isa person”), y que los predicados que
forma en tales hechos pueden tener un modificador llamado “who” que es
también de tipo “person”.

NOTA: Cuando derivemos un verbo de otro que no sea “exists”, heredará
los posibles modificadores. Así, un verbo derivado de “knows” no tendrá
que especificar que puede tener un modificador “who” de tipo “person”.
Además, un verbo no tiene por qué ir acompañado de todos sus posibles
modificadores para formar un predicado. Es por eso que los tenemos que
nombrar. Si nos limitásemos a un solo modificador obligatorio, podríamos
prescindir del nombre y expresar los hechos como tripletes
sujeto-verbo-objeto.

Hechos.

Los hechos en nl están compuestos de un sujeto y de un predicado. El sujeto
puede ser un nombre propio, un nombre común, o un verbo. El predicado se
compone de un verbo y cero o más modificadores, y se escribe entre corchetes.
Por ejemplo, con los términos que hemos definido podemos aseverar un hecho
como:

6)    john [knows who anne].

Reglas.

Una regla se compone de dos conjuntos de hechos (o definiciones), a los que
llamamos condiciones y consecuencias. Cuando extendemos un conjunto de frases
a todas sus implicaciones lógicas, lo que hacemos (mas o menos) es recorrer
la bbdd buscando hechos que concuerden con las condiciones de las reglas, y
cada vez que todas las condiciones de una regla quedan cubiertas, añadir sus
consecuencias a la bbdd.

En las reglas podemos usar variables lógicas, que actuan como moldes donde
caben -en principio- cualesquiera de los términos que forman los hechos.
Digo en principio porque la forma de las variables constriñe su rango. Las
variables comienzan con una mayúscula, y terminan en un entero. Si se
eliminan los dígitos finales de una variable, y se hace minúscula la primera
letra, obtenemos el tipo de los términos que están en su rango. Por ejemplo,
“john” estaría en el rango de “Person1″ (que sería person).

De modo que podríamos añadir una regla como ésta:

07) if:
Person1 [knows who Person2];
then:
Person2 [knows who Person1].

De lo que el sistema concluiría que:

08) anne [knows who john].

Predicados complejos.

En los predicados se pueden usar otros predicados como modificadores.
Como ejemplo podemos definir los siguientes verbos:

09) wants is exists withsubject person andcanbe to a exists.
10) can is exists withsubject person andcanbe what a exists.

Los modificadores “to” y “what” definen sus rangos con el tipo “exists”;
esto significa que pueden tomar predicados como valor. Con esto, podemos
hacer una regla como:

11) if:
Person1 [wants to [Exists1]];
Person1 [can what [Exists1]];
then:
Person1 [Exists1].

lo que significa que si decimos:

12) robert isa person.
13) john [wants to [knows who robert]].
14) john [can what [knows who robert]].

el sistema concluirá que:

15) john [knows who robert].

Finalicemos con un ejemplo algo más complejo, para mostrar cómo podemos
también usar verbos como modificadores en predicados. En este ejemplo vamos a
esbozar un sistema de permisos para una aplicación de gestión de documentos.
Ya tenemos “person”; ahora necesitamos contenidos, documentos que gestionar.

16) content are thing.
17) document are content.

También necesitamos verbos para las acciones que las “person” pueden efectuar
sobre los “content”:

18) content_action is exists withsubject person andcanbe what a content.
19) edit is content_action.
20) view is content_action.
21) delete is content_action.

Ahora definimos un verbo, y una regla, que nos permitirán discriminar si una
persona puede o no hacer algo con un contenido.

22) is_allowed is exists withsubject person andcanbe to a verb.

Para especificar que un modificador es un verbo y no un predicado, usamos el
término “verb”. Con la siguiente regla básicamente decimos que si alguien
quiere hacer algo, y está autorizado para realizar ese tipo de acciones, lo
hará.

23) if:
Person1 [wants to [Content_actionVerb1 Content_action1]];
Person1 [is_allowed to Content_actionVerb1];
then:
Person1 [Content_actionVerb1 Content_action1].

En esta regla, Content_actionVerb1 es una variable cuyo rango son los verbos
derivados de content_action, y Content_action1 una variable cuyo rango son
los predicados construidos con verbos derivados de content_action. La
expresión “[ContentActionVerb1 Content_action1]” indica un predicado
“Content_action1″ que debe llevar un verbo “content_action” que coincida con
el del resto de las condiciones qe usen la misma variable
“ContentActionVerb1″.

Tras esto, podemos decir:

24) john [is_allowed to view].
25) doc1 isa document.
26) john [wants to [view what doc1]].

De esto, el sistema concluirá que:

27) john [view what doc1].

Related Posts:


  1. Alfem dice:

    ¿Y cómo se pronuncia “nl”?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>