List 矩阵中的唯一元素

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

我有一个矩阵,每个元素都应该是唯一的。老实说,在[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) :-
    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).
你有没有想法继续写这段代码,或者其他方法?我的意思是,如果我的尝试不够好,我没有问题更换它


编辑:

  • 我有原子,因为我不知道如何约束变量 在[1,19]里面,所以我现在正试图让它与原子一起工作
  • 我想让我的代码测试矩阵是否包含唯一的元素,例如 在矩阵中找到的每个元素中都没有重复的元素 矩阵
  • 到目前为止,我只有一些谓词应该有所帮助,仅此而已,因为 我被卡住了

  • 一个可能的查询:
    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]])。