Prolog 矩阵(正方形)关于主对角线对称

Prolog 矩阵(正方形)关于主对角线对称,prolog,Prolog,定义一个谓词,用于确定矩阵(正方形)是否与主对角线对称。谓词将读到,其中Z是一个关于主对角线对称的矩阵(正方形) 对称(Z) 其想法是检查行和列是否相等,但不知道如何开始提高练习 symmetrical(Z) :- transpose(Z,Z). 现在,您只需要定义转置 好的旧矩阵I,J索引: symmetrical(M) :- forall(elem(M, I, J, E), elem(M, J, I, E)). elem(M, I, J, E) :- nth1(I, M

定义一个谓词,用于确定矩阵(正方形)是否与主对角线对称。谓词将读到,其中Z是一个关于主对角线对称的矩阵(正方形)

对称(Z)

其想法是检查行和列是否相等,但不知道如何开始提高练习

symmetrical(Z) :-
   transpose(Z,Z).

现在,您只需要定义转置

好的旧矩阵I,J索引:

symmetrical(M) :-
   forall(elem(M, I, J, E), elem(M, J, I, E)).

elem(M, I, J, E) :-
   nth1(I, M, R),
   nth1(J, R, E).
测试:


注意:我在看到@gusbro评论之前写了这篇文章,但这正是他建议的…

你应该从定义保存矩阵的结构开始(可以是简单的列表或更复杂的东西),然后检查每个I,j的M[I][j]=M[j][I]。@gusbro:你从哪里读到的这篇文章知道这一点?我什么也看不见。他说他需要检查“Z是否是一个关于主对角线对称的矩阵(正方形)”。回答很好,使用CLP(FD)
:-使用模块(库(clpfd))。
transpose/2是从列表中自动加载的吗?然后最近它变了……没有
:-[library(clpfd)]我就不能上班。
@chac:ah,我明白了。是的,你是对的,但是它使用了
must\u be/2
不需要这样做!你的版本只是测试。尝试
synmetrical([[A,B],[C,D]])。
应该给出
A=D,B=C
?- symmetrical([[a,b],[b,a]]).
true.

?- symmetrical([[a,b],[a,b]]).
false.