【发布时间】: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, 19] 中,所以我现在正在尝试让它与原子一起工作!
- 我希望我的代码测试矩阵是否包含唯一元素,即 在矩阵中找到的每个元素,都没有重复的元素 矩阵。
- 到目前为止,我只有应该有帮助的谓词,仅此而已,因为 我被困住了。
可能的查询:diff_matrix([[1,2,3],[4,5,6],[7,8,9]]).
【问题讨论】:
-
您说元素可以采用
1到19范围内的值。但是您的matrix事实将原子a到g作为值。原子不是变量,你能解释一下吗?你想让你的代码做什么?如果给定矩阵具有所有唯一元素,它应该是真的吗?这不清楚。 -
@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 删除重复项),因此您无法控制对每个元素执行的测试。