Мне нужно написать предикат предикат product/3
, который получает две матрицы и возвращает их матричное умножение, если это возможно, или не удалось иначе. (Это означает, что если матрицы FullFill требования [n x p] [p x y]
, а затем возвращает умножение с размерами [n x y]
)Матричное умножение с Prolog
Пример:
product(M1, M2, R)
?- product([[1,2],[3,4],[5,6]], [[1,1,1],[1,1,1]], M).
M = [[3, 3, 3], [7, 7, 7], [11, 11, 11]];
No
Для этого у меня есть два кода, что индекс п-й строка на матрице rowI
и этот индекс n-й столбец columnI
(я объясню, как они работают в коде ниже).
%Predicate: rowI(M, I, RI)
%Input rowI([[1,2],[3,4],[5,6]], 2, RI).
% RI = [3,4];
rowI([H|_],1,H):-!.
rowI([_|T],I,X) :-
I1 is I-1,
rowI(T,I1,X).
% columnJ(M, J, CJ)
%Input columnJ([[1,2],[3,4],[5,6]], 1, CJ).
% CJ = [1,3,5];
columnJ([],_,[]).
columnJ([H|T], I, [R|X]):-
rowI(H, I, R),
columnJ(T,I,X).
product([H|T], M2, [R|X]):-
columnJ(M2, C, Z),
mult(H, Z , X),
product(T, M2 , X).
Я думал, так или иначе, захватывая голову M1
(который будет каждой строки), а затем умножается для каждого столбца в M2
и после добавления умножения этот список будет новая строка. Итак, (C должен был бы быть счетчиком, начиная с 1 до длины M2
, а затем mult
. Я просто думал о том, что он умножает списки. (Mult не определено на данный момент, просто догадка).
Здесь Я пытаюсь объяснить, как я об этом думаю .. но может быть и более простой способ. Как вы думаете?