mul2(X1,X0,Y1,Y0,M3,M2,M1,M0) :- cell(0, 0, X0,Y0,M0,C00), cell(0, 0, X1,Y0,S10,C10) && cell(S10,C00,X0,Y1,M1, C01), cell(0 ,C10,X1,Y1,S11,C11) && cell(S11,C01,0, 0,M2 , M3), cell(0, C11,0, 0, _, _ ). cell(Sin,Cin,X,Y,Sout,Cout) :- and(X,Y,L1),S1 <- Sin,C1<- Cin && full_adder(S1,C1,L1,Sout,Cout). full_adder(S1,C1,L1,Sout,Cout) :- half_adder(S1,C1,S2,C2),L2 <- L1 && half_adder(S2,L2,S3,C3), C4 <- C2 && or(C3,C4,Cout), Sout <- S3. half_adder(A,B,S,C) :- length(1), A = 0, B = 0, @S = 0, @C = 0. half_adder(A,B,S,C) :- length(1), A = 0, B = 1, @S = 1, @C = 0. half_adder(A,B,S,C) :- length(1), A = 1, B = 0, @S = 1, @C = 0. half_adder(A,B,S,C) :- length(1), A = 1, B = 1, @S = 0, @C = 1. or(A,B,C) :- length(1), A = 0, B = 0, @C = 0. or(A,B,C) :- length(1), A = 0, B = 1, @C = 1. or(A,B,C) :- length(1), A = 1, B = 0, @C = 1. or(A,B,C) :- length(1), A = 1, B = 1, @C = 1. and(A,B,C) :- length(1), A = 0, B = 0, @C = 0. and(A,B,C) :- length(1), A = 0, B = 1, @C = 0. and(A,B,C) :- length(1), A = 1, B = 0, @C = 0. and(A,B,C) :- length(1), A = 1, B = 1, @C = 1. test1 :- mul2(1,1,1,1,M3,M2,M1,M0), fin(write((M3,M2,M1,M0))), keep(write((M3,M2,M1,M0))).