# Progol - Input to Multiplication example

```
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Integer multiplication. Learns mult(X,Y,Z) given decrementation and
%	plus as background knowledge.

%%%%%%%%%%%%%%%%%%%%%%%%%
% Language Constraints

% Modes
% 	modeh are mode declarations for head literals
% 	modeb are mode declarations for body literals
%	+ represents input arguments
%	- represents output arguments
%	+ or - are followed by type of each argument
%	in this example, the type "int" is a built-in unary predicate

:- modeb(1,dec(+int,-int))?
:- modeb(1,plus(+int,+int,-int))?
:- modeb(1,inc(+int,-int))?
:- modeb(1,mult(+int,+int,-int))?
:- modeb(1,plus(+int,+int,-int))?
:- modeh(1,plus(+int,+int,-int))?
:- modeh(1,mult(+int,+int,-int))?

% Determinations
% 	determination(Name/Arity,Name1/Arity1) means the
%	predicate Name1/Arity1 can be used to construct a
%	definition for Name/Arity

:- determination(plus/3,dec/2), determination(plus/3,inc/2),
determination(plus/3,plus/3)?
:- determination(mult/3,dec/2), determination(mult/3,plus/3),
determination(mult/3,mult/3)?

% Others
% 	commutative(Name/Arity) means that the
% 	input arguments of predicate Name/Arity can be interchanged
% 	without changing its output value

:- commutative(mult/3), commutative(plus/3)?

:- set(c,3)?		% at most 3 literals in the body of any learned clause

%%%%%%%%%%%%%%%%%%%%%%%%%
% Background knowledge

inc(X,Y) :- Y is X+1.

dec(X,Y) :- Y is X-1, 0="<"Y.

%%%%%%%%%%%%%%%%%%%%%%%%%
% Positive examples

mult(4,X,Y) :- plus(X,X,Z), plus(X,Z,Z1), plus(X,Z1,Y).
mult(3,X,Y) :- plus(X,X,Z), plus(X,Z,Y).
mult(2,X,Y) :- plus(X,X,Y).
mult(1,X,X).
mult(0,X,0).

plus(4,X,Y) :- inc(X,U), inc(U,V), inc(V,W), inc(W,Y).
plus(3,X,Y) :- inc(X,U), inc(U,V), inc(V,Y).
plus(2,X,Y) :- inc(X,Z), inc(Z,Y).
plus(1,X,Y) :- inc(X,Y).
plus(0,X,X).
plus(X,0,X).

%%%%%%%%%%%%%%%%%%%%%%%%%
% Negative examples

:- mult(0,0,1).
:- mult(2,3,12).
:- mult(2,4,10).
:- mult(2,5,4).
:- mult(2,5,12).
:- mult(2,10,19).
:- mult(3,5,12).
:- mult(3,4,6).
:- mult(3,4,3).
:- mult(3,4,10).
:- mult(3,4,16).
:- mult(3,4,8).
:- mult(3,4,14).
:- mult(4,7,11).
:- mult(4,11,40).
:- mult(4,11,55).
:- mult(5,11,50).
:- mult(2,2,2).
:- mult(2,2,6).
:- mult(3,3,6).
:- mult(3,10,20).

:- plus(0,0,1).
:- plus(1,2,1).
:- plus(2,2,1).
:- plus(3,2,2).
:- plus(4,3,3).

Back to Progol page.