Operators for a Controlled Natural Language

Prolog allows us to declare our own operators, this allows us to quickly take a bunch of predicates and query them in a bodge-job controlled "semi-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.