Fril 2912125 113223196 2007-03-07T02:35:07Z Ddawson 216198 +Infobox programming language {{Infobox programming language |name = Fril |logo = |paradigm = [[Logic programming]] |year = [[1980]] |designer = Trevor Martin <!-- not [[Trevor Martin]] --> |implementations = Fril |dialects = |influenced_by = |influenced = }} Fril is a [[programming language]] for [[first-order predicate calculus]]. It includes the [[semantics]] of [[Prolog]] as a subset, but takes its [[syntax#Syntax in computer science|syntax]] from the [[micro-Prolog]] of [[Logic Programming Associates]] and adds support for [[fuzzy set]]s, [[support logic]], and [[metaprogramming]]. Fril was originally developed by Trevor Martin <!-- not [[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 [[Prolog#Terms|term]], with lists defined as nested terms using the <code>.</code> functor; in Fril, the compound type is the list itself, which forms the basis for most constructs. Variables are distinguished by [[identifier]]s containing only [[uppercase letter]]s and [[underscore]]s (whereas Prolog only requires the first character to be uppercase). As in Prolog, the name <code>_</code> is reserved to mean "any value", with multiple occurrences of <code>_</code> replaced by unique variables. ===Syntax=== Prolog has a syntax with a typical amount of punctuation, whereas Fril has an extremely simple syntax similar to that of [[Lisp programming language|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 <code>member</code> 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 <code>kill</code>ing 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 <code>def_rel</code> 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: ((less-than 2 3)) ((less-than 8 23)) ((less-than 42 69)) can be rewritten as the relation: (less-than (2 3) (8 23) (42 69)) ====Direct mode==== A predicate may be called with exactly one argument using the syntax: ''predicate'' ''argument'' Queries are submitted using this syntax, with ''predicate'' being <code>?</code> (or one of the other query-related predicates). ====Fuzzy sets==== Fril supports both continuous and discrete fuzzy sets, each with their own special syntaxes. A discrete set ('''dtype''') lists discrete values and their degrees of membership, with this syntax: {''value'':''dom'' ''value'':''dom'' ... ''value'':''dom''} ''value'' is an atom or number, and ''dom'' is a value in the interval [0, 1]. A continuous set ('''itype''') lists [[real number]]s and their degrees of membership; the degree-of-membership function is the linear interpolation over these mappings. The syntax is thus: [''value'':''dom'' ''value'':''dom'' ... ''value'':''dom''] where the values must be given in non-decreasing order. Each dtype and itype may be constrained to a '''universe''' (a set of allowable values). Fril has predicates for fuzzy set operations (but does not directly support control through [[fuzzy logic]]). It is even possible to combine dtypes and itypes through some operations, as long as the dtypes contain only real numbers. ====Support pairs==== Any rule may have a probability interval (called a support pair) associated with it by appending <code>:(''min'' ''max'')</code> to it, where ''min'' and ''max'' are the minimum and maximum probabilities. Fril includes predicates that calculate the support for a given query. ====Disjunction==== While Prolog uses punctuation &mdash; namely <code>;</code> &mdash; for disjunction within clauses, Fril instead has a built-in predicate <code>orr</code>. ====Merits==== There are advantages and disadvantages to this simpler syntax. On the positive side, it renders predicates such as Prolog's <code>=..</code> (which maps between lists and clauses) unnecessary, as a clause ''is'' a list. On the other hand, it is more difficult to read. ===Behavior=== As a logic programming environment, Fril is very similar to Prolog. Here are some of the differences: * Both Prolog and Fril have [[shell (computing)|shell]] applications, which serve as the standard way of interacting with them. Prolog reads commands in two modes: in source file-reading mode, it accepts directives and clauses; in user interaction mode, it accepts only queries (although it is possible to tell Prolog to read directives and clauses from [[standard input]] by using <code>consult(user).</code>). Fril makes no distinction: all types of commands can be given both from source files and on the command line. * The Prolog shell automatically prints the values of all instantiated variables that appear in a query, along with a ''yes'' or ''no'' answer. The Fril shell only gives the answer; it is the user's responsibility to print variables if desired. ==References== * Martin, T. P. (electronic mail to M. Kantrowitz, [[March 10]] [[1994]]). ''[ftp://ftp.cs.cmu.edu/user/ai/areas/fuzzy/com/fril/fril.txt Re: FRIL]''. Retrieved [[October 18]] [[2005]]. * Pilsworth, B. W. (n.d.). ''[http://www.enm.bris.ac.uk/ai/fril.html The Programming Language Fril]''. Retrieved [[October 18]] [[2005]]. * Fril Systems Ltd (1999). ''[http://www.enm.bris.ac.uk/ai/martin/FrilManual/index.html Fril - Online Reference Manual - Preliminary Version (incomplete)]''. Retrieved [[October 20]] [[2005]]. ==External links== * [http://www.enm.bris.ac.uk/ai/martin/downloads/FrilResources.html Fril - downloadable resources], the official download site for Fril * [http://www.eecs.berkeley.edu/~zqin/FrilLab/fril.htm Logic Programming (Fril) and Artificial Intelligence Lab], Zengchang Qin [[Category:Logic programming languages]]