# Fril

Fril es un lenguaje de programación para el cálculo de predicados de primer orden. Trabaja con un subconjunto de la semántica del lenguaje Prolog pero no del estándar ISO-PROLOG, sino con la sintaxis de micro-PROLOG, un dialecto desarrollado a principios de la década de 1980, añadiéndole soporte para conjuntos difusos, lógica de apoyo y metaprogramación.
Las primeras versiones de Fril fueron originalmente desarrolladas por Trevor Martin y Jim Baldwin en la Universidad de Bristol en torno a 1980. En 1986, pasó a manos del Equipu AI Research, que más tarde se convirtió en Fril Systems Ltd., que se encargó de la implementación y desarrollo de las versiones actuales del lenguaje. El nombre Fril era originalmente un acrónimo de Fuzzy Relational Inference Language (en español "Lenguaje de inferencia difusa relacional").

## Prolog y Fril comparados

Aparte de la gestión de lógica difusa, característica de Fril, hay algunas diferencias de menor importancia en la aplicación a Fril de características estándar de Prolog.

### Tipos

Los tipos básicos en Fril son similares a los de Prolog, con una excepción importante: el tipo de dato compuesto en Prolog es el término compuesto, listas de átomos usando un átomo como "functor" y el resto como "argumentos", definidas usando ".", en Fril, el tipo compuesto es la propia lista, lo que constituye la base para la mayoría de las construcciones. Las variables se distinguen por los identificadores de las mismas, que se escriben en su totalidad en letras mayúsculas (mientras que en Prolog sólo se requiere que la primera letra del nombre de la variable sea en mayúsculas). Como en Prolog, el carácter "_" está reservado para significar "ningún valor", lo que se traduce en que puede haber múltiples apariciones de "_" sustituyendo a diferentes variables indistintamente.

### Sintaxis

Comparadas las sintaxis del Prolog y el Fril, este último tiene una sintaxis más simple y en algunos aspectos similar a la de Lisp. Una cláusula proposicional es una lista compuesta de un predicado seguido de sus argumentos (si los hubiera). Entre los tipos de construcciones de nivel superior son las reglas y los comandos de modo directo.

### Reglas

Una regla es una lista que consiste en una conclusión seguida de la hipótesis (objetivos). Tienen en general el siguiente aspecto:
La construcción equivalente en Prolog sería:
Por ejemplo, el predicado member en Prolog:
En Fril, esto sería:

### Relación

Algunos datos pueden ser representados en forma de relaciones. Una relación es equivalente a un conjunto de hechos con el mismo nombre de predicado y de aridad constante, salvo que ninguno de los hechos se pueden quitar (excepto con el comando kill, que elimina la relación); como representación consume menos memoria interna. Una relación está escrita, literalmente, como una lista compuesta por el nombre del predicado seguido por una o varias tuplas de la relación (todos los argumentos de un hecho equivalente, sin el nombre del predicado). Un predicado también puede ser declarado una relación mediante una llamada al predicado def_rel, aunque esto sólo funciona si el nombre propuesto no existe en la base de conocimientos. Una vez que un predicado es una relación, normalmente se añade una regla y si no viola las restricciones de las relaciones, se agrega automáticamente una tupla a la relación en su lugar.
He aquí un ejemplo. El siguiente conjunto de hechos:
puede ser reescrito como una relación:

### Disyunción

Para este propósito Prolog usa un signo de puntuación ";". Fril usa el predicado orr.