# Programming in Logic: Prolog

The utility of the clause-form equivalent representation for logic and theorem proving gave rise to the Prolog language: programming in logic.

## Horn Clauses

Prolog is based on a restricted form of clause-form equivalent known as the Horn clause.

• A Horn clause is a disjunction of literals, with at most one positive (non-negated) literal.
• Example: [$$p(X, Y, Z), \neg q(X, Z), \neg r(Z, Y)$$]

### Implication Form

In Prolog, Horn clauses are written in implication form:

p(X, Y, Z) :- q(X, Z), r(Z, Y).


The meaning is p(X, Y, Z) is true if q(X, Z) is true and r(Z, Y) is true.

We can see that this is equivalent to a Horn clause by logic rewriting.

• $$(q(X, Z) \wedge r(Z, Y)) \implies p(X, Y, Z)$$
• $$(\neg (q(X, Z) \wedge r(Z, Y)) \vee p(X, Y)$$
• $$\neg q(X, Z) \vee \neg r(Z, Y) \vee p(X, Y)$$

The final form is a disjunction of literals, with exactly one positive literal.

## Prolog Program for Sorting

%  R is the sorted version of Q if
%     (a) R is a permutation of Q and
%     (b) R is ordered.
slowsort(Q, R) :- permutation(Q, R), ordered(R).

permutation([], []).

% The list [Y1 | MoreYs] is a permutation of X if:
%     (a) there are lists Xinitial and Xfinal such that
%         the append of Xinitial and [Y1| Xfinal] is X,
%     (b) there is a list XlessY1 that is the append of Xinitial and Xfinal,
%     (c) XlessY1 is a permutation of MoreYs.

permutation(X, [Y1 | MoreYs]) :-
append(Xinitial, [Y1 | Xfinal], X),
append(Xinitial, Xfinal, XlessY1),
permutation(XlessY1, MoreYs).

ordered([]).

ordered([_]).

ordered([A1, A2| MoreAs]) :-
A1 =< A2, ordered([A2 | MoreAs]).

Updated Thu Nov. 08 2018, 12:02 by cameron.