Fril
Fril is a programming language for first-order predicate calculus. It includes the semantics of Prolog as a subset, but takes its syntax from the of Logic Programming Associates and adds support for fuzzy sets, support logic, and metaprogramming. Fril was originally developed by Trevor Martin and Jim Baldwin at the University of Bristol around 1980. In 1986, it was picked up and further developed by Equipu A.I. Research, which later became Fril Systems Ltd. The name Fril was originally an acronym for Fuzzy Relational Inference Language. Prolog and Fril comparison Aside from the uncertainty-management features of Fril, there are some minor differences in Fril's implementation of standard Prolog features. Types The basic types in Fril are similar to those in Prolog, with one important exception: Prolog's compound data type is the term, with lists defined as nested terms using the . functor; in Fril, the compound type is the list itself, which forms the basis for most constructs. Variables are distinguished by identifiers containing only uppercase letters and underscores (whereas Prolog only requires the first character to be uppercase). As in Prolog, the name _ is reserved to mean "any value", with multiple occurrences of _ replaced by distinct variables. Syntax Prolog has a syntax with a typical amount of punctuation, whereas Fril has an extremely simple syntax similar to that of Lisp. A (propositional) clause is a list consisting of a predicate followed by its arguments (if any). Among the types of top-level constructs are rules and direct-mode commands. Rule A rule is a list consisting of a conclusion followed by the hypotheses (goals). The general forms look like this: (fact) (conclusion goal_1 ... goal_n) These are equivalent to the respective Prolog constructions: fact. conclusion :- goal_1, ..., goal_n. For example, consider the member predicate in Prolog: member(E, [E|_]). member(E, [_|T]) :- member(E, T). In Fril, this becomes: ((member E (E|_))) ((member E (_|T)) (member E T)) Relation Some data can be represented in the form of relations. A relation is equivalent to a set of facts with the same predicate name and of constant arity, except that none of the facts can be removed (other than by killing the relation); such a representation consumes less memory internally. A relation is written literally as a list consisting of the predicate name followed by one or more tuples of the relation (all of the arguments of the equivalent fact without the predicate name). A predicate can also be declared a relation by calling the def_rel predicate; this only works if the proposed name does not already exist in the knowledge base. Once a predicate is a relation, anything that would ordinarily add a rule (and does not violate the restrictions of relations) automatically adds a tuple to the relation instead. Here is an example. The following set of facts: ((my-less-than 2 3)) ((my-less-than 8 23)) ((my-less-than 42 69)) can be rewritten as the relation: (my-less-than (2 3) (8 23) (42 69)) Direct mode A predicate may be called with exactly