/* multipiler by Ben Moszkowski */ mux(Switch,In1,In2,Out) :- if Switch = 0 then Out = In2 else Out = In1. reg(In,Out) :- @Out = In. flipflop(In,Out) :- @Out = In. dec(In,Out) :- if In = 0 then Out = 0 else Out = In-1. adder(In1,In2,Out) :- Out = In1+In2. zero_test(In,Out) :- if In = 0 then Out = 1 else Out = 0. or_gate(In1,In2,Out) :- Out1 is In1 \/ In2, Out = Out1. mult_imp(In1,In2,M,N,Done) :- % exists,(B1,B2,B3,B4,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10) #zero_test(In1,B4), #(L10 = 0), #mux(B4,L10,In2,L9), #zero_test(In2,B2), #dec(In1,L6), #adder(L9,M,L8), #dec(N,L3), #mux(Done,L9,L8,L7), #reg(L7,M), #mux(Done,In1,L3,L1), #reg(L1,N), #dec(L3,L4), #mux(Done,L6,L4,L5), #zero_test(L5,B1), #or_gate(B1,B2,B3), #flipflop(B3,Done). main :- read((In1,In2)), Done = 1, M = 39, N = 83, In1 <-- In1,In2 <-- In2, mult_imp(In1,In2,M,N,Done), @(halt(Done=1)), #write((Done,M,N)).