# 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.