gpt4 book ai didi

Prolog 矩阵乘法

转载 作者:行者123 更新时间:2023-12-03 22:45:13 36 4
gpt4 key购买 nike

我必须编写一个谓词 product/3 ,它接收两个矩阵并在可能的情况下返回它们的矩阵乘法,否则返回失败。 (这意味着如果矩阵满足要求 [n x p] [p x y],则返回维度为 [n x y] 的乘法)

例子:

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

为此,我有两个代码索引矩阵的第 n 行 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 没有定义在这一点上,只是一个猜测)。

在这里我试图解释我的想法.. 但可能有更简单的方法。你怎么看?

最佳答案

紧凑的代码(在高阶构造 maplist 和 foldl 的帮助下)。我故意留下未计算的表达式,因此结果可以在更一般的上下文中重用:

:- module(matrix_multiply,
[matrix_multiply/3
,dot_product/3
]).
:- use_module(library(clpfd), [transpose/2]).

%% matrix_multiply(+X,+Y,-M) is det.
%
% X(N*P),Y(P*M),M(N*M)
%
matrix_multiply(X,Y,M) :-
transpose(Y,T),
maplist(row_multiply(T),X,M).

row_multiply(T,X,M) :-
maplist(dot_product(X),T,M).

dot_product([X|Xs],[T|Ts],M) :-
foldl(mul,Xs,Ts,X*T,M).
mul(X,T,M,M+X*T).

编辑

用法(保存在名为 matrix_multiply.pl 的文件中):

?- [matrix_multiply].
?- matrix_multiply([[1,2],[3,4],[5,6]], [[1,1,1],[1,1,1]],R),maplist(maplist(is),C,R).
R = [[1*1+2*1, 1*1+2*1, 1*1+2*1], [3*1+4*1, 3*1+4*1, 3*1+4*1], [5*1+6*1, 5*1+6*1, 5*1+6*1]],
C = [[3, 3, 3], [7, 7, 7], [11, 11, 11]].

,maplist(maplist(is),C,R) 明确请求数值评估。R 保存符号表达式,C 保存值。

编辑

只需注意来自 clpfd:transpose 的依赖项很容易删除:这是基于 nth/3 和 library(yall) 的替代“单行”定义

mat_transpose([R1|Rs],T) :- findall(V,(
nth1(Col,R1,_),
maplist({Col}/[R,C]>>nth1(Col,R,C),[R1|Rs],V)),T).

关于Prolog 矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34206275/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com