FASILL is a Prolog-like first order language containing variables, function symbols, predicate symbols and constants. To increase language expressiveness, FASILL also contains the truth values of a complete lattice, equipped with a collection of connectives to combine/propagate truth values through the rules.
A FASILL program is a tuple <Π, R, L> where Π is a set of rules, R is a similarity relation between the elements of the signature Σ of Π, and L is a complete lattice. A rule has the form A ← B, where A is an atomic formula called head and B, called body, is a well-formed formula (built from atomic formulas B1, ..., Bn, truth values of the lattice and connectives).
All relevant components of each lattice can be encapsulated inside a Prolog file which must contain the definitions of a minimal set of predicates defining the set of valid elements, the full or partial ordering established among them, as well as the repertoire of fuzzy connectives which can be used for their subsequent manipulation.
Given a domain U and a lattice L with a fixed t-norm, a similarity relation R is a fuzzy binary relation on U fulfilling the reflexive, symmetric and transitive properties. FASILL takes a set of similarity equations f/n ~ g/n = r, where f and g are propositional variables or constants and r is an element of L, and generates a valid similarity relation by applying the reflexive, symmetric and transitive closures over the initial scheme.
FASILL has a large set of built-in predicates for arithmetic comparison, arithmetic evaluation, atom processing, control constructs, term comparison, term unification, type testing, list manipulation, etc.See FASILL Predicate Reference
As a logic language, FASILL inherits the concepts of substitution, unifier and most general unifier. Some of them are extended to cope with similarities. Concretely, the most general unifier is replaced by the concept of weak most general unifier and a weak unification algorithm is introduced to compute it.
The procedural semantics of FASILL is defined in a stepwise manner. First, an operational stage is introduced which proceeds similarly to SLD resolution in pure logic programming, returning an expression still containing values and connectives. Then, an interpretive stage evaluates these connectives and produces a final answer.