List 矩阵中的唯一元素
我有一个矩阵,每个元素都应该是唯一的。老实说,在[1,19]中,每个元素都可以取一个整数值,但我在处理列表时混淆了长度为List 矩阵中的唯一元素,list,matrix,prolog,List,Matrix,Prolog,我有一个矩阵,每个元素都应该是唯一的。老实说,在[1,19]中,每个元素都可以取一个整数值,但我在处理列表时混淆了长度为的变量(列表,3),所以现在我有以下内容: matrix([[a,b,c],[d,e,f],[g,h,i]]). row(M, N, Row) :- nth1(N, M, Row). column(M, N, Col) :- transpose(M, MT), row(MT, N, Col). get_row(N, Row) :- matr
的变量(列表,3)
,所以现在我有以下内容:
matrix([[a,b,c],[d,e,f],[g,h,i]]).
row(M, N, Row) :-
nth1(N, M, Row).
column(M, N, Col) :-
transpose(M, MT),
row(MT, N, Col).
get_row(N, Row) :-
matrix(M),
row(M, N, Row).
diff_matrix(M) :-
matrix(M),
foo(M).
foo([]).
foo([H|T]) :-
length(H, Len),
write(Len),
foo(T).
different_from([], _).
different_from([H|T], E) :-
E \= H,
different_from(T, E).
你有没有想法继续写这段代码,或者其他方法?我的意思是,如果我的尝试不够好,我没有问题更换它
编辑:
一个可能的查询:
diff_矩阵([1,2,3],[4,5,6],[7,8,9])。
一种基于索引的非常紧凑、可能效率低下的方法
rc(M,R,C,E) :- nth1(R,M,Row),nth1(C,Row,E).
diff_matrix(M) :-
forall((rc(M,I,J,X),rc(M,U,V,Y)), ((I\=U;J\=V)->X\=Y;true)).
编辑
rc/4是矩阵M、行索引R(基于1)、列索引C和元素E之间的关系
(条件、行动)文件规定:
对于Cond的所有可选绑定,都可以证明操作
所以我们可以把diff_矩阵/1读作
对于所有元素X(比如M[I,J])和Y(M[U,V]),I=U和J=V或X\=Y(不统一)您说过元素可以取值范围为
1
到19
。但是你的矩阵
事实将原子a
通过g
作为值。原子不是变量,你能解释吗?你希望你的代码做什么?如果一个给定的矩阵有所有唯一的元素,这应该是真的吗?这不清楚。@Lowerer我在这里测试,现在我关闭了它,所以我所有的查询都消失了(它似乎不记得它们)。我希望做的是创建一个查询,让Prolog检查矩阵是否有唯一的元素。是的,没错。我只有带原子的矩阵,因为我的最终目标是有一个带变量的矩阵,这些变量将受到约束。你可以删除事实矩阵([[a,b,c],[d,e,f],[g,h,I]])。
。这没有用。我假设你只想调用,例如,diff_矩阵([1,2,3],[4,5,6],[7,8,9])。
并且你希望它返回“true”。作弊:?-矩阵(M),展平(M,F),排序(F,S),长度(F,L),长度(S,L)。
@gsamaras:基于特定的行为(排序/2个删除的重复项)是非常不灵活的,因此,您无法控制对每个元素执行的测试。用法:?-diff_矩阵([1,2],[3,4]])。