Operators For A Controlled Natural Language
First we'll need a code base, let's start with some classic family tree facts and rules. We'll keep this here for later comparison.
?-
op(+Precedence, +Type, :Name)
Let's declare our operators! Precedence determines the order of evaluation, SWI-Prolog have the precedence for built-in operators in their docs. Type is how the operator is evaluated: xf
, yf
, xfx
, xfy
, yfx
, fy
or fx
, where f
is a functor, x
is an argument and y
is an argument or lower precedence functor.
Let's turn our predicates into operators and enjoy querying in a somewhat more natural way. Precedence for and
as well as or
is taken to be the same as that of ,
and ;
. Note how we can then use the operators in our declarations of facts and rules.
?-
The Good, the bad and the ugly
Just because we can do something, doesn't mean we should! Personally I appreciate this representation, but understand that some people prefer the standard syntax. Declaring operators is especially useful when working within a domain that already uses them, such as logic, especially if your implementation of Prolog supports unicode. However, the most common use seems to be to develop a structure for passing data around.