【问题标题】:Unique elements in matrix矩阵中的唯一元素
【发布时间】:2015-11-22 23:12:59
【问题描述】:

我有一个矩阵,其中每个元素都应该是唯一的。老实说,每个元素都可以在 [1, 19] 中取一个整数值,但我对使用 length(List, 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. 我有原子,因为我不知道如何约束变量 在 [1, 19] 中,所以我现在正在尝试让它与原子一起工作!
  2. 我希望我的代码测试矩阵是否包含唯一元素,即 在矩阵中找到的每个元素,都没有重复的元素 矩阵。
  3. 到目前为止,我只有应该有帮助的谓词,仅此而已,因为 我被困住了。

可能的查询:diff_matrix([[1,2,3],[4,5,6],[7,8,9]]).

【问题讨论】:

  • 您说元素可以采用119 范围内的值。但是您的 matrix 事实将原子 ag 作为值。原子不是变量,你能解释一下吗?你想让你的代码做什么?如果给定矩阵具有所有唯一元素,它应该是真的吗?这不清楚。
  • @lurker 我在这里测试swish.swi-prolog.org,现在我关闭了它,所以我的所有查询都消失了(它似乎不记得它们)。我希望做的是创建一个查询,要求 Prolog 检查矩阵是否具有唯一元素。是的,没错。我只有带有原子的矩阵,因为我的最终目标是拥有一个带有变量的矩阵,这些变量将受到约束..
  • 您可以删除事实matrix([[a,b,c],[d,e,f],[g,h,i]]).。它没有任何目的。我假设您只想打电话给diff_matrix([[1,2,3],[4,5,6],[7,8,9]]).,并且您希望它返回“true”。
  • 作弊:?- matrix(M),flatten(M,F),sort(F,S),length(F,L),length(S,L).
  • @gsamaras: 有点不灵活,基于特定行为(排序/2 删除重复项),因此您无法控制对每个元素执行的测试。

标签: list matrix prolog


【解决方案1】:

一种非常紧凑但可能效率低下的基于索引的方法

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 之间的关系。

forall(Cond,Action) 文档说明:

对于 Cond 的所有替代绑定,可以证明 Action。

所以我们可以将 diff_matrix/1 读取为

对于所有元素 X(比方说,M[I,J])和 Y (M[U,V]) I=U 和 J=V 或 X \= Y(不统一)

【讨论】:

  • 用法:?- diff_matrix([[1,2],[3,4]]).
猜你喜欢
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多